VBAでピボットテーブルのように2つのテーブルをIDフィールドで結合するにはどうすればいいか?PowerQueryを記述するM言語を使用するかテーブルをデータベースと見立てて操作するSQL言語を記述する必要があります。他にもテーブルをループしてIDを一致するところを検索する方法もありますが、いずれにしても面倒です。ということでChatGPTにSQLを使用した場合のサンプルコードを書かせてみました。
Sub JoinTables()
' 接続文字列を設定する
Dim conn As New ADODB.Connection
Dim connectionString As String
connectionString = "Provider=SQLOLEDB;Data Source=MY-SERVER-NAME;Initial Catalog=MY-DATABASE-NAME;User ID=MY-USER-ID;Password=MY-PASSWORD;"
conn.Open connectionString
' SQLクエリを実行する
Dim rs As New ADODB.Recordset
Dim strSQL As String
strSQL = "SELECT * FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID"
rs.Open strSQL, conn
' データを処理する
Do While Not rs.EOF
' ここに処理を追加する
rs.MoveNext
Loop
' リソースを解放する
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub
strSQLの文が分かっていれば、そこまで難しいコードではありませんが、データベースとしてEexcelのファイルを開かなければいけないところが少し面倒ですね。
さて、これがPythonのPandasというライブラリを使うとこうなります。
import pandas as pd
# Excelファイルを読み込む
df1 = pd.read_excel('file1.xlsx', sheet_name='Sheet1')
df2 = pd.read_excel('file2.xlsx', sheet_name='Sheet1')
# テーブルを結合する
result = pd.merge(df1, df2, on='ID')
# 結果をExcelファイルに書き出す
with pd.ExcelWriter('merged_file.xlsx') as writer:
result.to_excel(writer, sheet_name='Sheet1', index=False)
データの読み込みと書き出しを含めてこんなに簡単に出来てしまうんです。
これはほんの一例ですが、Excel VBAには様々な外部ライブラリもあります。その出来がPythonのライブラリと比べてどんな出来か、今後、調査してみるつもりです。