Hiko.Blog Excel VBA活用術

「Excel VBAで仕事を効率化!初心者でもできる自動化のコツ」

MENU

改修版:コメントアウト対応・Accessデータ抽出マクロ

🧑‍🏫 ケンタと先生のVBA教室:Access接続編
👦ケンタ: 先生!今回のコード、こないだの「Oracle」のやつとそっくりやん!使い回し?
🤠先生: 目のつけどころがシャープやね、ケンタ!そう、流れはほとんど一緒や。でも今回は行く大倉庫が「Oracle」じゃなくて、Microsoft生まれの「Access(アクセス)大倉庫」に変わったんや。
👦ケンタ: 倉庫が変わったら、何が変わるの?
🤠先生: まず、最初の方にある倉庫の場所の指定の仕方が変わる。
dbPath = "C:\path\to\your\database.accdb"
🤠先生: Oracleのときはインターネットの先にある巨大サーバーに繋いだけど、Accessは自分のパソコンの中(Cドライブとか)にある「.accdb」っていう名前のファイルを直接ガチャッと開けに行くんや。
👦ケンタ: なるほど、自分のパソコンの中にある倉庫なんやね。
🤠先生: そういうこと。で、今回もテキストボックスの命令書を読み込んで「お掃除ロボット」がメモ書きを消してくれるんやけど、注目は3つ目の「自動翻訳(置換)」の内容や!
strSQL = Replace(strSQL, "*", "%")
👦ケンタ: あ!「*」を「%」に変えてる!これ、前回のOracleのときと逆じゃない?
🤠先生: よく見てるなぁ!実はな、ExcelやAccessの画面で普通に「あいまい検索(〜を含むデータ)」をするときは「*」を使うやろ?
👦ケンタ: うん、「ケンタ」って書いたら、ケンタを含む文字を探せるやつ!
🤠先生: せやねん。でも、VBAのプログラム(ADO)を使ってAccess倉庫に命令するときは、なぜか「*」じゃなくて「%」っていう別のマークに変えんと、倉庫の人が「えっ、何これ?」ってフリーズしてしまうんや。さらに、1文字検索の「?」も「_」に翻訳してあげる必要がある。
👦ケンタ: えー!Accessの倉庫なのに、プログラムから話しかけるときは別の言葉(%や_)じゃないと通じへんの?めんどくさ!
🤠先生: ははは、ほんまそれな。だからこのプログラムが、テキストボックスに人間が書いた「*」や「?」を、倉庫の人が理解できる「%」や「_」に自動でコッソリ翻訳してくれてるわけや。
👦ケンタ: なるほど!人間が普通に書いた命令を、プログラムが裏でAccess専用に翻訳してくれてるんやね。
🤠先生: その通り!翻訳された命令を渡せば、あとは前回と同じ。データをドババババーッ!とExcelシートに敷き詰めて、マスの幅もピッタリ(AutoFit)にして終了や!
 

 

Sub GetAccessData_Pro_Version()
    Dim conn As Object, rs As Object
    Dim strSQL As String, rawSQL As String
    Dim dbPath As String, ws As Worksheet
    Dim lines() As String, i As Long, cleanSQL As String

    ' --- 設定エリア ---
    Set ws = ThisWorkbook.Sheets("Sheet1")
    dbPath = "C:\path\to\your\database.accdb" ' ★実際のパスに変更
    ' ------------------

    ' 1. テキストボックスからSQLを読み込む
    On Error Resume Next
    rawSQL = ws.Shapes("テキスト ボックス 1").TextFrame2.TextRange.Characters.Text
    On Error GoTo 0

    If Trim(rawSQL) = "" Then
        MsgBox "テキストボックスにSQLを入力してください。", vbExclamation
        Exit Sub
    End If

    ' 2. 【お掃除機能】コメント行(--)の除去と整形
    lines = Split(rawSQL, vbCr) ' 改行で分割
    cleanSQL = ""
    For i = 0 To UBound(lines)
        Dim currentLine As String
        currentLine = Replace(lines(i), vbLf, "") ' 残った改行コードを除去
        
        ' 「--」があれば、それ以降をカット
        If InStr(currentLine, "--") > 0 Then
            currentLine = Left(currentLine, InStr(currentLine, "--") - 1)
        End If
        
        ' 空行でなければ連結(前後にスペースをいれて結合ミスを防ぐ)
        If Trim(currentLine) <> "" Then
            cleanSQL = cleanSQL & " " & currentLine
        End If
    Next i

    ' 3. 【自動変換】Access記号をVBA(ADO)用に変換
    strSQL = cleanSQL
    strSQL = Replace(strSQL, "*", "%")   ' あいまい検索
    strSQL = Replace(strSQL, "*", "%")
    strSQL = Replace(strSQL, "?", "_")   ' 1文字検索
    strSQL = Replace(strSQL, "?", "_")

    ' 4. ADO接続と実行
    Set conn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    
    On Error Resume Next
    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath & ";"
    
    If Err.Number <> 0 Then
        MsgBox "DB接続エラー: " & Err.Description, vbCritical
        Exit Sub
    End If

    rs.Open strSQL, conn, 3, 1
    
    If Err.Number <> 0 Then
        MsgBox "SQL実行エラーです。構文や項目名を確認してください。" & vbCrLf & _
               "内容: " & Err.Description, vbCritical
        GoTo CleanUp
    End If
    On Error GoTo 0

    ' 5. 書き出し処理
    Application.ScreenUpdating = False
    ws.Cells.Clear
    
    ' 見出し書き出し
    For i = 0 To rs.Fields.Count - 1
        ws.Cells(1, i + 1).Value = rs.Fields(i).Name
    Next i

    ' データ流し込み
    If Not rs.EOF Then
        ws.Cells(2, 1).CopyFromRecordset rs
        ws.Columns.AutoFit
    Else
        MsgBox "条件に一致するデータは見つかりませんでした。", vbInformation
    End If

CleanUp:
    If rs.State <> 0 Then rs.Close
    conn.Close
    Set rs = Nothing: Set conn = Nothing
    Application.ScreenUpdating = True
End Sub