以前投稿した「テキストファイルの内容をエクセルシート上に読み込む」の続編です。
※以前の記事はこちら
http://www.office-kaiketsu.com/excel%ef%bc%88%e3%82%a8%e3%82%af%e3%82%bb%e3%83%ab%ef%bc%89/%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e5%86%85%e5%ae%b9%e3%82%92%e3%82%a8%e3%82%af%e3%82%bb%e3%83%ab%e3%82%b7%e3%83%bc%e3%83%88%e4%b8%8a%e3%81%ab%e8%aa%ad/
さて今回は、逆にエクセルシート上の内容をテキストファイルに書き込んでみましょう。
書き込み先のファイルは前回の読み込み元と同じです。c:\tmp フォルダに 電話帳.txt として作成します。
フォルダがなければ作成し直してください。ファイルは今回既にあってもなくてもかまいません。(あったら上書きされます。なかったら作成されます。)
ExcelからVisual Basic Editorを開き、下記のプログラムを入力します。
前回と同じく、プログラムで FileSystemObject というオブジェクトを使うために、「ツール」メニューの「参照設定」で「Microsoft Scripting Runtime」が参照設定されているのを確認しておきましょう。
Sub WriteTelephoneData()
Dim fso As New FileSystemObject
Dim stream As TextStream
Dim lineData(3) As String
Dim row As Integer: row = 1
Set stream = fso.CreateTextFile(“c:\tmp\電話帳.txt”)
With stream
Do Until Cells(row, 1).Value = “” ‘★
lineData(0) = Cells(row, 1).Value
lineData(1) = Cells(row, 2).Value
lineData(2) = Cells(row, 3).Value
.WriteLine (lineData(0) & “,” & lineData(1) & “,” & lineData(2))
row = row + 1
Loop
.Close
End With
End Sub
プログラムが完成したら、「デバッグ」メニューの「VBAProjectのコンパイル」をして、エラーが出ないことを確認します。
シートの画面に戻り、下記のようにシート上に入力します。左上はA1セルになるようにします。
入力できたら「開発」リボン※の「マクロ」で、上記のプログラムの名称「WriteTelephoneData」を実行すると、シート上の内容でテキストファイルが作成(上書き)されます。
プログラムのポイントは、★ の行で、シート上を上から下に辿っていき、データが空白になったら終了するところです。これがないと、延々と空のデータが出力されてしまうのがわかりますか?
こちらもとても簡単な作りですが、慣れたExcelでテキストファイルを簡単に作れますから、いろいろ応用ができそうですね。
※「開発」リボンが見えない場合は、下記の記事を参考にしてください。
http://www.office-kaiketsu.com/excel%ef%bc%88%e3%82%a8%e3%82%af%e3%82%bb%e3%83%ab%ef%bc%89%e3%83%9e%e3%82%af%e3%83%ad%e3%83%bbvba/%e3%83%9e%e3%82%af%e3%83%ad%e9%96%8b%e7%99%ba%e3%82%bf%e3%83%96%e8%a1%a8%e7%a4%ba%ef%bd%9c%e3%82%a8%e3%82%af%e3%82%bb%e3%83%ab2007/
Q.VBAの開発をしていますが、マクロ実行時のエラーが多くてなかなか開発が手際よく進みません。何か開発に便利なツールはないでしょうか。
A.Visual Basic Editor には、開発を便利にするツールがもともと入っていますので、まずはそれを活用しましょう。
エラーが多いということは、実際にプログラムを書いているときの想定が、実際の実行時と合っていないということでしょう。
「表示」メニューの「イミディエイトウィンドウ」を選択すると、プログラムの入力画面の下に「イミディエイト」という画面が開きます。
ここに、実行するプログラムのコードの一部を入力すると、実行結果がすぐに表示されるのです。
試しに、「? Cells(1,1).Value」と入力してみてください。そうすると、Excel画面の現在表示しているシートのA1セルの内容が表示されます。
このように、プログラムを実行する前提となるシートに対して、試しにコードを書いて、その結果を事前に表示することができるのです。
また、プログラム実行中、ブレークポイントなどプログラムを停止しているときにもイミディエイトウィンドウを使用することができます。どうしても不具合の原因が分からないときは、このイミディエイトウィンドウにいろいろ入力して値を確認しながら開発を進めると効果的です。
是非、使いこなしてみて下さい。
Q.会社の会計ソフトから出力されるテキストファイルをExcelに自動で取り込みたいのですがVBAで可能なのでしょうか?
もちろんVBAを使って可能です。
テキストファイルを開いていちいちコピー&ペーストですと手間なケースがありますので是非VBAのやり方を覚えてみましょう。
題材として、簡単な電話帳を取り上げてみます。
下記の内容のファイルを、c:\tmp フォルダに 電話帳.txt として作成します。
=== ファイル始まり
鈴木一郎,080-1111-2222,03-3333-4444
田中次郎,080-5555-6666,042-777-8888
佐藤花子,050-9999-1234,06-5678-9012
=== ファイル終わり
このようなカンマ「,」でデータを区切ったファイルの形式を”CSV形式”と呼びます。
さてファイルの準備ができたら、ExcelからVisual Basic Editorを開き、下記のプログラムを入力します。
そのさい、プログラムで FileSystemObject というオブジェクト(プログラム中★の部分)を使うために、「ツール」メニューの「参照設定」で「Microsoft Scripting Runtime」を参照設定しておきます。
Sub ReadTelephoneData()
Dim fso As New FileSystemObject ‘★
Dim file As file
Dim stream As TextStream
Dim lineData As Variant
Dim row As Integer: row = 1
Set file = fso.GetFile(“c:\tmp\電話帳.txt”)
Set stream = file.OpenAsTextStream
With stream
Do Until .AtEndOfStream = True
lineData = Split(.ReadLine, “,”)
Cells(row, 1).Value = lineData(0)
Cells(row, 2).Value = lineData(1)
Cells(row, 3).Value = lineData(2)
row = row + 1
Loop
.Close
End With
End Sub
プログラムが完成したら、「デバッグ」メニューの「VBAProjectのコンパイル」をして、エラーが出ないことを確認します。
シートの画面に戻り、「開発」リボン※の「マクロ」で、上記のプログラムの名称「ReadTelephoneData」を実行すると、シート上にテキストファイルの内容が出力されます。
とても簡単な作りですが、テキストファイルの列を増やしてみたり、Excelシート上の出力位置を変えてみたり(Cellsのところ)、いろいろ変えてみることで日常の作業に活かせるものが他にも意外にあるかも知れませんね。
※「開発」リボンが見えない場合は、下記の記事を参考にしてください。
https://www.office-kaiketsu.com/excel%ef%bc%88%e3%82%a8%e3%82%af%e3%82%bb%e3%83%ab%ef%bc%89%e3%83%9e%e3%82%af%e3%83%ad%e3%83%bbvba/%e3%83%9e%e3%82%af%e3%83%ad%e9%96%8b%e7%99%ba%e3%82%bf%e3%83%96%e8%a1%a8%e7%a4%ba%ef%bd%9c%e3%82%a8%e3%82%af%e3%82%bb%e3%83%ab2007/
Q.Excelの「マクロの記録」で行う処理を、VBAの処理で行うことはできますか。
可能です。なぜなら、Excelの「マクロの記録」で行った処理は、実はVBAのモジュールで保存されているからです。「マクロの実行」は、実際にはVBAを実行していることになります。この様子を実際に見てみましょう。
新しいブックを開き、「開発」リボン(※)から「マクロの記録」を実行し、以下のような操作を行ってください。(マクロ名は「Macro1」としてすすめます)
(1)セルA1を選択
(2)右クリックメニューから「コメントの挿入」を選択
(3)コメントの内容に「テスト」を記入
以上で「開発リボン」の「記録の終了」で終了させます。
VBAを開き、先ほどマク
ロを記録したブックの標準モジュール内に下記のようなVBAが出力されています。
Sub Macro1()
‘
‘ Macro1 Macro
‘
Range(“A1″).Select
Range(“A1″).AddComment
Range(“A1″).Comment.Visible = False
Range(“A1″).Comment.Text Text:=”テスト”
End Sub
セルにコメントを追加するVBAは「AddComment」であることがわかりますね。
したがってこのVBAコードを、別のVBAコードにコピー&ペーストすれば、コメントの追加処理を別のVBAで実行することができるようになります。
※「開発」リボンが表示されていない場合は、「リボンのユーザー設定」から表示させるように設定してください。
zp8497586rq
Q.VBAで行ごとの繰り返し処理などを行っていると処理が遅くて待ち時間が長くなることがあります。処理を速くする方法を教えてください。
VBAで処理が遅くなる場合、画面表示に時間がかかっている場合があります。
処理の途中経過の表示が必要でない場合、VBAでは、処理中に画面の表示をストップする命令があり、これを使用すると処理が早くなる可能性があります。
例えば、新規シートにコマンドボタンを貼り付け、以下のようなVBAを記述してください。
Private Sub CommandButton1_Click()
For i = 1 To 10000
Me.Range(“A1″).Value = i
Me.Range(“A1″).Font.ColorIndex = (i Mod 12)
Next
End Sub
これを実行すると、A1セルの表示が1~10000までカラフルにカウントアップされます。
このような大量の表示処理は、途中の表示過程を停止させることで、処理時間を短くできます。これを行うVBA命令が、Application.ScreenUpdatingです。
以下のようにコードを付
け足して実行し直してください。
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False ‘←追加部分(画面表示の停止)
For i = 1 To 10000
Me.Range(“A1″).Value = i
Me.Range(“A1″).Font.ColorIndex = (i Mod 12)
Next
Application.ScreenUpdating = True ‘←追加部分(画面表示の停止解除)
End Sub
実行して頂けるとわかりますが、カウントアップの過程は見えず、最終結果の10000のみが表示されます。途中の表示にかかる処理時間が短縮されたため、処理時間が短くなったのがおわかり頂けると思います。
※最後に「Application.ScreenUpdating = True」として元の状態に戻してあげましょう。
ただし、画面表示以外で時間がかかっている場合は効果がありませんので、処理の内容を確認した上でお試しください。
zp8497586rq