見出し画像

Excel VBA ファイルに結果を出力する

前回作成した競走馬の名前をランダムに出力するマクロを拡張して、
ファイルにも馬名を出力できるようにしてみたいと思います。

作成したソースがこちら

Sub horseNameShuffleToFile()
   
'最大馬名頭数
Dim maxHouseNumber As Integer: maxHouseNumber = 10
'行番号
Dim lineNo As Integer
'冠名の配列
Dim eponymousNameList() As String: ReDim eponymousNameList(maxHouseNumber)
'下の名前の配列
Dim firstNameList() As String: ReDim firstNameList(maxHouseNumber)

'1行目から取得して配列を作成
lineNo = 1
Do While Cells(lineNo, 1) <> ""
   eponymousNameList(lineNo) = Cells(lineNo, 1).Value
   firstNameList(lineNo) = Cells(lineNo, 2).Value
   lineNo = lineNo + 1
Loop

'冠名の取得対象番号
Dim randomEpoNum As Integer: randomEpoNum = Int((lineNo - 1) * Rnd + 1)
'下の名前の取得対象番号
Dim randomFirNum As Integer: randomFirNum = Int((lineNo - 1) * Rnd + 1)

'ファイルに出力する
'ファイル名
Dim filePath As String
'filePath = ActiveWorkbook.Path & "\houseName.txt"
filePath = ActiveWorkbook.Path & "\houseName_" & Format(Now(), "yyyymmddhhmmss") & ".txt"

'ファイルを開く
Open filePath For Output As #1

'ファイルに書き出す
Print #1, eponymousNameList(randomEpoNum) & firstNameList(randomFirNum)

'ファイルを閉じる
Close #1

MsgBox ("ファイルに出力しました。")

End Sub

ポイントは以下
・ファイルに出力する
Open・Print・Closeをワンセットで使用します。
=================
Open ファイル名 For Output ファイル番号
※ファイル番号はOpenの時に付与して、内容の書き出しや、Closeの時に同じ番号を指定します
=================
Print ファイル番号 『ファイルに書きだしたい内容(ここでは馬名)』
※自由な内容を書き出しましょう!
=================
Close ファイル番号
※ちなみにちゃんとCloseしないと作成したファイルはExcelのプロセスがつかんだままとなり、書き込みが完了しないし、編集もできません。

'ファイルを開く
Open filePath For Output As #1

'ファイルに書き出す
Print #1, eponymousNameList(randomEpoNum) & firstNameList(randomFirNum)

'ファイルを閉じる
Close #1

補足
ファイル名をタイムスタンプ(現在日時)にしてみました。
ファイル名を指定するところでファイル名にフォーマットを指定した現在日時を指定しています。
==========
Now() 関数
※現在日時を出力します。 例) 2019/11/24 12:34:56
※日付の型となるため、このままではファイル名に使用できません
==========
Format(値, 書式)
※yyyymmddhhmmdd形式でNow関数の結果の日付を文字として返却

参考にしたVBA関数の説明
月のmmと分のmmは自動で見分けている模様

filePath = ActiveWorkbook.Path & "\houseName_" & Format(Now(), "yyyymmddhhmmss") & ".txt"

お疲れ様でした!

この記事が気に入ったらサポートをしてみませんか?