質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

2441閲覧

VBAテキストテンプレートを読み込み、変数を代入し、テキスト出力するマクロを作成したい

chanrina0920

総合スコア18

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2017/10/20 09:25

###前提・実現したいこと
・SQLの記載されたテキストテンプレート
※変数部分を{XXX}みたいにし記載している
・設定シート
※テーブル名、カラム名、固定値が記載されている

①SQLテンプレートを読み込む
②SQLテンプレートの変数部分を取得する処理を行う
③取得した変数をSQLテンプレートに反映しテキストファイルに出力する
の処理をしたいのですが、どこから手を着けたらいいかさっぱりです。

まず上記処理はVBAでは可能な処理でしょうか。
(テキストテンプレートを読み込んでその中に埋まれた変数を取得し、代入し、出力し直すという処理)
その上でヒントとなるサンプルコードや考え方を教授いただきたいです。

例)
SQLテンプレート.txt

SELECT{tableName}
FROM {columnName}
WHERE client_cd = {SHINKI};

テーブル名シート
・顧客テーブル

カラム名シート
・顧客名

固定値シート
新規顧客コード値
・650

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

テキストファイルの読み込み

テキスト内容を読み込んで文字列変数に取り込む方法は、webで調べればいろいろ出てくると思います。

今回の場合、例えば下記サイトの「データを一気に読み込む」のあたりが参考になるかと思います。
⇒参考

キーワードの置換

文字列の中に存在する特定のキーワードを他の文字列に置き換える場合Replace関数を使用します。
⇒参考

例えば

Dim strSQL As String strSQL = "SELECT * FROM {tableName};" '{tableName}をTBL_Aに置き換える strSQL = Replace(strSQL,"{tableName}","TBL_A")

のように記述することで、変数strSQLの内容は"SELECT * FROM TBL_A;"に変わります。


今回はご自身で作成されたコードの提示がないため、具体的なサンプルコードの提供は控えさせていただきました。
参考サイトの紹介と簡単なサンプル提供のみとさせていただきましたが、これで方向性をつかんでいただければと思います。

参考になれば幸いです。

(追記)

'メイン処理 Private Sub Main() Const F_PATH = "c:\temp\testFormat.txt" Dim shtTags As Worksheet Set shtTags = Sheets("固定値シート") Dim strSQL As String '①テンプレート取得 strSQL = GetTemplate(F_PATH) '②タグ置換 strSQL = ReplaceTag(strSQL, "INSTANCENAME", shtTags.Cells(1, "B").Value) strSQL = ReplaceTag(strSQL, "PACKAGENAME", shtTags.Cells(2, "B").Value) 'strSQL = ReplaceTag(strSQL, "tableName", "TBL_A") '③作成したSQLをテキスト保存(未実装) Call SaveTemplate(F_PATH, strSQL) End Sub '①テンプレート取得 Private Function GetTemplate(ByVal vsFilename As String) As String Dim f_num As Integer ' ファイル番号 Dim rcd As String ' テキストファイルの1行分文字列(1レコード) Dim strRet As String f_num = FreeFile Open vsFilename For Input As f_num Do Until EOF(f_num) Line Input #f_num, rcd strRet = strRet + vbCrLf & rcd 'Debug.Print rcd Loop 'Debug.Print strSQL Close f_num '取得した内容を戻り値として返す GetTemplate = strRet End Function '①テンプレート取得(一気に読むバージョン) Private Function GetTemplate2(ByVal vsFilename As String) As String Dim fso As Object Dim strRet As String Set fso = CreateObject("Scripting.FileSystemObject") With fso.GetFile(vsFilename).OpenAsTextStream strRet = .ReadAll .Close End With GetTemplate2 = strRet End Function '②タグ文字列置換 Private Function ReplaceTag(ByVal vsBASE As String, ByVal vsTAG As String, ByVal vsVALUE As String) As String Dim strRet As String 'タグを置換する strRet = Replace(vsBASE, "{" & vsTAG & "}", vsVALUE) '置換した内容を戻り値として返す ReplaceTag = strRet End Function '③ファイル保存(未実装) Private Sub SaveTemplate(ByVal vsFilename As String, vsText As String) MsgBox vsText End Sub

投稿2017/10/20 13:15

編集2017/10/23 08:56
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chanrina0920

2017/10/23 03:34

回答ありがとうございます。キーワードの置き換えの部分で追加質問してもよろしいでしょうか。strSQL = "SELECT * FROM {tableName};"でSQLのフォーマットを定義されていますが、今回とても長いSQLなので提示いただいたような記載をすると大変長いソースになると思いましたし、SQLフォーマットの変更にも柔軟に対応できないと思いました。置き換えについてはこの記述しかないのでしょうか。
jawa

2017/10/23 04:13 編集

置換部分のサンプルコードではstrSQL変数の中身を固定文字列で指定していますが、実際にはSQLの内容はSQLテンプレート.txtから取得したいのですよね。 この「テキストファイルの読み込み」の部分は、1つめの参考サイトを参照していただけると実現できると思います。 流れとしては ①テキストファイルの内容(SQL文)をstrSQL変数に取得する。 ②strSQL変数のタグ付き文字列を置換する ③すべてのタグを置換すれば目的のSQL文が完成する というイメージになりますが、どうでしょうか?
chanrina0920

2017/10/23 07:54

ありがとうございます。記載頂いた流れがイメージしていたものです。実際に一部SQLフォーマットを用いてVBAソースを組んでみました。全体SQLのほんの一部ですが、想定の結果が得られたので、この調子で他部分についても作成していきます。 ※後で使用できるようにメモ書きが多いです。 Sub createSql() '--------------------------------------- 'サンプル①フォーマット読込処理 '--------------------------------------- '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 '--------------------------------------- 'サンプル②固定値部分の置き換え処理(http://www.moug.net/tech/exvba/0050117.html) '--------------------------------------- '{INSTANCENAME}を固定値シートの値に置き換える strSQL = Replace(strSQL, "{INSTANCENAME}", Range("固定値シート!B1").Value) '{PACKAGENAME}を固定値シートの値に置き換える strSQL = Replace(strSQL, "{PACKAGENAME}", Range("固定値シート!B2").Value) '{tableName}をTBL_Aに置き換える 'strSQL = Replace(strSQL, "{tableName}", "TBL_A") Debug.Print strSQL End Sub
jawa

2017/10/23 08:57

方向性が見えたようで何よりです。 サンプルコードも拝見しましたが、大丈夫そうですね。 せっかくコード提示いただきましたので、すこし処理をまとめたものを本文に追記させていただきました。 ※扱いやすいよう機能毎に関数化しただけなので、基本動作は変わらないと思います(^-^; ファイル出力の部分についてはまだ触れていませんでしたが、ここまでできていればそう難しくないと思います。 頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問