今回作成したマクロは以下の2点を紹介します。
- 100行おきにファイルを分割する。
- エクセルファイルをtxtファイルで保存する。
とてもシンプルですが、意外とハマったりしましたので、紹介します。
実際に作成したファイル
※1 今回はマクロボタンは作成していません。
※2 マクロを実行するとtxtファイルが51個作成されます。保存される場所は
【テキスト化マクロ.xlsm】が保存されている場所に保存されるので、フォルダを作成して、ダウンロードファイルを移動してから実行してください。
マクロの内容
Sub xlsxtotxt()
'現在のブックを変数に格納
Dim wb As Workbook
Set wb = ThisWorkbook
'最終行の取得
Dim lastrow As Long
lastrow = wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
'繰り返し回数を算出
lastrow = lastrow / 100 + 1
Dim rstart As Long, rlast As Long
Dim counter As Long
Dim pasterange As Range
With wb.Sheets(2)
Set pasterange = .Range("A1:A100")
End With
For counter = 1 To lastrow
wb.Sheets(2).Range("A:A").ClearContents
With wb.Sheets(1)
'最初の行と最後の行を変数に格納
rstart = (counter - 1) * 100 + 1
rlast = counter * 100
'指定した範囲のコピー
.Range(.Cells(rstart, 1), .Cells(rlast, 1)).Copy
Sheets(2).Range("A1").PasteSpecial
End With
'シート2を新しいブックにコピー
wb.Sheets(2).Copy
'.txt形式で保存
ActiveWorkbook.SaveAs Filename:=wb.Path & "\テキストデータ" & counter & ".txt", FileFormat _
:=xlText, CreateBackup:=False
ActiveWorkbook.Close
Next counter
End Sub
100行ごとにファイルを分割する手順
プログラム自体は難しいことはしていないので、手順を説明します。
- 最終行を取得して、100で割って、1を足す。
分割したい行数で割ることによって繰り返しの回数を取得します。
最後の繰り返しが切り捨てになって分割されずに終了するので、繰り返し回数を1回足します。 - 最初の行と最後の行を指定する。
最初の行は繰り返しの回数から1を引いて、100を掛けます。最後に1を足します。
最後の行は繰り返しの回数に100をかけるだけです。 - 最初の行と最後の行の範囲をコピーして、別のシートに貼り付けます。
シンプルですが、貼り付ける作業でハマりました。
原因はPasteメソッドはSheetオブジェクトにあり、Rangeオブジェクトには存在しておらず、エラーが発生していました。
RangeオブジェクトにはPasteSpecialというメソッドがありますので、それを指定することで解決できました。
エクセルファイルをtxtファイルで保存する。
エクセルファイルをtxtファイルを保存する場合、ファイルの拡張子を【.txt】に変更するのと、引数である【FileFormat】に【xlText】を指定するだけで保存できます。
ですが、注意点が2つあります。
保存できるのは1つのシートのみ
これは複数のシートを一気に保存することができないことを示しています。
拡張子を変更して保存するとほかのデータが破損、消失してしまう。
1シートしか保存できないに加えて、エクセルのデータが拡張子がtxtに変わってしまうため、データが破損したような状態になってしまいます。
これを防ぐためにシートだけ、別のブックにコピーして作成して、そのあと別ブックだけをtxtファイルとして保存することによってマクロが入っているエクセルファイルは保存しないようにします。
シートをコピーして、新しいブックに貼り付けるやり方は非常に簡単です。
Sheets(2).Copy
この一行で大丈夫です。
また、コピーメソッドを使用した後はコピー先がアクティブになりますので、そのまま保存して、閉じてしまうことが可能です。
まとめ
このようなプログラムを誰が使うの?って感じですが、プログラムを作成するための思考過程の練習にはなると思うので、興味ある方はぜひ作ってみてください。
コメント