###前提・実現したいこと
こちらで何度か質問させていただき設定シートとテキストのSQLフォーマットを読み込み、SQLを大量作成する
マクロを作成しています。全部で100テーブル以上を対象にSQL作成をするのですが、出力されたSQLがすべて最初の1テーブル分となっており、それぞれのテーブル毎のSQLが出力されるようにしたいです。
###発生している問題・エラーメッセージ
テーブル一覧を元にループを回し、それぞれのSQLを作成したいのですが
一番最初に取得したテーブル情報のSQLが大量に作成されてしまいます。
strSQLの{変数}を処理の中で置き換えしているのですが
次のテーブルの値や、カラム値の置き換えができていないようです。
1回目のループで置き換えしてしまっているためでしょうか?
この場合、どのような対応をすればよいのでしょうか。
###該当のソースコード
一旦現状のソース全体を貼ります。
ループ2回目より{変数}の置き換えが空振りしている気がします。
Option Explicit
' 定数宣言
Const テーブル名シート名 As String = "テーブル名"
Const カラム名シート名 As String = "カラム名"
Const 固定値シート名 As String = "固定値"
Const テーブル名シート_テーブル列 As Long = 2
Const カラム名シート_テーブル列 As Long = 2
Const カラム名シート_カラム列 As Long = 6
Const カラム名シート_XXXXXXXX As Long = 11
Const IS_HEADER As Boolean = True
'IS_HEADERは、各シートの1行目がヘッダ情報である場合(=SQL文の生成が不要な場合)に True
'SQL文を生成
Public Sub CreateSql()
'変数宣言 Dim tableSheet As Worksheet Dim columnSheet As Worksheet Dim koteiSheet As Worksheet Dim rng As Range Dim r As Long Dim r2 As Long 'Dim r3 As Long Dim tableName As String Dim columnNames As Collection Dim difColumn As String Dim columnName As Variant 'Dim intNo As Integer 'Dim strFileName As String Dim countColumn As String Dim compareColumn As String
'---------------------------------------
'サンプル①フォーマット読込処理
'---------------------------------------
'Const F_PATH = "c:\temp\testFormat.txt"
'Dim f_num As Integer ' ファイル番号
'Dim rcd As String ' テキストファイルの1行分文字列(1レコード)
'Dim strSQL As String
'f_num = FreeFile
'Open F_PATH For Input As f_num
'Do Until EOF(f_num)
' Line Input #f_num, rcd
'Debug.Print rcd
'Loop
'Close f_num
'---------------------------------------
'サンプル①'フォーマット読込処理(http://www.tipsfound.com/vba/04001)
'---------------------------------------
Const F_PATH = "c:\temp\testFormat.txt"
Dim f_num As Integer ' ファイル番号
Dim rcd As String ' テキストファイルの1行分文字列(1レコード)
Dim strSQL As String
f_num = FreeFile
Open F_PATH For Input As f_num
Do Until EOF(f_num)
Line Input #f_num, rcd
strSQL = strSQL + vbCrLf & rcd
'Debug.Print rcd
Loop
'Debug.Print strSQL
Close f_num
'テーブル名シート と カラム名シートを取得
With ThisWorkbook
Set tableSheet = .Worksheets(テーブル名シート名)
Set columnSheet = .Worksheets(カラム名シート名)
Set koteiSheet = .Worksheets(固定値シート名)
End With
' 全テーブル走査 Set rng = tableSheet.Columns(テーブル名シート_テーブル列) For r = IIf(IS_HEADER, 3, 1) To rng.Cells(rng.Cells.Count).End(xlUp).Row ' テーブル名取得 tableName = tableSheet.Cells(r, テーブル名シート_テーブル列).Text strSQL = Replace(strSQL, "{tableName}", tableName) Debug.Print tableName
'---------------------------------------
'テーブル名(論理名)を取得する処理
'---------------------------------------
'【TODO】論理名取得の処理
'【TODO】{tableName_JP}をテーブル名シートより取得した論理名格納変数に置き換え
'---------------------------------------
'サンプル②固定値部分の置き換え処理(http://www.moug.net/tech/exvba/0050117.html)
'---------------------------------------
'①{INSTANCENAME}を固定値シートの値に置き換える
strSQL = Replace(strSQL, "{INSTANCENAME}", Range("B1").Value)
'②{PACKAGENAME}を固定値シートの値に置き換える
strSQL = Replace(strSQL, "{PACKAGENAME}", Range("B2").Value)
'③{DBLINK}を固定値シートの値に置き換える
strSQL = Replace(strSQL, "{DBLINKNAME}", Range("B3").Value)
'④{DATE}を実行日に置き換える
strSQL = Replace(strSQL, "{DATE}", Format(Date, "yyyymmdd"))
'⑤{NAME}を固定値シートの値に置き換える
strSQL = Replace(strSQL, "{NAME}", Range("B4").Value)
'⑥{PATH}を固定値シートの値に置き換える
strSQL = Replace(strSQL, "{PATH}", Range("B5").Value)
'{tableName}をTBL_Aに置き換える
'strSQL = Replace(strSQL, "{tableName}", "TBL_A")
Debug.Print strSQL
'---------------------------------------
'サンプル③カラム名シートよりカラム名取得処理
'---------------------------------------
' 全カラム取得
Set rng = columnSheet.Columns(カラム名シート_テーブル列)
Set columnNames = New Collection
For r2 = IIf(IS_HEADER, 3, 1) To rng.Cells(rng.Cells.Count).End(xlUp).Row
'XXXXXXX欄に"○"がついている場合【TODO】条件文を追加する
'If columnSheet.Cells(r3, カラム一覧シート_XXXXXXXXX目列).Text = "○" Then
'テーブル名が一致する場合
'コレクションに追加
If columnSheet.Cells(r2, カラム名シート_テーブル列).Text = tableName Then
columnNames.Add columnSheet.Cells(r2, カラム名シート_カラム列).Text
End If
Next
'初期化
compareColumn = ""
difColumn = ""
For Each columnName In columnNames
compareColumn = compareColumn & IIf(compareColumn = "", " ", ",") & CStr(columnName) '改行入れたい
Next
Debug.Print compareColumn
'⑥{columnName}をカラムシートの値に置き換える
strSQL = Replace(strSQL, "{columnName}", compareColumn)
Next
'---------------------------------------
'サンプル⑨SQL(ストアドプロシージャ)の出力処理
'---------------------------------------
Dim intNo As Integer
Dim strFileName As String
' ファイルの書き込み
strFileName = "C:\temp\sample.sql" '出力ファイル名を日付時間で一意にする
Debug.Print strSQL
intNo = FileSystem.FreeFile() ' フリーファイルNoを取得
'Open strFileName For Output As #intNo ' 上書きモードでファイルをオープン
Open strFileName For Append As #intNo ' 追加モードでファイルをオープン
'Print #intNo, "ABCDE"
'Print #intNo, "あいうえお"
Print #intNo, strSQL
Close #intNo ' ファイルをクローズ
End Sub
###試したこと
ループ箇所変えたりしてみましたが、初期化みたいなことができないか模索してます。。。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/31 03:32