Excel のワークシートSheet1とSheet2を比較し、Sheet1にのみ存在するデータを抜き出すSQLを紹介します。
<Sheet1>
<Sheet2>
① 「Microsoft Office 16.0 Access database engine Object Library」を参照設定します。
② 参照設定したことで、DAOを利用できます。Excel ブックを用意して、標準モジュールに DAO を利用した次のコードを記載します。
SELECT文では、Left Joinを使い、MINUS演算子と同じ結果を得ます!
Option Explicit
Public Sub Sample_SelectLeftJoin_DAO_01()
' DAO データベース設定用変数
Dim db As DAO.Database
' DAO レコードセット設定用変数
Dim rs As DAO.Recordset
' 単純なループカウンタ
Dim lp As Long
' 検索結果表示用文字列
Dim str As String
' "C:\Temp\ダミーデータ.xlsx"をデータベースとして開く。
Set db = DBEngine.Workspaces(0).OpenDatabase( _
"C:\Temp\ダミーデータ.xlsx" _
, False _
, False _
, "Excel 12.0;HDR=YES" _
)
' レコードセットを取得する。
Set rs = db.OpenRecordset( _
Name:=" SELECT a.ID, a.Name " _
& " FROM [Sheet1$] a " _
& " LEFT JOIN [Sheet2$] b ON a.ID = b.ID " _
& " WHERE b.ID IS NULL " _
, Type:=dbOpenDynaset _
)
' 列名を列挙する。
str = str & rs.Fields(0).Name
For lp = 2 To rs.Fields.Count
str = str & "," & rs.Fields(lp - 1).Name
Next lp
str = str & vbLf & "----------" & vbLf
' 対象レコードが1件以上存在するか調べる。
If rs.EOF Then
str = "(検索結果:0件)"
Else
' 検索できる全てのレコードを参照する。
Do Until (rs.EOF)
' 全ての検索結果をカンマ区切りで連結する。
str = str & rs.Fields(0)
For lp = 2 To rs.Fields.Count
str = str & "," & rs.Fields(lp - 1)
Next lp
str = str & vbLf
' 次のレコードに移る。
rs.MoveNext
Loop
End If
' カーソルを閉じる。
rs.Close
Set rs = Nothing
' データベースを閉じる。
db.Close
Set db = Nothing
' 検索結果を表示する。
MsgBox str, vbOKOnly
End Sub
③ Sample_SelectLeftJoin_DAO_01を実行します。
コメントを残す