エクセルVBAマクロに関する基礎知識

スポンサーリンク

業務に不可欠なエクセル。エクセルの高速化という観点で、エクセルの保有するコンピュータ言語、VBA(マクロ)の習得は必要不可欠です。今回は、エクセルVBA(マクロ)の初心者でも分かりやすいように、ご説明させていただきます。

マクロの概要・メリットとは?

何度も同じことを繰り返さないために、マクロがあります。つまりは自動学習して、それを実行してくれるプログラムと思ってください。特に、その処理するデータ量が多くなればなるほど、手間が倍増します。

そんな時には、マクロで一括処理ができれば業務の効率化がはかれます。

マクロにあるオブジェクトの考え方

VBAには「オブジェクト」という考え方があります。そのような考え方でしょうか。これは操作を指示するために指定する「物」の考え方であり、例えばエクセルでよく目にするであろう「セル」や「ブック」などがそれに該当します。

オブジェクトの値を取得するためには、

Range(“{オブジェクトの名前}”).{オブジェクトのプロパティ名}

と書きます。これは、オブジェクトに対してプロパティーを発動させるという意味。

オブジェクトの名前は言い換えば対処物。プロパティーに関しては、対象物の性格を表すデータと言えます。

Range(“A1”).Valueと書けば、A1セルの値を取得するという意味となります。ここではプロパティーがvalue=値という意味となっています。

もし、値を指定したい場合は

Range(“{オブジェクトの名前}”).{オブジェクトのプロパティ名}={値}

と書きます。

先程の例だと、

Range(“A1”).Value=20だと、A1セルの値が20となります。もし数字ではなく、文字列を入れたい場合はクオテーション「””」で囲む必要があります。例えば、「A1」セルに「おはようございます」と入力するとしましょう。

その場合は、

Range(“A1″).Value=”おはようございます”

と書きます。

オブジェクトの階層構造

先程はオブジェクトでA1セルに対して処理を行うことをご説明させていただきましたが、A1セルではなく、ある特定のブックの特定のシートの特定のセルに対して処理を行うにはどうしたら良いのでしょうか。

その場合は

Workbooks(“特定のブック名”).Worksheets(“特定のワークシート名”).Range(“特定のワークシート名”).Select

と書きます。

つまりは、オブジェクトには階層構造があり、それらの大きい順から並べる、繋げるためには「.」で結ぶ必要があるということです。

Workbookオブジェクト>Worksheetオブジェクト>Rangeオブジェクト

を理解しましょう。

VBAの基本的な関数

VBAには関数というものが存在します。「計算などの手順をまとめて定義した数式」のことです。エクセルのワークシート上にも関数がたくさんあるかと思いますが、それとはまた別物です。普段皆さんが使われているのは、ワークシート関数と呼ばれております。

Dim {値を入れる器} As Integer

{値を入れる器} = Len(“おはようございます”)

このINTEGERとはなにかを今からご説明させていただきます。

VBAの型

Integerは整数型と呼ばれ、-32,768~32,767の整数を格納する際に使えます。他にもLONGやSTRINGは覚えておきましょう。

よく使う格納型のみを抜粋して、一覧にするとこうなります。

  • INTEGER:-32,768~32,767の整数
  • 長整数型:-2,147,483,648~2,147,483,647の整数
  • 文字列型: 任意の長さの文字列

これらの基礎知識をふまえて次により深く見ていきましょう。

条件分岐の書き方

マクロにて条件分岐はよく使うコードなのでこの機会に覚えておきましょう。条件分岐というのは、「もし仮にAの状態ならばBの処理、そうでなければCの処理」という書き方のことです。もし、3つ以上の場合だと「もし仮にAの状態ならばBの処理、Cの状態ならばDの処理、それ以外ならEの処理」となります。

コードでいうと、

If 《条件1》 Then 《処理1》
ElseIf 《条件2》 Then 《処理2》
Else 《条件1》、《条件2》以外
《処理3》 End if

となりますね。これを例文に置き換えた場合どうなるのか見ていきましょう。まずは

2つの条件分岐の場合

Sub test()
Dim intAge As Integer
intAge = InputBox(“あなたの年齢を入力してください。”)

If intAge > 19 Then MsgBox “成人です。” Else MsgBox “未成年です。”

End If End Sub

※inputoBoxは、エクセル上でポップアップで表示されるものです。

他の事例として、条件分岐としてメッセージを表示させるものにしましょう。この事例は非常に使うものかもしれません。

If Msgbox(“実行しますか?”,vbQuestion+vbOKCancel)=vbCancel then

Msgbox “終了”

exit sub

end if

“残りの実行処理分”

3つの条件分岐の場合

Sub test() Dim intScore As Integer
intScore = InputBox(“数学のテストの点数を入力してください。”)
If 79 < intScore And intScore <= 100 Then MsgBox “優です”
ElseIf 69 < intScore And intScore < 80 Then MsgBox “良です”
ElseIf 59 < intScore And intScore < 70 Then MsgBox “可です”
ElseIf 0 < intScore And intScore < 60 Then MsgBox “不可です”
Else MsgBox “得点は 0~100の数字で入力してください”

End If End Sub

となります。おそらく何となくイメージがついていることかと思います。

※Msg Boxはメッセージボックスの略、エクセル上でポップアップで表示されるものです。
※不等号式で<の後に=がつきます。この順序を理解してください。
※前述したように文字列の周りは””で囲みます。

条件分岐で途中で止まった場合

条件式において途中で止まった場合には、

On Error Resume Next

を入れます。これはどういうことかというと、シート7ページ目を削除するマクロを書いたとしましょう。既に7ページ目がない(切れている)場合、そこでエラーが生じます。それを防ぐのが、このコードです。便利なので覚えておきましょう。

オブジェクトは、このプロパティまたはメソッドをサポートしていません

「(オブジェクトに)そのプロパティやメソッドはない」という意味。一度コードを見直す必要があります。

アウトルックと連動してメールをエクセルから送る方法

◎初期設定

開発タブ→ツールタブ→参照設定にチェックを入れていただき「Microsoft Outlook 15.0 Object Library」のライブラリにチェックを入れてください。

◎開発設定(コード)

Sub outlookmail()

‘まずは変数宣言です。下記6つのコードを全て変数の形は「string」として処理していきます。stringとは任意の長さの文字列を格納する文字列型と呼ばれております。

Dim toaddress, ccaddress, bccaddress As String
Dim subject, mailBody, credit As String
Dim outlookObj As Outlook.Application
Dim mailItemObj As Outlook.mailItem

‘それぞれの値を取得していきます。ここではB2からB7までですね。

toaddress = Range(“B2”).Value
ccaddress = Range(“B3”).Value
bccaddress = Range(“B4”).Value
bcc宛先 subject = Range(“B5”).Value
mailBody = Range(“B6”).Value
credit = Range(“B7”).Value

‘outlookを起動させhtml設定ができるフォーマット3を指定します。
Set outlookObj = CreateObject(“Outlook.Application”)
Set mailItemObj = outlookObj.CreateItem(olMailItem) mailItemObj.BodyFormat = 3

‘その後に各項目に対して変数を入れていきます。
mailItemObj.To = toaddress
mailItemObj.cc = ccaddress
mailItemObj.BCC = bccaddress
mailItemObj.subject = subject

‘メール本文にはmailBodyとcreditを書きます。& vbCrLf &で改行を行うことができます。しかし、筆者の場合はうまく反映できなかったため、難しい場合は&<br>&で対応してみてください。

mailItemObj.Body = mailBody & vbCrLf & vbCrLf & credit
Dim attached as string Dim myattachments As Outlook.Attachments
Set myattachments = mailItemObj.Attachments attached = Range(“B9”).Value ‘添付ファイル myattachments.Add attached
mailItemObj.Save ‘下書き保存

‘オブジェクトの解放は下記。
Set outlookObj = Nothing
Set mailItemObj = Nothing

End Sub

エクセルの作業にてポップアップ表示を消す方法

マクロにてシート削除などのコードを使うと、「本当にこのシートを削除しても良いですか」という確認のためのポップアップが出てきて、途中でマクロの動作が止まることがあります。一度はいのボタンを押せばその後の操作は不要ですが、最初の1回の操作でも嫌ですよね。

そんな時は、Application.DisplayAlerts = Falseと書きます。一度falseにすれば、後は全てfalseのまま処理してもらえるので楽です。もしその後の作業ではポップアップを表示したい場合には、Trueに設定しなおしましょう。

また、マクロで高速処理を行う際に、実行中のマクロの途中の状態を表示して欲しい時があります。

その時は、Application.ScreenUpdating = Falseと書きます。。そして、 画面の更新を再開させる操作 Application.ScreenUpdating = Trueと書きます。つまりONとOFFの切り替えと言えますね。

VBAで保存

PDFで保存

Sub 出力PDF()
Const PATH_ = “C:\TEMP\”
‘Constは定数のこと。変数は値が変わるもの、定数は値が変わりません。 Const 定数名 [As データ型] = “定数の値”と書きます。
Dim sh As Worksheet

‘shをワークシートと定義します。

Set sh = Worksheets(1)

‘Worksheets(1)を指定しました。
sh.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=PATH_ & sh.Name

‘いよいよPDF出力。_は改行の意味。typeはPDFの出力形式。Filenameは文字通りファイル名を指します。
End Sub

CSVで保存

Sub CSV保存()
Dim csvFile As String

‘文字列としてcsvFileを定義

With ActiveWorkbook
csvFile = .Path & “\Data.csv”

‘ActiveWorkBookは、現在表示されているブックのこと
.Worksheets(“テスト”).Copy

With ActiveWorkbook
.SaveAs Filename:=csvFile, FileFormat:=xlCSV

‘上記で指定したcsvFileを名前に、ファイルフォーマットをCSVファイル(xlCSV)を指定。WITHは主語を固定して、.を複数つける法則。今回は「.」が2回続いたから2回のEND WITHで閉じている。

.Close savechanges:=False
End With
End With
End Sub

スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク

コメント

  1. dg より:

    こんにちは。
    初めまして。
    上記非常に参考になりました。ありがとうございました。

    Dim attached as string Dim myattachments As Outlook.Attachments
    Set myattachments = mailItemObj.Attachments attached = Range(“B9”).Value ‘添付ファイル myattachments.Add attached
    mailItemObj.Save ‘下書き保存

    上記のファイル添付の記述について、
    もし可能でしたら2点教えていただけましたら幸いです。

    1)別々のフォルダに入っているファイルを2点もしくは3点添付したい場合どのように記述すればよいでしょうか?

    Dim attached as string Dim myattachments As Outlook.Attachments
    Set myattachments = mailItemObj.Attachments attached = Range(“B9”).Value ‘添付ファイル attached = Range(“C9”).Value ‘添付ファイル
    myattachments.Add attached

    *B9,C9それぞれファイルパスにしているのですが、C9のみが添付されます。
    C9の記述を省いた場合は、B9のみが添付されます。

    2)上記のように添付する場合、「特定のフォルダ以下の階層」から「特定のセルに表記したファイル名」と同じ名前のファイルを検索して添付することは可能でしょうか?