前提
VBAでCSVファイルを出力するマクロを作っています。
CSVファイルはPostgreSQLの社員マスタにインポートできるように形式を調整して作成します。下記URLを参考にして作成しました。
・【超簡単】ワンタッチでエクセルからCSV出力するVBAプログラム
・PostgreSQLでCSVファイルをインポート/エクスポートする方法
該当のソースコード
社員マスタのテーブルです。文字数制限のため一部省略しますが、文字型は全てcharacterです。
t_社員マスタ
1CREATE TABLE public."t_社員マスタ" ( 2 "社員番号" character(8) NOT NULL, 3 "氏名" character(16), 4 "氏名カナ" character(24), 5 "所属コード" character(3), 6 "所属" character(30), 7 "支社コード" character(3), 8 "支社" character(20), 9 "役職名" character(30), 10); 11ALTER TABLE ONLY public."t_社員マスタ" 12 ADD CONSTRAINT "pk_t_社員マスタ" PRIMARY KEY ("社員番号");
全てのセル値を「""」で囲んでCSV出力するコードです。
VBA
1Public Sub writeCSV() 2 Dim ws As Worksheet 3 Dim maxrow As Long 4 Dim fileNo As Integer 5 Dim wrow As Long 6 Dim wcol As Long 7 Dim i As Long 8 Dim val As String 9 Dim out_line As String 10 Const stCol = 1 11 Const enCol = 144 12 Dim arrVal(enCol - stCol) As String 13 Set ws = Worksheets("Sheet1") 14 maxrow = ws.Cells(Rows.Count, 1).End(xlUp).Row 15 fileNo = FreeFile 16 17 ' ワークシートに出力している間の画面更新を停止 18 Application.ScreenUpdating = False 19 20 ' ---------------------------- 21 ' ファイルの出力処理 22 ' ---------------------------- 23 Dim myFileName, fileName, fileDateNm As String 24 25 ' ファイル名を作成する 26 fileDateNm = Replace(CStr(Date), "/", "") 27 fileName = "UpdateMaster_" & fileDateNm 28 ' ダイアログ表示 29 myFileName = Application.GetSaveAsFilename(InitialFileName:=fileName, FileFilter:="CSV ファイル (*.csv),*.csv") 30 ' キャンセルなら終了 31 If myFileName = "False" Then 32 Exit Sub 33 End If 34 35 ' 保存 36 Open myFileName For Output As #fileNo 37 For wrow = 3 To maxrow 38 i = 0 39 For wcol = stCol To enCol 40 ' 1データ取得 41 val = ws.Cells(wrow, wcol).Value 42 ' データをダブルクオートでくくり、配列へ格納 43 arrVal(i) = wrap_data(val) 44 i = i + 1 45 Next 46 ' カンマで連結 47 out_line = Join(arrVal, ",") 48 Print #fileNo, out_line 49 Next 50 Close #fileNo 51 52 MsgBox ("CSVファイルを「Shift_JIS」で出力しました。レコード部分のみ出力しています。") 53 54 ' 画面更新を元に戻す 55 Application.ScreenUpdating = True 56End Sub 57 58' 入力文字列をダブルクオートでくくる 59Private Function wrap_data(ByVal val As String) As String 60 wrap_data = """" & val & """" 61End Function
CSVファイルをインサートするCOPYコマンドです。
PostgreSQL
1COPY t_社員マスタ from '/public/csv/UpdateMaster_20230221.csv' ;
実現したいこと
社員マスタで主キー制約が機能しているか確認するため、社員番号が重複しているレコードをCOPYで実行してエラーが発生させるのが目的です。
発生している問題
CSVファイルは問題なく出力されますが、COPYコマンド実行時、以下の構文エラーが発生しました。
COPY t_社員マスタ from '/public/csv/UpdateMaster_20230221.csv' ERROR: 符号化方式"UTF8"で無効なバイトシーケンスです: 0x8d CONTEXT: t_社員マスタのCOPY。行番号 1
試したこと
CSVファイルをテキストエディタ(NewQX)で確認したところ文字化けは特に発生していません。encodingを指定すると正しく実行されると参考サイトに書かれていたので、修正して再度実行しましたが、以下のように構文エラーが発生しました。
COPY t_社員マスタ from '/public/csv/UpdateMaster_20230221.csv' with encoding 'sjis' csv ERROR: "encoding"またはその近辺で構文エラー LINE 1: ...from '/public/csv/UpdateMaster_20230221.csv' with encoding '...
レコード重複した場合のエラーメッセージがどういうものか分かっていないのですが、これは明らかにそれ以前の原因のエラーだとは思います。
どこかで表記ミスしているのか、アドバイスいただけると幸いです。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
PC:Windows11
Excelのバージョン:Microsoft365 Excel
PostgreSQLのバージョン:9.0.1
PSqlEditのバージョン:5.2.3.9

回答2件
あなたの回答
tips
プレビュー