大規模なシステムを開発する程ではないけど、日々の業務をもう少し楽にしたい。
でも、vbaの知識もないし・・・
そういった方でもChatGPTを使用すれば、vbaが作成できるのか。
やってみた。
注)日々システム開発を行っていない方々にとって、要件を正確に伝えることも難しいことだと思います。
なので、今回はあえて要件は正確に伝えず、徐々に改善していくこととします。
ゴールイメージ(csvファイルイメージ)
インプットとなるExcelファイル
最初に伝えた要件
ExcelVBAで以下の要件も満たすプログラムを作成してください。
シート1。セルB1に指定されたExcelファイルからcsvファイルを作成します。
B1ni指定されたExcelファイルの1番目のシートを使用します。
データは2行目からあり、最終行はその時によって何行目まであるかは可変します。
全データを対象にしてください。
使用する列はA列。C列。E〜I列をcsvファイルに出力してください。
csvファイルの1件目はヘッダーレコード
2件目からがデータレコード(Excelから取得するデータ)
最後にエンドレコードを出力してください。
他に何か必要な情報があれば聞いてください
提示されたコード
Sub ExportToCSV()
Dim wb As Workbook
Dim ws As Worksheet
Dim csvFile As String
Dim lastRow As Long
Dim i As Long
Dim dataRange As Range
' 対象のExcelファイルを開く
Set wb = Workbooks.Open(Range("B1").Value)
' 1番目のシートを取得
Set ws = wb.Worksheets(1)
' 最終行を取得
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
' 出力する範囲を指定
Set dataRange = ws.Range("A2:I" & lastRow)
' 出力するファイル名を指定
csvFile = ThisWorkbook.Path & "\" & Replace(wb.Name, ".xlsx", "") & ".csv"
' csvファイルを作成
Open csvFile For Output As #1
' ヘッダーレコードを出力
Print #1, "Column A, Column C, Column E, Column F, Column G, Column H, Column I"
' データレコードを出力
For i = 1 To dataRange.Rows.Count
Print #1, dataRange.Cells(i, 1) & "," & dataRange.Cells(i, 3) & "," & dataRange.Cells(i, 5) & "," & dataRange.Cells(i, 6) & "," & dataRange.Cells(i, 7) & "," & dataRange.Cells(i, 8) & "," & dataRange.Cells(i, 9)
Next i
' エンドレコードを出力
Print #1, "End Record"
' csvファイルを閉じる
Close #1
' 対象のExcelファイルを閉じる
wb.Close SaveChanges:=False
MsgBox "CSVファイルを作成しました。", vbInformation
End Sub
実行結果
実行結果には程遠いですね。
要件を追加してみましょう
2回目の要件
上記のコードを少し修正してください。
ヘッダレコードは以下で作成
1項目目はH、2項目目はマクロを実行した日付
データレコードは先頭をD
エンドレコードは先頭をE 2つ目の項目でデータレコードの件数を出力してください```
提示されたコード
Sub ExportDataToCSV()
Dim wb As Workbook
Dim ws As Worksheet
Dim lastRow As Long
Dim csvFile As String
Dim headerRecord As String
Dim endRecord As String
Dim dataRecord As String
Dim recordCount As Integer
' 元となるExcelファイルを取得
Set wb = ThisWorkbook
Set ws = wb.Sheets("Sheet1")
' CSVファイルの保存先を設定
csvFile = ws.Range("B1").Value & ".csv"
' CSVファイルを作成する前に、ファイルが存在する場合は削除する
If Dir(csvFile) <> "" Then
Kill csvFile
End If
' CSVファイルを "Append" モードで開く
Open csvFile For Append As #1
' ヘッダーレコードを作成
headerRecord = "H," & Format(Now, "YYYY-MM-DD")
' CSVファイルにヘッダーレコードを書き込む
Print #1, headerRecord
' データレコードを作成
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
dataRecord = "D,"
For j = 1 To 9 Step 2
dataRecord = dataRecord & ws.Cells(i, j).Value & ","
Next j
' 最後のカンマを削除
dataRecord = Left(dataRecord, Len(dataRecord) - 1)
' CSVファイルにデータレコードを書き込む
Print #1, dataRecord
' レコード数をカウント
recordCount = recordCount + 1
Next i
' エンドレコードを作成
endRecord = "E," & recordCount
' CSVファイルにエンドレコードを書き込む
Print #1, endRecord
' ファイルを閉じる
Close #1
' 完了メッセージを表示
MsgBox "CSVファイルを作成しました。", vbInformation
End Sub
データレコードが何も出力されなくなった。
原因はここ。マクロ実行ファイルになってる
' 元となるExcelファイルを取得
Set wb = ThisWorkbook
Set ws = wb.Sheets("Sheet1")
指摘
あれ?なんで入力元のファイルがthisworkbookになってるの?
再度提示されたコード
Sub ExportDataToCSV()
Dim wb As Workbook
Dim ws As Worksheet
Dim lastRow As Long
Dim csvFile As String
Dim headerRecord As String
Dim endRecord As String
Dim dataRecord As String
Dim recordCount As Integer
' 入力元のExcelファイルを取得
Set wb = Workbooks.Open(ThisWorkbook.Sheets("Sheet1").Range("B1").Value)
Set ws = wb.Sheets(1)
' CSVファイルの保存先を設定
csvFile = ws.Range("B1").Value & ".csv"
' CSVファイルを作成する前に、ファイルが存在する場合は削除する
If Dir(csvFile) <> "" Then
Kill csvFile
End If
' CSVファイルを "Append" モードで開く
Open csvFile For Append As #1
' ヘッダーレコードを作成
headerRecord = "H," & Format(Now, "YYYY-MM-DD")
' CSVファイルにヘッダーレコードを書き込む
Print #1, headerRecord
' データレコードを作成
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
dataRecord = "D,"
For j = 1 To 9 Step 2
dataRecord = dataRecord & ws.Cells(i, j).Value & ","
Next j
' 最後のカンマを削除
dataRecord = Left(dataRecord, Len(dataRecord) - 1)
' CSVファイルにデータレコードを書き込む
Print #1, dataRecord
' レコード数をカウント
recordCount = recordCount + 1
Next i
' エンドレコードを作成
endRecord = "E," & recordCount
' CSVファイルにエンドレコードを書き込む
Print #1, endRecord
' ファイルを閉じる
Close #1
' Excelファイルを閉じる
wb.Close False
' 完了メッセージを表示
MsgBox "CSVファイルを作成しました。", vbInformation
End Sub
実行結果
ん~いろいろおかしくなった。
なんでファイル名の付け方変えちゃったんだろう?
なぜ、行をstep 2にしてしまったんだろう?
私はコードが読めるので、ダメな箇所が分かるけど・・・
世間では精度が高いと言われているけど、これじゃあ使えない
要件の提示方法に問題があるのだろうか?
今回は失敗になったが、要件の出し方を工夫して再チャレンジしたい