質問: ### 前提・実現したいこと エクセルにテーブル名一覧の記載があるシートとカラム一覧の記載があるシートがあります。 カラム一覧のシートには対応するテーブルも記載があり、そのカラムがどのテーブルに属するものか 確認ができます。 【例】 *テーブル一覧記載シート |テーブル名| |顧客テーブル| |顧客管理テーブル| ・・・ ・ *カラム一覧記載シート |テーブル名|カラム名| |顧客テーブル|顧客名| |顧客テーブル|顧客年齢| |顧客管理テーブル|顧客名| |顧客管理テーブル|顧客ID| |顧客管理テーブル|顧客住所| ・・・ ・ VBAマクロを利用してシートに記載のあるテーブルよりカラムを選択するSQLをループで回して 作成したいと思います。 上の例を元に作成したいイメージは SELECT 顧客名,顧客年齢 FROM 顧客管理テーブル で、カラム名が指定するテーブル名のものでなくなったら次のループで SELECT 顧客名,顧客ID,顧客住所 FROM 顧客管理テーブル という風に次のSELECT文を作成するようにしたいです。 ### 発生している問題・エラーメッセージ 作りたいイメージはあるのですが、どこから手を着けていいのかまったくわかりません。 ### 該当のソースコード 特にループを回す部分で次のSQLの作成にどう切り替えればいいのかが不明です。 ### 補足 やりたい処理の流れ 1テーブル名とカラム名を定義 2テーブルシートの一番最初のテーブル名を見に行き テーブル名にsetする 3カラムシートの一番最初のカラムを見に行き、テーブル名が2でセットしたものと同じであれば カラム名にsetする 4テーブル名が2と一致しなくなるまで繰り返し、カラム名は,でつなげる 5カラム名の一致をしなくなったら、ループを抜け、sqlを作成する 繰り返し
回答: baseballyama様がコレクション使用での回答でしたので、配列使用で作成してみました。 お役に立てば幸いです。 一覧記載シートはどちらも2行目からのデータ始まりです。 ``` Public Sub CreateSql() '1.テーブル一覧記載シート(A) Dim sheetA As Worksheet Dim endRowA As Long Set sheetA = ThisWorkbook.Worksheets("テーブル一覧記載シート") endRowA = sheetA.Cells(Rows.count, 1).End(xlUp).Row '最終行取得 Dim tableNamesA() As String 'テーブル名格納用配列 Dim n As Long Dim i As Long ReDim tableNamesA(endRowA - 2) '配列初期化(要素は0始まり、ヘッダー行含めずでデータ数=>最終行-2) n = 0 For i = 2 To endRowA tableNamesA(n) = sheetA.Cells(i, 1).Value 'テーブル名を配列に格納 n = n + 1 Next '2.カラム一覧記載シート(B) Dim sheetB As Worksheet Dim endRowB As Long Set sheetB = ThisWorkbook.Worksheets("カラム一覧記載シート") endRowB = sheetB.Cells(Rows.count, 1).End(xlUp).Row '最終行取得 Dim tableNamesB() As String 'テーブル名格納用配列 Dim columnNamesB() As String 'カラム名格納用配列 ReDim tableNamesB(endRowB - 2) '配列初期化(要素は0始まり、ヘッダー行含めずでデータ数=>最終行-2 ReDim columnNamesB(endRowB - 2) '同上 n = 0 For i = 2 To endRowB tableNamesB(n) = sheetB.Cells(i, 1).Value 'テーブル名を配列に格納 columnNamesB(n) = sheetB.Cells(i, 2).Value 'カラム名を配列に格納 n = n + 1 Next '3.テーブル名でマッチング、カラム名取得、Sql作成 Dim foundNames() As String '取得カラム名格納用配列 Dim j As Long Dim k As Long Dim query As String For j = LBound(tableNamesA) To UBound(tableNamesA) 'テーブル一覧記載シートの取得データ数分ループ query = "SELECT " 'Sql文字列初期化 n = 0 For k = LBound(tableNamesB) To UBound(tableNamesB) 'カラム一覧記載シートの取得データ数分ループ If tableNamesA(j) = tableNamesB(k) Then 'テーブル名が一致したらカラム名を格納 ReDim Preserve foundNames(n) foundNames(n) = columnNamesB(k) n = n + 1 End If Next query = query & Join(foundNames, ",") & " FROM " & tableNamesA(j) & ";" 'Sql文字列作成 Debug.Print query ReDim foundNames(0) '次のループのために取得カラム名格納用配列を初期化 Next End Sub ```