添付画像①のように
列Cは「サイズ」列Dは「状態」
などの項目を作りそれぞれの行にデータを入力します。
そして画像②のようなテンプレ.txtを作ります。
そして何らかの方法で、多分エクセル、マクロ?で何とかすれば
③のようなCSVファイルを吐き出せるのでは無いかと思っています。
可能でしょうか?
もしエクセルで、できるのであればどうやればよいでしょうか。
また
①で入力した列Eの「販売価格」は③のCSVでは列Cに何も加工を加えずに
吐き出すようにしたいです。
今回質問させていただくためにシンプルになデータを作りましたが
項目はもっとたくさんあります。
今使用しているエクセルのバージョンは2003です。
以上どうかよろしくお願いします。
テンプレートファイルを使用して CSV データを作成するスクリプトを作成してみました。
事前に以下のパスを修正の上、実行願います。
' Excelデータファイルファイルを指定します Const g_strExcelFile = "C:\home\edu\hatena\orekojinn\1368499599\book1.xls" ' テンプレートファイルを指定します Const g_strTemplateFile = "C:\home\edu\hatena\orekojinn\1368499599\template.txt" ' 出力先のCSVファイル名を指定します Const g_strCsvFile = "C:\home\edu\hatena\orekojinn\1368499599\out.csv"
なお、Excel VBA ではなく、VBScript でのサンプルとなっております。
(少し修正すれば、VBA で動作させることも可能です。必要であれば修正します。)
実行するには、エクスプローラより「ExcelToCsv.vbs」をダブルクリックするか、コマンドライン(cmd.exe)より、「CScript ExcelToCsv.vbs [Enter]」を行ってください。
実行すると出力先の CSV ファイルが作成されます。
' File : ExcelToCsv.vbs ' Usage : CScript //Nologo ExcelToCsv.vbs Option Explicit ' Excelデータファイルファイルを指定します Const g_strExcelFile = "C:\home\edu\hatena\orekojinn\1368499599\book1.xls" ' テンプレートファイルを指定します Const g_strTemplateFile = "C:\home\edu\hatena\orekojinn\1368499599\template.txt" ' 出力先のCSVファイル名を指定します Const g_strCsvFile = "C:\home\edu\hatena\orekojinn\1368499599\out.csv" Call Main() Sub Main() Dim strTemplate ' テンプレートファイルのテキストの内容を変数に読み込む strTemplate = GetTextFromFile( g_strTemplateFile ) ' Excel ファイルの内容をテンプレートの内容に基づき CSV 出力する Call ConvertExcelToCsvFile( g_strExcelFile, strTemplate, g_strCsvFile ) End Sub ' Excel ファイルの内容をテンプレートの内容に基づき CSV 出力する Sub ConvertExcelToCsvFile( strFileName, strTemplate, g_strCsvFile ) Dim cn Set cn = CreateObject("ADODB.Connection") ' Excel 97-2003 であれば、以下を有効化します。 cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileName & ";Extended Properties=""Excel 8.0;HDR=Yes;""" ' Excel 2007/2010 の場合は、以下を有効化します。 'cn.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName & ";Extended Properties=""Excel 12.0;HDR=Yes;""" Dim rs ' Excel のシート名が「Sheet1」でない場合、下記の名称を変更してください。 Set rs = cn.Execute("SELECT * FROM [Sheet1$]") Dim strLine Dim strBaseName Dim strDelimiter strDelimiter = "," ' 出力ファイルの区切り文字として「,」を使用します。 Dim strNo ' 管理番号 Dim strTitle ' タイトル Dim strSize ' サイズ Dim strState ' 状態 Dim nPrice ' 販売金額 Dim strItemInfo ' 商品説明 strItemInfo = strTemplate strLine = Join( Array("管理番号","商品説明文","販売価格"), strDelimiter ) ' 項目行をファイル出力 Call WriteLineToFile( strLine, g_strCsvFile ) ' レコード件数分、順次取得します While Not rs.BOF And Not rs.EOF ' 各項目の値を取得 strNo = rs("管理番号") strTitle = rs("タイトル") strSize = rs("サイズ") strState = rs("状態") nPrice = rs("販売価格") ' テンプレートの内容に基づき置換 strItemInfo = Replace( strItemInfo, "<タイトル>", strTitle ) ' <タイトル> を置換 strItemInfo = Replace( strItemInfo, "<サイズ>", strSize ) ' <サイズ> を置換 strItemInfo = Replace( strItemInfo, "<状態>", strState ) ' <状態> を置換 ' 「管理番号,商品説明文,販売価格」の CSV データを作成する strLine = _ Chr(34) & strNo & Chr(34) & strDelimiter & _ Chr(34) & strItemInfo & Chr(34) & strDelimiter & _ CStr( nPrice ) ' CSV データをファイル出力 Call WriteLineToFile( strLine, g_strCsvFile ) ' 次のレコードに移動 rs.MoveNext Wend End Sub ' データをファイル出力する Function WriteLineToFile( strLine, strFileName ) Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim file Set file = fso.OpenTextFile(strFileName, 8, True) ' 追加書き込みモード file.WriteLine strLine file.Close End Function ' テキストファイルを読み込む Function GetTextFromFile( strFileName ) Dim strResult Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim file Set file = fso.OpenTextFile(strFileName, 1) ' ForReading = 1 strResult = file.ReadAll GetTextFromFile = strResult End Function
ご回答ありがとうございます。
質問が分かりにくいようですね。。申し訳ありません。
添付の画像①で入力したエクセルのデータを
画像②で入力したテキストファイルの文字列の<>の中に埋め込み、
その結果③の形のCSVファイルを得る。
という事をしたいんですが、
この補足も分かりにくいですよね。。。すみません。
どうぞよろしくお願いします。
テンプレートファイルを使用して CSV データを作成するスクリプトを作成してみました。
事前に以下のパスを修正の上、実行願います。
' Excelデータファイルファイルを指定します Const g_strExcelFile = "C:\home\edu\hatena\orekojinn\1368499599\book1.xls" ' テンプレートファイルを指定します Const g_strTemplateFile = "C:\home\edu\hatena\orekojinn\1368499599\template.txt" ' 出力先のCSVファイル名を指定します Const g_strCsvFile = "C:\home\edu\hatena\orekojinn\1368499599\out.csv"
なお、Excel VBA ではなく、VBScript でのサンプルとなっております。
(少し修正すれば、VBA で動作させることも可能です。必要であれば修正します。)
実行するには、エクスプローラより「ExcelToCsv.vbs」をダブルクリックするか、コマンドライン(cmd.exe)より、「CScript ExcelToCsv.vbs [Enter]」を行ってください。
実行すると出力先の CSV ファイルが作成されます。
' File : ExcelToCsv.vbs ' Usage : CScript //Nologo ExcelToCsv.vbs Option Explicit ' Excelデータファイルファイルを指定します Const g_strExcelFile = "C:\home\edu\hatena\orekojinn\1368499599\book1.xls" ' テンプレートファイルを指定します Const g_strTemplateFile = "C:\home\edu\hatena\orekojinn\1368499599\template.txt" ' 出力先のCSVファイル名を指定します Const g_strCsvFile = "C:\home\edu\hatena\orekojinn\1368499599\out.csv" Call Main() Sub Main() Dim strTemplate ' テンプレートファイルのテキストの内容を変数に読み込む strTemplate = GetTextFromFile( g_strTemplateFile ) ' Excel ファイルの内容をテンプレートの内容に基づき CSV 出力する Call ConvertExcelToCsvFile( g_strExcelFile, strTemplate, g_strCsvFile ) End Sub ' Excel ファイルの内容をテンプレートの内容に基づき CSV 出力する Sub ConvertExcelToCsvFile( strFileName, strTemplate, g_strCsvFile ) Dim cn Set cn = CreateObject("ADODB.Connection") ' Excel 97-2003 であれば、以下を有効化します。 cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileName & ";Extended Properties=""Excel 8.0;HDR=Yes;""" ' Excel 2007/2010 の場合は、以下を有効化します。 'cn.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName & ";Extended Properties=""Excel 12.0;HDR=Yes;""" Dim rs ' Excel のシート名が「Sheet1」でない場合、下記の名称を変更してください。 Set rs = cn.Execute("SELECT * FROM [Sheet1$]") Dim strLine Dim strBaseName Dim strDelimiter strDelimiter = "," ' 出力ファイルの区切り文字として「,」を使用します。 Dim strNo ' 管理番号 Dim strTitle ' タイトル Dim strSize ' サイズ Dim strState ' 状態 Dim nPrice ' 販売金額 Dim strItemInfo ' 商品説明 strItemInfo = strTemplate strLine = Join( Array("管理番号","商品説明文","販売価格"), strDelimiter ) ' 項目行をファイル出力 Call WriteLineToFile( strLine, g_strCsvFile ) ' レコード件数分、順次取得します While Not rs.BOF And Not rs.EOF ' 各項目の値を取得 strNo = rs("管理番号") strTitle = rs("タイトル") strSize = rs("サイズ") strState = rs("状態") nPrice = rs("販売価格") ' テンプレートの内容に基づき置換 strItemInfo = Replace( strItemInfo, "<タイトル>", strTitle ) ' <タイトル> を置換 strItemInfo = Replace( strItemInfo, "<サイズ>", strSize ) ' <サイズ> を置換 strItemInfo = Replace( strItemInfo, "<状態>", strState ) ' <状態> を置換 ' 「管理番号,商品説明文,販売価格」の CSV データを作成する strLine = _ Chr(34) & strNo & Chr(34) & strDelimiter & _ Chr(34) & strItemInfo & Chr(34) & strDelimiter & _ CStr( nPrice ) ' CSV データをファイル出力 Call WriteLineToFile( strLine, g_strCsvFile ) ' 次のレコードに移動 rs.MoveNext Wend End Sub ' データをファイル出力する Function WriteLineToFile( strLine, strFileName ) Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim file Set file = fso.OpenTextFile(strFileName, 8, True) ' 追加書き込みモード file.WriteLine strLine file.Close End Function ' テキストファイルを読み込む Function GetTextFromFile( strFileName ) Dim strResult Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim file Set file = fso.OpenTextFile(strFileName, 1) ' ForReading = 1 strResult = file.ReadAll GetTextFromFile = strResult End Function
ご回答ありがとうございます。
エクセルの機能でなんとかなるものだと勝手に思い込んでいました。
スクリプトでやるのですね。
早速、取り組みます。
またご報告させていただきます。
本当にありがとうございます。
cx20様
ご回答ありがとうございました。
今日一日初めてのVBScriptに取り組み少しだけ、VBScript、プログラミングというものが分かりました。
実際に作りたいものはこの質問のもの程シンプルではなく、ここ何日かで自分で作るのは難しいと判断しました。
ご回答いただけましたのに申し訳ありません。
そして数日中にこの仕組みができると今取り組もうとしている事がとても前進するので
詳しく、正確に希望の仕様を書きました。
このご返答のあとすぐに、改めてこちらで投稿をさせ直させていただきます。
もしよろしければご確認いただけると幸いです。
この度は誠にありがとうございました。感謝します。
ご回答ありがとうございます。
2013/05/15 08:28:05エクセルの機能でなんとかなるものだと勝手に思い込んでいました。
スクリプトでやるのですね。
早速、取り組みます。
またご報告させていただきます。
本当にありがとうございます。
cx20様
2013/05/16 00:57:14ご回答ありがとうございました。
今日一日初めてのVBScriptに取り組み少しだけ、VBScript、プログラミングというものが分かりました。
実際に作りたいものはこの質問のもの程シンプルではなく、ここ何日かで自分で作るのは難しいと判断しました。
ご回答いただけましたのに申し訳ありません。
そして数日中にこの仕組みができると今取り組もうとしている事がとても前進するので
詳しく、正確に希望の仕様を書きました。
このご返答のあとすぐに、改めてこちらで投稿をさせ直させていただきます。
もしよろしければご確認いただけると幸いです。
この度は誠にありがとうございました。感謝します。