1368499599 エクセルで入力したデータを指定の形でcsvファイルとして吐き出したい。


添付画像①のように
列Cは「サイズ」列Dは「状態」
などの項目を作りそれぞれの行にデータを入力します。

そして画像②のようなテンプレ.txtを作ります。

そして何らかの方法で、多分エクセル、マクロ?で何とかすれば
③のようなCSVファイルを吐き出せるのでは無いかと思っています。
可能でしょうか?
もしエクセルで、できるのであればどうやればよいでしょうか。

また
①で入力した列Eの「販売価格」は③のCSVでは列Cに何も加工を加えずに
吐き出すようにしたいです。

今回質問させていただくためにシンプルになデータを作りましたが
項目はもっとたくさんあります。


今使用しているエクセルのバージョンは2003です。
以上どうかよろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/05/16 00:57:45
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:cx20 No.2

回答回数607ベストアンサー獲得回数108

ポイント200pt

テンプレートファイルを使用して 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
id:orekojinn

ご回答ありがとうございます。
エクセルの機能でなんとかなるものだと勝手に思い込んでいました。
スクリプトでやるのですね。
早速、取り組みます。
またご報告させていただきます。
本当にありがとうございます。

2013/05/15 08:28:05
id:orekojinn

cx20様
ご回答ありがとうございました。
今日一日初めてのVBScriptに取り組み少しだけ、VBScript、プログラミングというものが分かりました。
実際に作りたいものはこの質問のもの程シンプルではなく、ここ何日かで自分で作るのは難しいと判断しました。
ご回答いただけましたのに申し訳ありません。
そして数日中にこの仕組みができると今取り組もうとしている事がとても前進するので
詳しく、正確に希望の仕様を書きました。
このご返答のあとすぐに、改めてこちらで投稿をさせ直させていただきます。
もしよろしければご確認いただけると幸いです。
この度は誠にありがとうございました。感謝します。

2013/05/16 00:57:14

その他の回答1件)

id:rafting No.1

回答回数2652ベストアンサー獲得回数176

ポイント10pt

■テキスト(タブ区切り)
http://webpersons.jp/tips/2008/05/excelxls.html

こういうことでしょうか?

id:orekojinn

ご回答ありがとうございます。
質問が分かりにくいようですね。。申し訳ありません。
添付の画像①で入力したエクセルのデータを
画像②で入力したテキストファイルの文字列の<>の中に埋め込み、
その結果③の形のCSVファイルを得る。
という事をしたいんですが、

この補足も分かりにくいですよね。。。すみません。
どうぞよろしくお願いします。

2013/05/14 21:31:25
id:cx20 No.2

回答回数607ベストアンサー獲得回数108ここでベストアンサー

ポイント200pt

テンプレートファイルを使用して 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
id:orekojinn

ご回答ありがとうございます。
エクセルの機能でなんとかなるものだと勝手に思い込んでいました。
スクリプトでやるのですね。
早速、取り組みます。
またご報告させていただきます。
本当にありがとうございます。

2013/05/15 08:28:05
id:orekojinn

cx20様
ご回答ありがとうございました。
今日一日初めてのVBScriptに取り組み少しだけ、VBScript、プログラミングというものが分かりました。
実際に作りたいものはこの質問のもの程シンプルではなく、ここ何日かで自分で作るのは難しいと判断しました。
ご回答いただけましたのに申し訳ありません。
そして数日中にこの仕組みができると今取り組もうとしている事がとても前進するので
詳しく、正確に希望の仕様を書きました。
このご返答のあとすぐに、改めてこちらで投稿をさせ直させていただきます。
もしよろしければご確認いただけると幸いです。
この度は誠にありがとうございました。感謝します。

2013/05/16 00:57:14

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません