Home Authors Posts by best

401 ポスト 0 コメント

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

Q.このブログを見ながらいろいろなファイルに便利なマクロ機能を付けたりしています。それで人に使ってもうらうようにマクロ入りブックを作って渡しているのですが、操作したり入力したりしたときに、エラーや間違いの入力に対してメッセージを表示したいと思っています。Excelのシート上のどこかのセルに表示することはできますが、保存したときにその文字も一緒に保存されてしまうので、できればポップアップメッセージにしたいのですが。

A.このような場合には、MsgBox(MessageBoxの略)という関数が用意されています。こちらの説明を致しましょう。

まずは実物を見て頂いた方が良いかも知れません。シート上にボタンを貼り付け、このプロシージャに以下のコードを記述して下さい(ボタン名は「ボタン1」とします)※。これがどのような処理を行うか想像できますか。

※補足:「開発」タブで「デザインモード」を選択した後、「挿入」からボタンのアイコンを選ぶ。シート上に配置したら「マクロの登録」が自動的に表示されるので、そこから「ボタン1_Click()」を選択する。

Sub ボタン1_Click()
If Cells(1, 1).Value > 130 Then
MsgBox (“年齢は130歳までで入力して下さい”)
End If
End Sub

マクロを作ったことのある方ならだいたいおわかりでしょう。A1セルで入力した数字(これは年齢を想定)をチェックする関数であり、If文で130を超える入力があった場合は、メッセージボックスを表示します。どのように表示されるかは、試してみて下さい。

さて、ここまでで単純な文章の表示はできます。次はちょっと応用してみましょう。
まずは、改行を入れる場合です。メッセージボックスで2行表示するためには、 vbcr という定数を使います。早速、見てみましょう。

Sub ボタン1_Click()
Dim limit As Integer
limit = 130
If Cells(1, 1).Value > limit Then
MsgBox (“年齢が上限値を超えています。” & vbCr & “年齢は” & limit & “歳までで入力して下さい”)
End If
End Sub

“”でくくられた文字列を vbcr で連結(&)すれば良いですね。もう一つ工夫したのが分かって頂けましたか?
今回のご紹介とは直接関係はありませんが、上限値チェックと表示の値(年齢)を、変数 limit で同じ値で参照するようにしました。
こうすれば、年齢の上限値を変更する際に、変更箇所が1箇所で済むので、「保守性」が高まりますね。
このような観点にも注意して、マクロ開発をして頂ければと思います。

Q.前回ご質問させて頂きました、ある日付が休日かどうかを判定するのにIsNonWorkDay関数を便利に使っているのですが、いろんなファイルにこの関数を登録するのが面倒だし、最近、休日判定の部分のプログラム(コード)を足したいと思っているのですが、今まで登録した全てのファイルを直さないといけないと思うと憂鬱です。どこか1箇所で管理できないのでしょうか?

A.使用上の不便に対して、良い改善点に気づきましたね。このような場合は、Excelでは「アドイン」という仕組みを使います。

前回のご質問でお答えしたとおり、Excelでは、VBAのFunctionを、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%a6%e3%83%bc%e3%82%b6%e3%83%bc%e5%ae%9a%e7%be%a9%e9%96%a2%e6%95%b0%e3%82%92%e4%bd%bf%e3%81%86/

ここで作成したユーザー定義関数「IsNonWorkDay」を、いろんなワークブックで使いたいと言うことですね。いろんなワークブックというより、自分のパソコンで開く全てのワークブックで使えるようにする、これがアドインです。

さて、それでは実際の手順を追って説明しましょう。
まず、新しいワークブックを開き、前回用意した、InNonWorkDay関数を標準モジュールにコーディングして下さい。(ちゃんと動作確認はして下さいね)
その後は、下記の手順でアドインとして保存します。

1.「ファイル」タブの「名前を付けて保存」をクリック
2.「コンピュータ」の「参照」をクリック
3.「名前を付けて保存」のダイアログが開くので、「ファイルの種類」から「Excelアドイン」を選択
※この時点で、保存フォルダが自動的に「AddIn」フォルダに変わります。これがアドインの保存されるフォルダです。
4.「ファイル名」はお好きな(分かりやすいもの)ものとして、保存します。

この時点で、アドインファイルが作成されましたから、これを組み込みします。

1.「ファイル」タブの「オプション」をクリック
2.「Excelのオプション」ダイアログで左側の「アドイン」をクリック
3.「設定」をクリック
4.「アドイン」ダイアログで先ほど保存したアドインファイルの名前にチェックして「OK」で決定

これで、これから開くブックすべてで「IsNonWorkDay」関数が使えるようになります。
もちろん、他のユーザー定義関数でも同様のやり方が使えますから、お気に入りの自分だけの関数をアドイン登録すると便利に使えますね。

このようにアドインのユーザー定義関数を使うことで、いろんなファイルで、すぐに自分の用途に合ったユーザー定義関数が使えるというメリットがあります。ただし、逆のデメリットとしては、自分で作ったユーザー定義関数入りのアドインが、他の人のパソコンにない場合、これまで説明した手順でアドインを渡して追加してもらうか、ブックの標準モジュールで定義しなおさないと使えなくなります。
その点を踏まえて、状況に応じて便利に使っていきましょう。

Q.Excelでスケジュール管理などを行っていて、日程が休日かどうかを判定するのにWEEKDAY関数を使っていますが、これだと祝日や会社の創立記念日などの休日が判定できません。何か良い方法はありませんか?

A.ユーザー定義関数で、休日かどうかを判定する関数を作成しましょう。

Excelでは、VBAのFunctionを、Excelのワークシートで使うことができます。これをワークシート関数に対して、「ユーザー定義関数」と呼んだりします。まずは下記のコードを「標準モジュール」の関数(Function)として作成して下さい。

Function IsNonWorkDay(d As Date)

IsNonWorkDay = False

If WorksheetFunction.Weekday(d) = 1 _
Or WorksheetFunction.Weekday(d) = 7 Then ‘★土日の判定
IsNonWorkDay = True
Else
If Month(d) = 4 And Day(d) = 1 Then ‘★創立記念日
IsNonWorkDay = True
End If
End If

End Function
これでユーザー定義関数「IsNonWorkDay」ができました。先にこの関数のコードを説明しましょう。まず、この関数は何もなければFALSEつまり休日でないとの結果を返します。この後のIF分では、休日となる条件を判定し、その場合にこの関数の戻り値をTRUEすなわち休日として返すような作りになっています。ひとつめの★部分で、ワークシート関数のWeekdayを使用して、この値が1(日曜日)または7(土曜日)の場合にTrue(つまり休日と判定する)を返します。もしここで休日でなければ、次の★の部分の処理で、土日以外の休日判定をします。この例では、4月1日が会社の創立記念日で休日と判定されるようになっています。この後に、例えば国民の休日の日付などを追加することで、IsNonWorkDay関数で全ての休日を判定できるように処理することができます。

さてこのIsNonWorkDay関数は、ワークシートのセル上で、普通のワークシート関数と同じように使用できます。試しにA1セルに任意の日付を入力し、A2セルに =IsNonWorkDay(A1) を入力してみましょう。TRUEと表示されれば休日、FALSEと表示されれば休日ではありませんが、期待した結果になっていたことと思います。
このように、ユーザー定義関数を使うことで、セルの式がすっきりするというメリットがあります。ただし、逆のデメリットとしては、自分で作ったユーザー定義関数の入ったシートは、きちんと説明しないと、別の人が使う場合にかえってわかりにくかったりします。
その点を踏まえて、状況に応じて便利に使っていきましょう。

Q.Excelのマクロ付きブックで、商品管理を行っているのですが、商品毎にECサイトの価格をチェックする業務があります。その際、商品にあったECサイトを表示するボタンを設けたいと思うのですが、VBAからインターネットエクスプローラーを起動し、サイトを表示することはできるのでしょうか。

A.Excelマクロでは、InternetExplorer.Applicationというオブジェクトを使用すれば簡単に実現できます。

まずは簡単なやり方でインターネットエクスプローラーの表示方法を確認しましょう。
下記は、マクロの中で書いたアマゾンのサイトを表示させるコードとなります。

Sub ExecIE()

Dim ie As Object
Set ie = CreateObject(“InternetExplorer.Application”)
ie.Navigate “http://www.amazon.co.jp” ‘★
ie.Visible = True

End Sub

Excel画面の「開発」リボンの「マクロを表示」から上記関数を選択し直接実行して動作に問題がないか確認して下さい。
それができたら、後は簡単ですね。コード中の★の部分を、商品にあったECサイトのアドレスが代入されるようにプログラムを変更すれば良いのです。
このようにして、単純なホームページの表示は実現できます。

ここからは、さらに発展した使い方です。
ECサイトでは、多くのサイトで、サイトのアドレス(URL)にパラメーター(商品名や、ISBNなど)を付けることで、商品ページをダイレクトに表示できるような仕掛けがあります。
例えば、Amazonでは、”http://www.amazon.co.jp/gp/search?field-keywords=” の後ろに、検索キーワードを入れたURLで、検索結果のページがすぐに開きます。
※ただし、ここで指定できるのは英語のみ。日本語は、「エンコード」という処理をしないと正常に処理されません。これについては、興味ある方は調べてみて下さい。
この方式が分かれば、Excel上に記入した、ある商品の名前をamazonで検索した状態でインターネットエクスプローラーを開く、という処理が自動化できるということになります。
アイデア次第でいろいろ活用できそうですね。是非、ご活用下さい。

Q.マクロを使って、あるフォルダに集められた週報のファイルを一覧にして作業をすることになりました。フォルダのファイルを一覧して表示するようなVBAのコマンドはあるのでしょうか。

A.Excelマクロの関数「Dir」を使用すれば、比較的簡単にファイルの一覧を取得できます。

週報が格納されているフォルダを c:\週報 とした場合の、まずはコードを先に示します。
Excelのマクロ付きブックを新規で作成し、「開発」リボンからVisual Basic Editorを起動して下さい。
ファイルの一覧の出力対象とするシートをVisual Basic Editorの左ペインから選択し、コードエディタから下記を記述します。

Sub ファイル一覧
Dim row as Integer
Dim fileName as string
fileName = Dir(“c:\週報\*.*”) ‘★(1)

row=1
Do Until fileName = “”
Cells(row,1).Value = fileName ‘★(2)
fileName = Dir()
row = row + 1
Loop
End Sub

これを実行すると(Excel画面に戻って、「開発」リボンの「マクロを表示」から上記関数を選択し実行する)、選択しているシート上のA1から下にファイルの一覧が表示されたと思います。
まず、★(1)の部分で、Dir関数の引数に、対象のフォルダを指定します。このとき、「*.*」を指定することで存在する全てのファイルを指定しています。
※このような指定の方法を「ワイルド・カード」と言います。*は文字は任意の文字の任意の回数の繰返しを示します。
従って、「*.*」は、拡張子(Excelならxlsx)付きのファイル名なら何でも、ということですね。
その後、★(2)では、Dir関数の引数をなしにすることで、前回Dir関数を行った対象のフォルダを続けて検索する、と言う意味になります。
(★(2)で★(1)と同じ対象フォルダを指定すると、都度新たに検索をはじめからやり直すことになるので、ずっと1個目のファイルが表示され続け止まらなくなるので注意してください!)
そして対象のフォルダからファイルが見つからなくなると、Dir関数が空文字を返すので、はじめのDoループを脱出して、処理終了となります。

こちらの処理もいろんな業務効率化のマクロで使えそうなので、是非マスターして下さい。