Chat GPT × Excel VBA
今回も「Chat GPT」を使って、どんな感じで「Excel VBA」プログラムが作成できるか試していきたいと思います。
ファイル操作 5(テキスト、CSVファイルの読み込み)
今回は、テキストやCSVファイルのデータを読み込みするプログラムを作成していき
テキストファイルとCSVファイルの違い
こちらもChatGPTで聞いてみました。
【ChatGPTの回答】
テキストファイルとCSVファイルの主な違いは、ファイル内に保存されているデータの形式です。
-
テキストファイルは、通常のテキストデータを含む単純なテキスト形式のファイルです。テキストファイルは、プログラムのソースコード、設定ファイル、ログファイルなど、多くの目的で使用されます。
-
CSVファイルは、Comma Separated Values(カンマ区切り値)と呼ばれる形式でデータを保存するテキストファイルです。CSVファイルは、表形式のデータを保存するために使用され、各行には一意のレコードが含まれ、各列にはレコードのフィールドが含まれます。各フィールドは、コンマで区切られているため、ファイル名が示すように、カンマ区切り値形式で保存されます。
一般的に、CSVファイルは、Excelやデータベースなどのプログラムで簡単に読み書きでき、テキストファイルよりも構造化されたデータの表現に向いています。一方、テキストファイルは、データの構造化が必要なく、より柔軟なデータ保存形式を必要とする場合に適しています。
テキストファイルを作成
ChatGPTで「都道府県別データ」として
・都道府県名
・県庁所在地
・面積
・人口
のデータを作成して、メモ帳でテキストファイルとして保存。
CSVファイルを作成
こちらもChatGPTで同じようにCSVファイル用としてデータを作成。
テキスト用と異なり、それぞれのデータが「,」カンマ区切りになっています。
テキストファイルを読み込むVBAを作成
①ChatGPTに下記内容でVBA作成を依頼。
②プログラムを実行。
「InputBox」と指定してしまいましたが、ファイル選択するのは、「Application.GetOpenFilename」の間違いでした。
ChatGPTでは問題なく「Application.GetOpenFilename」を使用してファイル選択をするようにしてくれています。
なので、下のようにファイル選択のウインドウが開きます。
ファイルを選択してプログラムを実行すると下のように文字化けになりました。
これは、テキストファイルを保存するときに「エンコード」が「UTF-8」で作成されている為のようです。
下のように、テキストファイルで「エンコード」を「ANSI」で保存しなおすと問題なく表示されるようになります。
「UTF-8」で保存されたテキストファイルでも文字化けしないようにする
文字化け問題を解消すべく、ChatGPTで何度もプログラムを作成しましたが、残念ながら文字化けが解消されるプログラムは作成出来ませんでした。
(質問が悪いのかもしれません。)
自身でネットを確認したところ「ADODB.Streamオブジェクト」を使用すると、「UTF-8」で保存されたテキストファイルでも文字化けが解消できるとのことなのでChatGPTに「ADODB.Streamオブジェクト」を使用したプログラム作成を依頼しました。
①下のようにChatGPTに「ADODB.Streamオブジェクト」を使用して文字化けを解消するプログラムを作成依頼。
②プログラムを実行。
下のように文字化けが解消されました。
ただし、今度は、「ANSI」で保存されているテキストファイルでこのプログラムを実行すると下のように文字化けが発生。
上記を解消すべく、VBAで「UTF-8」もしくは「ANSI」を自動判別するようなプログラムを作成しようとしましたが、私の知識不足と結構面倒なプログラムになりそうなので今回は断念します。
【実際のプログラム】
※UTF-8で保存されたテキストファイルを文字化けしないようにしたプログラム
Sub ReadUTF8TextFile()
Dim file_path As Variant
Dim stream As Object
Dim text As String
Dim row_num As Integer
Dim line As Variant
' ファイルのパスを選択
file_path = Application.GetOpenFilename("Text Files (*.txt),*.txt")
👆テキストファイルの選択コマンド。
' キャンセルされた場合は処理を終了
If file_path = False Then Exit Sub
👆テキストファイルの選択を「キャンセル」したときの対策もしてくれています。
' ADODB.Streamオブジェクトを作成してファイルを読み込む
Set stream = CreateObject("ADODB.Stream")
stream.Type = 2 ' テキスト形式
stream.Charset = "utf-8"
stream.Open
stream.LoadFromFile file_path
text = stream.ReadText(-1) ' 全部読み込む
' ファイルを閉じる
stream.Close
👆「ADODB.Streamオブジェクト」については正直あまりわかっていません。
別途勉強しますが、今回はそのまま使用します。
' 読み込んだテキストをセルに書き込む
row_num = 3 ' セルB3から書き込む
For Each line In Split(text, vbCrLf)
👆「vbCrlf」は改行の意味です。
上の赤字部分で「text」変数に全てのデータを入れて、改行ごとに「line」変数に入れていくようです。
ActiveSheet.Cells(row_num, 2).Value = line
👆ここで上で作成した改行毎に区切られた「line」変数に入っている値をセルに書き込んでいきます。
row_num = row_num + 1
Next
End Sub
【因みに「ADODB.Streamオブジェクト」を使用していないプログラム】
Sub ReadTextFile()
Dim file_path As Variant
Dim file_num As Integer
Dim text_line As String
Dim row_num As Integer
' ファイルのパスを選択
file_path = Application.GetOpenFilename("Text Files (*.txt),*.txt")
' キャンセルされた場合は処理を終了
If file_path = False Then Exit Sub
' ファイルを開く
file_num = FreeFile()
Open file_path For Input As file_num
' ファイルの内容を読み込んでセルに書き込む
row_num = 3 ' セルB3から書き込む
Do Until EOF(file_num)
Line Input #file_num, text_line
ActiveSheet.Cells(row_num, 2).Value = text_line
row_num = row_num + 1
Loop
' ファイルを閉じる
Close file_num
End Sub
※今回「ADODB.Streamオブジェクト」を指定したため、複雑なプログラムになりましたが、単純にテキストファイルを読み込むプログラムは上のプログラムで赤字部分の「EOF」や「Line Input」を使うのが一般的だと思います。
CSVファイルを読み込むVBAを作成
①同様にChatGPTに依頼。
②プログラムを実行。
こちらも「Application.GetOpenFilename」でファイル選択ができるようになっています。
また、ファイルもCSV用としているので、ファイル形式も「CSV」が選択されています。
CSVは「,」カンマ区切りなので、「,」ごとにデータを分けて保存するようにプログラムしてくれています。
こちらもテキストファイルと同じで、「エンコード」が「UTF-8」か「ANSI」で保存されているかで、文字化けすることがあります。
下は「UTF-8」で保存されたCSVファイル用のプログラムです。
【実際のプログラム】
Sub ReadCSVFile()
Dim file_path As Variant
Dim stream As Object
Dim text As String
Dim row_num As Integer
Dim line As Variant
Dim cell As Variant
' ファイルのパスを選択
file_path = Application.GetOpenFilename("CSV Files (*.csv),*.csv")
👆テキストファイルの選択コマンド。
' キャンセルされた場合は処理を終了
If file_path = False Then Exit Sub
👆テキストファイルの選択を「キャンセル」したときの対策もしてくれています。
' ADODB.Streamオブジェクトを作成してファイルを読み込む
Set stream = CreateObject("ADODB.Stream")
stream.Type = 2 ' テキスト形式
stream.Charset = "utf-8"
stream.Open
stream.LoadFromFile file_path
text = stream.ReadText(-1) ' 全部読み込む
' ファイルを閉じる
stream.Close
👆「ADODB.Streamオブジェクト」の処理。
' 読み込んだテキストをセルに書き込む
row_num = 3 ' セルB3から書き込む
For Each line In Split(text, vbCrLf)
👆こちらも「vbCrlf」改行で区切っています。
Dim cells As Variant
cells = Split(line, ",")
👆上で「vbCrlf」改行で区切っていますが、更に1行を「,」で区切っています。
Dim col_num As Integer
col_num = 2 ' セルBから書き込む
For Each cell In cells
ActiveSheet.Cells(row_num, col_num).Value = cell
col_num = col_num + 1
Next
👆ここで、1行のプログラムを「,」区切りにしたときに列番号に1を追加して値を入力していくようになっています。
row_num = row_num + 1
👆次の行に行くために行番号の変数に1を追加。
Next
End Sub
マクロ付エクセルファイル保存時の注意点
注意点として、せっかく上記で作成したVBAを含むエクセルファイルを保存する場合は、必ず拡張子を"Excelマクロ有効ブック(*.xlsm)"で保存しないとプログラムが消えてしまいますので要注意です。
あとがき
今回はChatGPTで、テキスト及びCSVファイルを読み込みするプログラムを作成しました。
私自身は多少のVBAの知識しかありませんが、根気よくChatGPTと時々サイトを利用することでそれなりのプログラムは作成できます。
ChatGPTが100%正解だとは思わないので、何の知識もなく作成されたプログラムをそのまま使用することはお勧めできません。
しかし、作成されたVBAを自身で解析し、不明点もまたChatGPTに質問できるので、独学で学ぶ場合は一人で悩むよりChatGPTを活用したほうが断然良いと思います。
次回は、ファイル操作 6として
・ファイル名やフォルダ名の一括変更
プログラムを作成したいと思います。