DT Blog

クレスコDTのエンジニアが
IT基礎知識から最新トレンドまで、技術ノウハウを発信

catch-img

【初心者向け】VBAで実現する業務効率化|マクロの記述例もご紹介

こんにちは。クレスコ・デジタルテクノロジーズ プロフェッショナルサービス3部の中です。
今回はマクロを作成するための言語であるVBA(Visual Basic for Applications)について、業務での活用案をご紹介いたします。
 
VBAの概要については、過去記事の「VBAの概要と業務への活用案について」で説明をさせていただきましたので、VBAの概要から知りたい方はそちらも併せて御参照ください。

■前回の記事はこちら↓
前回ブログ記事:VBAの概要と業務への活用案について

  VBAの概要と業務への活用案について 初めまして。クレスコ・デジタルテクノロジーズ プロフェッショナルサービス3部の中です。 多くの方が、業務の中でマクロが有効化されたエクセルファイルを扱ったことがあるのではないかと思います。ただ、使い方を教わることはあっても、実際にマクロの作り方を学べるチャンスは意外と少ないのではないでしょうか?今回は、マクロを作成するための言語であるVBA(Visual Basic for Applications)について、その概要と業務での活用案に関して説明させていただきます。 株式会社クレスコ・デジタルテクノロジーズ


■あわせて読まれている資料:
対応事例やソフトウェアテクノロジーサービス一覧を掲載!
ソフトウェアテクノロジーサービス

  ソフトウェアテクノロジー資料ダウンロード|株式会社クレスコ・デジタルテクノロジーズ 最先端のデジタル技術の豊富な知見に基づき最も効果的なソリューションを提供します。 クレスコ・デジタルテクノロジーズは、大手電機メーカー様との提携に基づく製造業のノウハウを背景に、2015年4月よりPLM事業を開始。2015年6月には、PLMパッケージであるAras Innovatorを提供している米国Aras社とシステムインテグレーションパートナー契約を締結し、数多くのAras Innovator案件に対応しています。 株式会社クレスコ・デジタルテクノロジーズ


目次[非表示]

  1. 1.VBAを使ったマクロをボタン操作で呼び出す
  2. 2.活用案①VBAを使ってExcel上の表示内容を切り替える
  3. 3.活用案②VBAを使ってディレクトリを作成する
  4. 4.活用案③VBAを使ってメールを作成する
  5. 5.まとめ
  6. 6.引用元


VBAを使ったマクロをボタン操作で呼び出す

VBA(Visual Basic for Applications)は、Excel等からVBE(Visual Basic Editor)を起動し、記述した処理を実行することで定型的な操作を自動的に繰り返すことができます。
 
その際、使う頻度の高いマクロを都度VBEを起動して実行させるのは非常に手間となります。そのため、実行させるマクロに対応したボタンを配置して、クリックで呼び出すことで指定のマクロを即座に実行することが一般的な利用方法となります。
 
ボタン配置のために、エクセルのリボン上に「開発」タブを表示しておく必要があります。基本的にはボタンに対応するマクロを準備してからボタン配置を行うため、「開発」タブの表示方法はここでは省略します。

〇ボタン配置の手順
1.開発タブから「挿入」をクリック
2.表示されるメニューから「ボタン(フォームコントロール)」をクリック


3.マウスポインタをドラッグして、ボタンの大きさを設定する
4.マクロの登録ダイアログボックスが出てくるので、対応するマクロを選択し、OKを押下する。


5.クリックすると、選択したマクロを実行するボタンが配置される。
※配置したボタンを右クリックして「テキストの編集」を行い、ボタン名を任意の名前に変更しておくと、ボタンの押下がどの操作につながるのか分かりやすくなります。
ボタン配置方法については以上となります。以降の項目では、VBAを使用したマクロの活用案について説明します。



活用案①VBAを使ってExcel上の表示内容を切り替える

(業務でお客様向け資料を作成する際など、編集段階では内部向けの数値を表示し、完成時に非表示にする形式は、一般的使われています。
(例1)編集中の表示


(例2)編集が完了し、お客様向けに提示する際の表示


例で示したような数列・数行の非表示であれば手動での操作でも問題ないかもしれませんが、頻度の高い作業や操作数の多い資料においては、自動化しておくことで作業時間の削減や誤動作による表記ミスの防止につながります。
このマクロを実現するにあたって、以下の点に考慮する必要があります。
①   該当の行列を非表示にするマクロの実装
②   再度編集を行う場合に備え、非表示にした行列を再表示するマクロの実装
③   作業量軽減のためのマクロボタンの実装
それぞれの動作を実現するためのマクロの記述と懸念点を、以下に記載します。


①の動作を実現するマクロについては、以下の記述を基に作成することができます。

Sub 任意のマクロ名()
    Rows("非表示にする行数").Hidden = True
    Columns("非表示にする列英数").Hidden = True
End Sub

非表示にする行列の指定の際、該当行列が連続した範囲であれば、(“2:10”)や(“B:F”)のように記載することで、それぞれを始点・終点とした範囲の複数行・列を一度に非表示にすることもできます。


②の動作については、①の動作により資料を成形した後、修正箇所が見つかって再度編集を行う必要が生じた場合などに備え、用意しておく必要があります。動作を実現するマクロとしては、以下の記述を基本として作成することができます。①のマクロと同様に、複数の行・列を一度に指定することも可能です。

Sub 任意のマクロ名()
    Rows("非表示にする行数").Hidden = False
    Columns("非表示にする列英数").Hidden = False
End Sub


③の動作については、作業頻度が高い場合は都度VBEを起動してマクロを実行するのは手間になるため、実装しておくことを推奨します。
同記事内で紹介したマクロをボタンで呼び出す方法を参照し、適切な箇所にボタンを配置してください。



活用案②VBAを使ってディレクトリを作成する

日次作業で、作業実績を日ごとのフォルダ(YYYYMMDD形式)に格納する形式は珍しくありません。
このような大量のフォルダを作成する際、手動ではかなりの手間がかかります。こうした場合でも、最小限の編集とマクロで処理することができれば、作業時間の削減が見込めます。

今回は、日付ごとの名称を指定したフォルダを一度に作成する場合を想定して、マクロの記述を提示させていただきます。
前提として、以下のような構成のディレクトリを作成する業務を想定します。

YYYY年MM月
┗YYYY年MM月DD日
┗YYYY年MM月DD日
┗YYYY年MM月DD日
…

対象月のフォルダ配下に、その月の1日から最終日までの日付名のフォルダが存在しているものとして、考慮すべき要素としては以下となります。
①   作成対象の年月日をどのように指定するか
②   マクロ上でフォルダを作成させる
③   指定の日付分までフォルダ作成を繰り返す


①の動作について、定期的に行う必要がある作業という前提のもと、その時点でどの月の分のフォルダ作成を行うのか指定する必要があります。作成の度にマクロ内の数値を書き換えるのは現実的ではないので、今回はExcelシート上に必要な数値を入力させる場所を用意する方法を取ります。
以下のように、どこに何の数値を求めているのか分かるような作りにしておくと、後々の業務時に楽になると思います。


②の動作について、MkDirステートメントを用いてフォルダを作成します。基本的には以下の記述を基にして、必要なフォルダを作成することができます。

Sub 任意のマクロ名()
    Mkdir("作成するフォルダ名")
End Sub

上記の記述では、マクロフォルダの配置されている場所に指定した名称のフォルダが作成されます。ただし、この要素だけで今回の動作を実現するマクロを作成することはできません。

今回のように大量のフォルダ作成の動作を実現する場合は記述が膨大になる上、月ごとに日数が異なるため、一律に31個フォルダを作成させるといった手段は現実的ではありません。また、マクロファイルの格納場所も限定されてしまうため、不便さが残ります。これらを解決するため、③の動作について考慮する必要があります。
 
③の動作において必要な要素を解決するため、今回は変数とFor文を利用した記述を提示させていただきます。変数を用いて、①において指定した年月日に基づいたフォルダ作成処理を、For文を用いて繰り返させる記述によって、今回の動作を実現させます。マクロの記述例としては、以下の通りです。

Sub Mkdir_YYYYMMDD()
    Dim fold_path As String
    Dim fold_pathD As String
    Dim i As Integer: i = 1
    Dim arr() As String
    Dim DirY As String
    Dim DirM As String
    Dim DirDE As Integer
    DirY = Range("B6").Value ‘動作①で情報を入力させたセルを指定
    DirM = Range("B7").Value ‘動作①で情報を入力させたセルを指定
    DirDE = Range("B10").Value ‘動作①で情報を入力させたセルを指定
    fold_path = "作成場所のフォルダパス" & DirY & "年" & DirM & "月"
   
    If Dir(fold_path, vbDirectory) = "" Then
        MkDir fold_path
    End If
   
    arr = Split(fold_path, "")
    fold_pathD = arr(0)
 
    For i = 1 To DirDE
        fold_pathD = fold_path & "" & DirY & "年" & DirM & "月" & i & "日"
        If Dir(fold_pathD, vbDirectory) = "" Then
            MkDir fold_pathD
        End If
    Next
   
End Sub

上述のマクロでは、①の動作で入力させた情報をもとに、該当月の1日から最終日までフォルダ作成を繰り返させる動作を実行させています。日ごとのフォルダの上位に月ごとのフォルダ(YYYY年MM月)が存在しているので、今回は月フォルダが存在しなかった場合にそれも作成する動き(If Dir~End If)を加えています。
 
For i~Next内の記述では、1日からユーザーの入力した最終日まで該当のフォルダが作成されているかどうか確認し、存在しなければその日付のフォルダを作成する、という動きを実施しています。何らかの理由で既に一部日付分だけフォルダが作成されていた場合にも、問題なく動作するようにIf分を用いた条件分岐の処理の中にフォルダ作成の記述を盛り込んでいます。



活用案③VBAを使ってメールを作成する

業務完了報告メールをはじめ、本文にほとんど変化がない定期送信メールは、業務内で数多く存在しています。

過去分のメールから内容をコピーして作成することもできますが、コピペ後の修正漏れのリスクや過去メールを参照する手間を考慮すると、こうした作業も可能な限り自動化することで作業時間の削減が見込めます。

例として、日次でその日の障害件数を連携するメールを送信する作業を想定した時、必要な動作としては以下となります。

①   マクロ上でメールを呼び出す
②   送信日ごとに異なる情報をメール内に反映させる

①   の動作について、ここではOutlookを使用したメール作成・送信を行うものと想定します。まずVBA内でOutlookオブジェクトを扱えるように、VBEの「ツール」⇒「参照設定」から「Microsoft Outlook 〇.〇 Object Library」にチェックを入れる必要があります。

参照設定が完了したら、VBAでOutlookが使用できるようになるので、②の動作を踏まえてマクロを記述していきます。

②の動作を実現するにあたって、前項目のディレクトリ作成時と同様、必要な情報をExcelシート内に記述させる方法を採用します。

上述の情報を基にしたマクロの記述例としては、以下の通りです。

Sub Mailsakusei()
    Dim objOutlook As New Outlook.Application
    Dim objMailitem As Outlook.MailItem
    Dim Name As String
    Dim Day As String
    Dim Ins As String
    Dim strBr As Variant
    strBr = Chr(13)
    Set objMailitem = objOutlook.CreateItem(olMailItem)
    Name = Range("D5").Value ‘Excelシートの情報を入力させたセルを指定
    Day = Range("D6").Value ‘Excelシートの情報を入力させたセルを指定
    Ins = Range("D7").Value ‘Excelシートの情報を入力させたセルを指定
 
    With objMailitem
        .To = "xxxxx@gmail.com" 
        .CC = "yyyyyyyy@gmail.com"  
        .Subject = Day & " 障害件数報告"
        .Body = Name & "様。お疲れ様です。" & strBr _
                & Day & "分の障害発生件数は" & Ins & "件となります。" & strBr _
                & "以上、よろしくお願いいたします。" '本文
        .Display    '新規メール画面を表示
    End With
End Sub


メールの本文情報をExcelのシート状に記載させ、本文メールに取り込む形式のマクロも作成できますが、今回は「本文内に日付ごとに変動する情報が含まれている」ことを想定し、送信時の修正漏れのリスクを軽減するため、本文をマクロ内に記述し、変数を組み合わせて作成する形式での記述を例として挙げています。
 
宛先などが頻繁に変わる場合は、Excel上のシートに作成情報として記載させてマクロ内で取り込んで作成する形式に変えても良いかもしれません。


まとめ

今回は、VBAを業務効率化に活かすにあたっての活用案をご紹介させていただきました。VBAを用いた自動化はさまざまな業務に活用できますが、今回はその中の一部の紹介に留まります。
ここまで目を通していただき、ありがとうございました。拙い文章ではございましたが、また機会があれば、より深い内容での活用案をご紹介できればと思います。


■サービス資料一覧はこちら↓

  資料ダウンロード一覧|株式会社クレスコ・デジタルテクノロジーズ クレスコ・デジタルテクノロジーズのサービスに関する資料の一覧ページです。 株式会社クレスコ・デジタルテクノロジーズ



引用元

いちばんやさしいExcelVBAの教本 人気講師が教える実務に役立つマクロの始め方

中 優人
中 優人
部署名:プロフェッショナルサービス3部

おすすめ資料はこちら

最先端のデジタル技術の豊富な知見に基づき最も効果的なソリューションを提供します。
クレスコ・デジタルテクノロジーズは、大手電機メーカー様との提携に基づく製造業のノウハウを背景に、2015年4月よりPLM事業を開始。2015年6月には、PLMパッケージであるAras Innovatorを提供している米国Aras社とシステムインテグレーションパートナー契約を締結し、数多くのAras Innovator案件に対応しています。

CONTACT

社内システムのお悩みを私たちだけで解決へと導きます

お役立ち資料は
こちらから

不明な点はお気軽に
お問い合わせください