ExcelVBAのノート
はじめに
この記事では
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