はじめに

この記事では
Excel Visual Basic for Application についてまとめた記事です。
ベストプラクティスや間違いがあれば
書き直していく予定です。


変数宣言

Dim ~ As 型名
宣言時にオブジェクト生成もしたい場合は
Dim ~ As New 型名


Workbook オブジェクト

これがないと始まらない!!

基本的な使い方としては
2 種類の言語構造を使い分けることが重要かと思います。

  • ActiveWorkBook
  • ThisWorkbook

特定のワークブックを指定する場合は
Workbooks の引数に開きたいファイル名を与えてあげるだけです。

Option Explicit

Private Const FileName As String = "ブック名.xlsx"

Sub main()

  Dim wb As Workbook
  Set wb = Workbooks(FileName)

End Sub

また、動的に Workbook を開きたい場合は
Workbooks.Open として書くと Excel ワークブックを開くことができます。

  Workbooks.open(開きたいファイル名/ファイル名を含むパス)

ファイル名しか指定しなかった場合は
デフォルトのカレントディレクトリを参照します。

特定のワークブックを開いていない場合は
エラーになってしまうので

実際に使うのであれば
エラー処理込みで作らないと実用的ではないので実際には

上記のコードにプラスしてエラー処理を書いておく

実際に使う場合 例 1

Option Explicit

Private Const FileName As String = "ブック名.xlsx"

Sub main()

  Dim wb As Workbook

  On Error Goto ErrExit
  Set wb = Workbooks.Open(Thisworkbook.path & "\" & FileName)

  Exit Sub

ErrExit:
  MsgBox Err.Description

End Sub

実際に使う場合 例 2

モット、精巧に Workbook オブジェクトを取得したいということであれば
ワークブックの事前チェックを入れるべきです。
上記のコードにプラスして指定のワークブックが開かれているかを確認する工程を入れましょう。

Option Explicit

Private Const FileName As String = "ブック名.xlsx"

Sub main()

  Dim wb           As Workbook

  On Error GoTo ErrExit

  ' ワークブックを全て調べる。
  For Each wb In Workbooks
    If wb.Name = FileName Then
      Exit For
    End If
  Next

  ' wb が開かれていないので開く
  If wb Is Nothing Then
    Set wb = Workbooks.Open(Thisworkbook.path & "\" & FileName)
  End If

  Exit Sub

ErrExit:
  MsgBox Err.Description

End Sub

実際に使う場合 例 3

ここまできたら

  • ワークブックを開くとリンク更新メッセージが出ることも想定して書く
  • ファイルパスの指定まで書く
  • ファイルの存在を確認した上で開く
  • オープンモードまで指定するところまで書く
'
' 参照設定
' Microsoft Scripting Runtime
'
Option Explicit

Private Const FileName As String = "ブック名.xlsx"

Sub main()

  Dim wb           As Workbook
  Dim fs             As New FileSystemObject

  Application.DisplayAlerts = False

  On Error GoTo ErrExit

  ' ワークブックを全て調べる。
  For Each wb In Workbooks
    If wb.Name = FileName Then
      Exit For
    End If
  Next

  ' ブック名がとれていない場合は指定のワークブックは開かれていない状態
  If wb Is Nothing Then

    If fs.FileExists(ThisWorkbook.Path & "\" & FileName) Then
      Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & FileName)
    End If

  End If
  Set fs = nothing
  Application.DisplayAlerts = True
  Exit Sub

ErrExit:
  MsgBox Err.Description
  Set fs = nothing
  Application.DisplayAlerts = True

End Sub

実際に使う場合 例 4

ChDir を使って開くパターンもありますが
カレントディレクトリの管理が面倒なので使いません。
(ここは人による??)

大量の処理を行う場合は画面更新を抑えることをオススメします。
自動化に必要なことを書くとノートの趣旨から外れるのでほどほどにしますが
ザックリ書くと 3 つ

・適切なエラーハンドリング
・無駄な処理の省略(画面更新など)
・想定されるメッセージ画面の処理(リンク更新、読み取り専用通知などなど)

'
' 参照設定
' Microsoft Scripting Runtime
'
Option Explicit

Private Const FileName As String = "ブック名.xlsx"

Sub main()

  Dim wb           As Workbook
  Dim fs           As FileSystemObject

  Application.DisplayAlerts = False
  Application.ScreenUpdating = False

  On Error GoTo ErrExit

  ' ワークブックを全て調べる。
  For Each wb In Workbooks
    If wb.Name = FileName Then
      Exit For
    End If
  Next

  ' ブック名がとれていない場合は指定のワークブックは開かれていない状態
  If wb Is Nothing Then

    If fs.FileExists(ThisWorkbook.Path & "\" & FileName) Then
      Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & FileName)
    End If

  End If

  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
  Exit Sub

ErrExit:
  MsgBox Err.Description
  Set fs = nothing
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True

End Sub

WorkSheet オブジェクト

ワークブックオブジェクトが操作できたら次はワークシート

基本的な使い方としては
3 種類の言語構造を使い分けることが重要かと思います。

  • ActiveSheet
  • WorkSheets
  • WorkSheet

ワークシートには This がありません。
なので

  • 保存状態に依存する ActiveSheet
  • シートのタイトルに依存する Worksheets
  • シート番号に依存する Worksheets

3 つをうまく扱う必要があります。
また、シート名を直接指定することでも WorkSheet を操作できます。

Option Explicit

Sub main()

  Dim ws As Worksheet
  ' Sheet1をワークシートオブジェクトwsに格納
  Set ws = Sheet1

End Sub

ActiveSheet

ザックリ言えば
ワークブックを開いた際に一番最初に開かれるシートです。

WorkSheets

実際に使う場合

先ほどのワークブックオブジェクトを扱う例に
ワークシートオブジェクトを扱う例を追加してみましょう。

'
' 参照設定
' Microsoft Scripting Runtime
'
Option Explicit

Private Const FileName As String = "ブック名.xlsx"

Sub main()

  Dim wb          As Workbook
  Dim fs           As FileSystemObject

  Application.DisplayAlerts = False
  Application.ScreenUpdating = False

  On Error GoTo ErrExit

  ' ワークブックを全て調べる。
  For Each wb In Workbooks
    If wb.Name = FileName Then
      Exit For
    End If
  Next

  ' ブック名がとれていない場合は指定のワークブックは開かれていない状態
  If wb Is Nothing Then

    If fs.FileExists(ThisWorkbook.Path & "\" & FileName) Then
      Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & FileName)
    End If

  End If

  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
  Exit Sub

ErrExit:
  MsgBox Err.Description
  Set fs = nothing
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True

End Sub