0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

As Range, As Worksheetなどデータ型を添えて宣言すればプロパティ名を覚える必要がぐっと減るという話

Last updated at Posted at 2021-11-24

Dim 変数 As 変数型

初心者のうちはデータ型は覚えなくて良いと思っていましたが、最近少し考えが変わってきました。

オブジェクトは宣言すべきだと。

型宣言をするメリット

As Worksheet等、変数型つきで宣言した変数wsなどの後に.(ドット)を打つと
プロパティの候補リストが表示されます。
image.png

.(ドット)は助詞の**「の」**です。
上図の例だと

  • wbというブックwsというシートを巡回する
  • wsというシート名前というプロパティ

という意味になります。

型宣言なにそれおいしいの?という方に紹介したいメリットはまずはこの一言に尽きます。

Setの際や引数に入れ込む際に型違いエラーが検出できるなど他にもメリットはありますが、書く上で最初に得られる最大のメリットはこれです。

体系的にまとめるべきとも思いましたが、

Workbook
 └ Worksheet
   └ Range

突き詰めるとシンプルにこの構図に集約されてしまうのと、体系的にまとまった記事は他にもっといい記事があるので、端的によく使う事例を紹介しつつ、体感できるような列挙方式でまとめてみました。

例1:シート名変更とか複数シートのセル一括編集

Sub WbWs練習1_シート名変更とか複数シートのセル一括編集()
  Dim wb As Workbook
  Dim ws As Worksheet
  
  Set wb = ActiveWorkbook
  
  Dim k
  k = 1
  For Each ws In wb.Sheets
    With ws
      .Name = "Sh" & k
      .Cells(1, 1) = k
      k = k + 1
    End With
  Next
End Sub

早速ですが、上のコード書くにあたっては、wbwsのあとに.を打ってプロパティ名の頭文字を数文字打っていくとこんな感じで候補が出てきます。
image.png
image.png
image.png
候補の中からこれだというものをクリックで選ぶもよし、上下キーで選んでTabキーで決定するもよしです。

例2:Range練習1_範囲指定でよくやるやつ

セル範囲を指定するとき、僕がよくやるのが左上と右下の2セルを指定して、それをRangeにつっこむというやり方です。

image.png

Option Explicit

Type Rng_
  左上 As Range
  右下 As Range
  Area As Range
End Type
Dim Rng As Rng_

Sub Rng練習1_範囲指定でよくやるやつ()
  With Rng 
    Set .左上 = Cells(1, 2)
    Set .右下 = Cells(3, 4)
    Set .Area = Range(.左上, .右下)
    
    .左上.Interior.Color = vbYellow
    .右下.Interior.Color = vbGreen
        
    Dim k: k = 1
    Dim r As Range
    For Each r In .Area
      r.Value = k
      k = k + 1
    Next
  End With
  
End Sub

この例には他にも楽できる要素をいくつか詰め込んだので併せて紹介します。

色も覚えないでvbなんちゃらで出せます

image.png
image.png

Typeで構造化した子オブジェクトも候補リストで呼べます

Type Rng_
  左上 As Range
  右下 As Range
  Area As Range
End Type
Dim Rng As Rng_

こうしてまとめておくと「Rng」の中に
image.png
というグループが作れて可読性や書きやすさが上がります。

With構文内はどこでも.で候補リストが出せます

image.png

例3:Range練習2_起点セルから相対距離とか範囲拡張とか

型宣言から少し脱線しますがこれもよく使うのですおまけで紹介。

例えば表の左上に起点を置いておき、

  • .Resize(行の幅, 列の幅)
  • .Offset(行の相対距離, 列の相対距離)

で拡張や移動が簡単に書けます。

Sub Rng練習2_起点セルから相対距離とか範囲拡張とか()
  Dim Cel起点 As Range
  Dim CelOffset As Range
  Dim Area As Range
  
  Set Cel起点 = Cells(1, 1)
  With Cel起点
    .Value = 1
    
    '範囲拡張
    Set Area = .Resize(2, 3)
      With Area
        .ShrinkToFit = True
        .Value = 12345
      End With
    
    '相対距離
    Set CelOffset = .Offset(4, 5)
      With CelOffset
        .Interior.Color = vbYellow
        .Value = 54321
      End With
  End With
  
  
End Sub

オブジェクトではありませんが候補リストを使える例がまだまだあるのでまたまた列挙で失礼します。

VBA関数は何もないところでCtrl+Spaceを押すと候補が出るぞ

IsEmptyとかIsMissingとか、Isなんだっけと思い出せなくなる時がありますが、接頭語さえ類推すればVBE上で辞書が引けてしまいます。

image.png
image.png

As WorksheetFunctionもいいぞ

これは一度Setする必要がありますがコードが短く見えて若干すっきりします。

途中まで打ってCtrl+Spaceで予測変換させても十分といえば十分ですが、好き好きです。
image.png

Sub WSFもいいぞ()
  Dim WSF As WorksheetFunction
  Set WSF = WorksheetFunction
  
  With WSF
    Debug.Print .RoundDown("123.456", 1)
    Debug.Print .RoundUp("123.456", 2)
    
    Dim Area As Range
    Set Area = Selection.Cells
    Debug.Print .Sum(Area)
  End With
End Sub

同Project内の別モジュールも候補リストにできるぞ

モジュール名を指定すればPrivateでないSubFunctionが候補リストに出てきます。
image.png

モジュール名も候補リストに出しやすいようにbasといったお決まりの接頭語をつけておくといいかなと思います。
image.png

Sub Project内の別モジュールも候補リストにできるぞ()
  Debug.Print bas汎用関数.testFunction("aaa", "bbb")
End Sub

bas汎用関数
Option Explicit

Function testFunction(1, 2) As String
  testFunction = 1 & 2
End Function

以上です。
まとめるの難しい!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?