Home Excel(エクセル)マクロ・VBA

企業研修講師派遣のBESTグループ
出張パソコン教室ITスクール
webコンサルティングスクール
パソコンの家庭教師BEST

Q.最近VBAを使用して、シート上の数値などを集計したりしているのですが、ブックを閉じる際にブックを保存するか確認する表示がされます。保存する必要はないので、これを表示させないようにすることは可能でしょうか。

A.いくつかの方法がありますが、今回はそのうちのひとつをご紹介します。

シート上にボタンを配置し、「閉じる」などと表示し、このボタンを押してブックを閉じることとします。
さて、この配置したボタン(Button1とします)のクリックイベントを記述するため、VBAの画面を開き、下記のコードを入力します。

Private Sub CommandButton1_Click()
ActiveWorkbook.Saved=True ‘★
ActiveWorkbook.Close
End Sub

まずこのブックを保存して下さい。(保存せずに閉じるマクロのため)
そして、シート上のButton1をクリックすると、何もメッセージが出力されず、閉じられたと思います。

これはどういうことかというと、Excelのワークブックは、SavedプロパティがFalseのとき、まだ保存がされていない、という判断がされ、
その判断に基づいて、保存を促すメッセージが表示されます。
従って、SavedプロパティをTrueに設定してあげれば(コード中★の部分)、実際に保存されていなくても、保存済のように振る舞うことが可能となるのです。

いかがでしょうか。この他の方法は、またの機会にでも投稿することにしますね。

以前投稿した「VBAマクロ開発を効率的に行う方法(イミディエイトウィンドウ編)」の続編です。

1324389785

※以前の記事はこちら
http://www.office-kaiketsu.com/%e3%81%9d%e3%81%ae%e4%bb%96/vba%e3%83%9e%e3%82%af%e3%83%ad%e9%96%8b%e7%99%ba%e3%82%92%e5%8a%b9%e7%8e%87%e7%9a%84%e3%81%ab%e8%a1%8c%e3%81%86%e6%96%b9%e6%b3%95%e3%82%a4%e3%83%9f%e3%83%87%e3%82%a3%e3%82%a8%e3%82%a4%e3%83%88/

以前の投稿では、イミディエイトウィンドウに直接「? Cells(1,1).Value」等をを入力し、変数の値やシートの値を表示させることを学びましたが、このイミディエイトウィンドウへの表示は、実はプログラムから出力することが可能となっています。どのようなことなのか、以下のプログラムを見てみてください。

For i = 1 To 100
If Left(Cells(i, 1).Value, 4) = “株式会社” Or Left(Cells(i, 1).Value, 4) = “合同会社” Or Left(Cells(i, 1).Value, 4) = “有限会社” Then
Cells(i, 2).Value = Cells(i, 1).Value & “御中”
Else
Cells(i, 2).Value = Cells(i, 1).Value & “様”
End If
Next

このプログラムでは、A列の名前の先頭が株式会社、合同会社、有限会社であった場合、B列にA列の内容に”御中”を追加し、そうでない場合は”様”を追加します。
さて、ここでシートのデータを見るとどうも会社のデータのようだが、B列で”様”が追加されている行があったとしましょう。
このような場合は、for文の中のELSEに入った場合のA列の内容がどのようになっているかを見たくなるでしょう。ただしfor文のループを100行デバッグで見ていくのは大変です。そのような場合こそイミディエイト・ウィンドウが活用できます。下記のようにプログラムを追加します。(★の部分)

For i = 1 To 100
If Left(Cells(i, 1).Value, 4) = “株式会社” Or Left(Cells(i, 1).Value, 4) = “合同会社” Or Left(Cells(i, 1).Value, 4) = “有限会社” Then
Cells(i, 2).Value = Cells(i, 1).Value & “御中”
Else
Debug.Print i & “:” & Left(Cells(i, 1).Value, 4) ‘★
Cells(i, 2).Value = Cells(i, 1).Value & “様”
End If
Next

ELSEに入る場合に判定されているのは、Left(Cells(i, 1).Value, 4)の部分ですから、これがどのようになっているかを確かめるのです。
これでマクロを実行させると、イミディエイトウィンドウには下記のように出力されます。(※テストデータはご自身でA列に作成下さい。下記は例となります。)

10:鈴木一郎
11:田中次郎
23:□有限会 ←(注)□は空白を示しています
29:山田花子
・・・

これで23行目に、頭に余分な空白の入った”有限会社”があったためとすぐにわかります。
このように、プログラム内で「Debug.Print」を実行することで、効率的にデバッグ(バグの修正)を行うことができるようになります。

以前投稿した「テキストファイルの内容をエクセルシート上に読み込む」の続編です。

images

※以前の記事はこちら
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/

1128-2

Q.VBAの開発をしていますが、マクロ実行時のエラーが多くてなかなか開発が手際よく進みません。何か開発に便利なツールはないでしょうか。

A.Visual Basic Editor には、開発を便利にするツールがもともと入っていますので、まずはそれを活用しましょう。
エラーが多いということは、実際にプログラムを書いているときの想定が、実際の実行時と合っていないということでしょう。
「表示」メニューの「イミディエイトウィンドウ」を選択すると、プログラムの入力画面の下に「イミディエイト」という画面が開きます。
ここに、実行するプログラムのコードの一部を入力すると、実行結果がすぐに表示されるのです。
試しに、「? Cells(1,1).Value」と入力してみてください。そうすると、Excel画面の現在表示しているシートのA1セルの内容が表示されます。
このように、プログラムを実行する前提となるシートに対して、試しにコードを書いて、その結果を事前に表示することができるのです。
また、プログラム実行中、ブレークポイントなどプログラムを停止しているときにもイミディエイトウィンドウを使用することができます。どうしても不具合の原因が分からないときは、このイミディエイトウィンドウにいろいろ入力して値を確認しながら開発を進めると効果的です。
是非、使いこなしてみて下さい。

1128-1

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のところ)、いろいろ変えてみることで日常の作業に活かせるものが他にも意外にあるかも知れませんね。

※「開発」リボンが見えない場合は、下記の記事を参考にしてください。

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/