JavaプログラマのVBA覚書き
戻る
目次 動作環境
  • Windows XP Professional Edition SP3
  • Microsoft Office 2003
デバッグ中に変数の内容を参照したい

デバッグ中に変数の内容を参照するには変数名にカーソルをあわせます。

また、イミディエイトウィンドウで「?変数名」と入力しEnterキーを押下します。

(abcという変数なら?abc)<また、ソースコード中に以下のようなソースを入力することでイミディエイトウィンドウに出力することができます。

以下サンプルではabcという変数の内容をイミディエイトウィンドウに出力しています。

変数の内容を確認 Debug.Print abc
ファイルを複写したい

以下のサンプルでは「C:\複写元.txt」を「C:\複写先.txt」という名称で複写しています。

ファイルを複写する Public Sub ファイルの複写() FileCopy "C:\複写元.txt", "C:\複写先.txt" End Sub
Excel2003 ファイルを開いた時、そのファイルのあるフォルダを取得したい

以下のサンプルでは開いたAccessのファイルが存在するフォルダ名を取得しています。

ファイルのあるフォルダ Public Function getCurrentFolder() As String Dim sPath As String Dim i As Integer sPath = CurrentDb.Name For i = Len(sPath) To 1 Step -1 If Mid(sPath, i, 1) = "\" Then getCurrentFolder = Left(sPath, i - 1) Exit For End If Next i End Function
Access2003 から既存の Excel2003 のファイルを操作したい

以下のサンプルでは開いたAccessのファイルと同一フォルダにある「vba.xls」というファイルの1番目のシートのB2セルの値を読み込んでいます。(上記のFunctionを使用しています。)

Access2003 から Excel2003 を操作 Public Sub 既存のエクセルファイルを読む() MsgBox readExcelCell("\" & "vba.xls", 1, 2, 2) End Sub Public Function readExcelCell( _ ByVal sBookPath As String _ , ByVal iSheetNo As Integer _ , ByVal iRowNo As Integer _ , ByVal iCellNo As Integer _ ) As Variant On Error GoTo catch_ Dim oApp As Object Dim sPath As String Dim i As Integer Set oApp = CreateObject("Excel.Application") sPath = sBookPath If Left(sBookPath, 1) = "\" Then sPath = getCurrentFolder() & sBookPath End If oApp.Workbooks.Open Filename:=sPath readExcelCell = oApp.ActiveWorkbook _ .Worksheets(iSheetNo).Cells(iRowNo, iCellNo) GoTo finally_ catch_: MsgBox "実行時エラー:" & Err.Number & " " _ & Err.Description, vbExclamation Resume finally_ finally_: If Not (oApp Is Nothing) Then oApp.Quit Set oApp = Nothing End If End Function
テーブルの内容を参照したい

Access内に以下のようなテーブルが存在したとします。このテーブルの内容を参照します。

personテーブル
id name address
1 太郎 東京都
2 花子 埼玉県
3 ゴン太 神奈川県
テーブルの内容を参照 Public Sub テーブルの内容を参照したい() On Error GoTo catch_ Dim oDB As DAO.Database: Set oDB = Nothing Dim oRS As DAO.Recordset: Set oRS = Nothing Set oDB = CurrentDb() Set oRS = oDB.OpenRecordset("person") Do Until oRS.EOF Debug.Print oRS!id Debug.Print oRS!name Debug.Print oRS!address oRS.MoveNext Loop GoTo finally_ catch_: MsgBox "実行時エラー:" & Err.Number & " " _ & Err.Description, vbExclamation Resume finally_ finally_: If Not (oRS Is Nothing) Then oRS.Close: Set oRS = Nothing End If If Not (oDB Is Nothing) Then oDB.Close: Set oDB = Nothing End If End Sub

「Set oDB」としている行があります。他のAccessファイルを開くとき、ExcelからAccessファイルを開くときには以下のコードを利用します。

以下のサンプルでは「C:\vba.mdb」というファイルを開いています。

注・Excelから利用の際は [ツール] -> [参照設定] で 「Microsoft DAO X.X Object Library」を参照可能にして下さい。

Set DB = DBEngine.Workspaces(0).OpenDatabase("C:\vba.mdb")

検索条件を指定したい場合はレコードセットのfilterを使用します。以下のサンプルでは「name」が「太郎」のレコードを指定しています。

Set oRS = oDB.OpenRecordset("person") oRS.filter = "name=""太郎"""

そもそもSQLで指定したい場合は以下のように行います。

Set oRS = oDB.OpenRecordset("SELECT * FROM person")
Variantに格納されている値が何型か判断したい

Variant型の変数には実際に何型の変数が格納されているのでしょうか。

VarType(調べたい変数名)
戻り値が以下のように返ってきます。
定数 内容
0 vbEmpty Empty値
1 vbNull Null値
2 vbInteger 整数型
3 vbLong 長整数型
4 vbSingle 単精度浮動小数点数型
5 vbDouble 倍精度浮動小数点数型
6 vbCurrency 通貨型
7 vbDate 日付型
8 vbString 文字列型
9 vbObject オブジェクト
10 vbError エラー値
11 vbBoolean ブール型
8192 vbArray 配列

整数型の配列が格納されているなら8194(=2+8192)が返るということになります。ユーザ定義型はVariant型に設定できません。

Object変数に格納されている値が何型か判断したい

Object変数には実際に何型の変数が格納されているのでしょうか。

シートの中の値を検索したい

特定の値を検索するにはFindが便利です。

シートの中の値を検索する例 Set outputBook = ??? Set obj = outputBook.Worksheets(idxSheet).Cells.Find(placeHolder) Do While Not obj Is Nothing 実際の処理を記述 Set obj = outputBook.Worksheets(idxSheet).Cells.FindNext(obj) ' 次を検索 Loop
値をクリア

通常のセルや結合セルによってクリア方法が異なります。

値をクリアする例 If XXX.MergeCells Then XXX.MergeArea.ClearContents ' 結合セルの場合 Else XXX.ClearContents ' 通常セルの場合 End If
数式かどうか判定したい

特定のセルが数式かどうか判定できます。

数式かどうか判定する例 If XXX.HasFormula Then 数式の時の処理 End If
グループ化されているオートシェイプの名称

グループ化されているテキストボックスの名称を取得します。

グループ化されているオートシェイプの名称を取得する例 For Each shp In ActiveSheet.Shapes If shp.Type = msoGroup Then For i = 1 To shp.GroupItems.Count With shp.GroupItems(i) If .Type = msoTextBox Then Debug.Print .name End If End With Next End If Next
テキストボックス(オートシェイプ)に値を設定
テキストボックスに値を設定する例 ActiveSheet.Shapes("テキスト ボックス 1").TextFrame.Characters.Text = "aaa"
ワークブックに含まれるチャートのデータ範囲を取得
データ範囲を取得する例 Dim c As Chart Dim ws As Worksheet Dim s As Series For Each ws In ThisWorkbook.Worksheets Debug.Print vbCr Debug.Print ws.Name For Each co In ws.ChartObjects Set c = co.Chart For Each s In c.SeriesCollection Debug.Print s.Formula Next Next Next
ワークブックを保存しないで閉じる
保存しないで閉じる例 ThisWorkbook.Close SaveChanges:=False
あるセルがセル範囲に含まれるかどうか
セル範囲に含まれるか判定する例 Application.Intersect(Range("B6:D6"), Range("C3:C9")).Address Application.Intersect(Range("C6"), Range("C3:C9")).Address

含まれない場合はNothingが返却されます。