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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

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

意見交換

クローズ

2回答

914閲覧

【VBA】OPENを使ってCSVファイルを出力するコードの書き方

koburon

総合スコア30

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

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

0グッド

1クリップ

投稿2023/02/01 01:15

編集2023/02/01 01:22

0

1

背景、状況

VBAでボタンをクリックするとエクセルからCSVに出力するマクロを作っています。
マクロの作成依頼者からは以下の要望を含めてコードを書くように依頼されました。

  • PostgreSQLにデータをインポートできるCSVを出力
  • CSVの文字コードは全て「Shft_JIS」
  • SQLの文字データ型は全て「character」
  • 全てのセル値をダブルクオートで囲んで出力
  • Openステートメントでファイルを開く
  • Printステートメントでデータ入力処理を行う

該当のソースコード

VBA

1Public Sub CSV出力() 2 Dim ws As Worksheet 3 Dim maxrow As Long 4 Dim csvFile As String 5 Dim fileNo As Integer 6 Dim wrow As Long 7 Dim wcol As Long 8 Dim i As Long 9 Dim val As String 10 Dim out_line As String 11 Const stCol = 1 12 Const enCol = 144 13 Dim arrVal(enCol - stCol) As String 14 15 csvFile = ActiveWorkbook.Path & "sample.csv" 16 17 Set ws = Worksheets("Sheet1") 18 maxrow = ws.Cells(Rows.Count, 1).End(xlUp).Row 19 fileNo = FreeFile 20 Open csvFile For Output As #fileNo 21 For wrow = 3 To maxrow 22 i = 0 23 For wcol = stCol To enCol 24 '1データ取得 25 val = ws.Cells(wrow, wcol).Value 26 'データをダブルクオートでくくり、配列へ格納 27 arrVal(i) = wrap_data(val) 28 i = i + 1 29 Next 30 'カンマで連結 31 out_line = Join(arrVal, ",") 32 Print #fileNo, out_line 33 Next 34 Close #fileNo 35 36 MsgBox ("CSVファイルを「Shft_JIS」で出力しました。レコード部分のみ出力しています。") 37End Sub 38 39'入力文字列をダブルクオートでくくる 40Private Function wrap_data(ByVal val As String) As String 41 wrap_data = """" & val & """" 42End Function

知りたいこと

依頼者にコードのレビューを実施したところ、「データを配列へ格納する」手順は良いが、これだけだと、「ただ格納しているだけでSQLに入れられるように書き込みができていない」、という指摘を受けました。

上記のマクロでCSV自体は問題なく出力できており、解決策を求めているわけでは無いので、Q&Aではなく、意見交換とさせていただきました。
入力処理に関して皆さんはどう書いているかご意見いただけると幸いです。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

PC:Windows11
ソフト:Microsoft365 Excel

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

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

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

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

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

回答2

#1

maisumakun

総合スコア145184

投稿2023/02/01 01:18

PostgreSQLにあるCSVインポートの仕様は確認しましたでしょうか?

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

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

#2

sk.exe

総合スコア744

投稿2023/02/01 01:46

PostgreSQLにデータをインポートできるCSVを出力

全てのセル値をダブルクオートで囲んで出力

とりあえず、wrap_data プロシージャの引数 val (に渡されるセル)の値にダブルクォーテーション(")やラインフィード(セル内改行)などの特殊文字が含まれている場合を想定し、PostgreSQL側のインポート処理の仕様に合わせてそれぞれの文字をエスケープする処理を加えられた方がよいでしょう。

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

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

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問