メニュー > その他 > JavaプログラマのVBA覚書き

JavaプログラマのVBA覚書き

(2012/01/03)

弊社では簡単ではありますがVBAを用いたアプリケーションを作成しています。
そこで簡単ではありますが逆引き辞典になるような覚書きページを作成しました。
弊社はJavaでの開発を得意としており「Javaならこうできるのに」ということをメインに記述したいと思っています。

動作環境

 このページでは以下の環境で動作確認をしています。
 Windows XP Professional Edition SP3
 Microsoft Office 2003


索引

  • デバッグ中に変数の内容を参照したい
  • ファイルを複写したい
  • Excel2003 ファイルを開いた時、そのファイルのあるフォルダを取得したい
  • Access2003 ファイルを開いた時、そのファイルのあるフォルダを取得したい
  • Access2003 から既存の Excel2003 のファイルを操作したい
  • テーブルの内容を参照したい
  • Variantに格納されている値が何型か判断したい
  • Object変数に格納されている値が何型か判断したい

  • デバッグ中に変数の内容を参照したい

     デバッグ中に変数の内容を参照するには変数名にカーソルをあわせます。
     またイミディエイトウィンドウで「?変数名」と入力しEnterキーを押下します。(abcという変数なら?abc)
     またソースコード中に以下のようなソースを入力することでイミディエイトウィンドウに出力することができます。
     以下サンプルではabcという変数の内容をイミディエイトウィンドウに出力しています。
    Debug.Print abc
    


    ファイルを複写したい

     以下のサンプルでは「C:\複写元.txt」を「C:\複写先.txt」という名称で複写しています。
    Public Sub ファイルの複写()
        FileCopy "C:\複写元.txt", "C:\複写先.txt"
    End Sub
    


    Excel2003 ファイルを開いた時、そのファイルのあるフォルダを取得したい

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


    Access2003 ファイルを開いた時、そのファイルのあるフォルダを取得したい

     以下のサンプルでは開いた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を使用しています。)
    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(調べたい変数名)
    

    戻り値が以下のように返ってきます。
    定数 内容
    vbEmpty 0 Empty値
    vbNull 1 Null値
    vbInteger 2 整数型
    vbLong 3 長整数型
    vbSingle 4 単精度浮動小数点数型
    vbDouble 5 倍精度浮動小数点数型
    vbCurrency 6 通貨型
    vbDate 7 日付型
    vbString 8 文字列型
    vbObject 9 オブジェクト
    vbError 10 エラー値
    vbBoolean 11 ブール型
    vbArray 8192 配列
    整数型の配列が格納されているなら8194(=2+8192)が返るということになります。
    ユーザ定義型はVariant型に設定できません。


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

     Object変数には実際に何型の変数が格納されているのでしょうか。
    TypeName(調べたい変数名)