2017年7月15日土曜日

エクセルのマクロは、小技の利くコンピュータ言語なので、コードを作リ置きすると便利だよ -VBA・エクセル(そのほか)

アプリケーションのためのビジュアルベーシック

表計算ソフト、エクセルにあるマクロ機能は、便利なので皆さんご存知のはずです。
でも、これに使われているコンピュータ言語のVBAは、エクセル専用でもありません。

つまり、オフィスのワードやパワーポイントも、マクロが組込めるようになっています。
ただ、実装できる機能として用意されているレベルを見ると、エクセルが一番です。

まあ、エクセルで作った、作表は一つのデータベースとして見なしてよい分けです。
そして、個人業務では、せいぜい、数百件ぐらいまでのデータがほとんどでしょうね。

それ以上になると、会社がRDBとかちゃんとしたデータベースを構築するものです。
そうなると、それを操作する端末画面での処理作業になり、凡人でもできるんだな。

だから、MRP・ERPの基幹業務を管理していますと言われても、ただのオペレータ。
プログラムを組んだのでもないから、全然偉くないんだと思うけど、どう思いますか。

本当は、個人業務のデータを有効に分析できる能力のある方が、優秀なんだよ。
そして、個人が作ったデータベースなんて、エクセルだとしても千差万別なのです。

こういった一次資料みたいなデータを広集めてきて、別のブックに再集計してみる。
また、日常の業務は、同じファイル名で上書きしたり、シートを追加したりするもの。

つまり、データの収集、計算、保存は、一定のルールで管理されることが多いのだ。
だから、この手順を逆手にとって、複数ファイルを読み取り、別なデータに作り直す。

これが、手作業だったら気の遠くなるような話ですが、マクロだったら何とかなります。
でも、根底は小技の利くプログラミング言語「VBA」を駆使できることが、第一歩。

Visual Basic(ビジュアル・ベーシック)の略称ですが、視覚的な基本言語なのだ。
要するに、読めば分かるし、プログラムを組めるコンピュータ言語だってことでしょ。

そう思いつつ、会社で仕事をする振りをして、シコシコとVBAを勉強して来ました。
その結果と感想を述べさせてもらうなら、先ず小技の利いたプログラムを作ること。

こういったプログラムを多くコレクションしておくと、後々、役に立つようになるのですよ。
こういうのは、ネットでサンプルが良く紹介されているから、参考にしてみてください。

でも、ネットの情報がいい加減で、あまり参考にならず、コードの組めない時もある。
或いは、あまり教えると商売にならないので、プログラムのミソは、はぐらかすのかな。

というわけで、自分なりに面白そうなVBAのコードを作ったので紹介しちゃいましょう。
特に、(1)のコードは、ネットで幾ら探しても役立つコードが見つからなかったので、英語圏のVBA有志サイトから拾ってきたもので、日本人のサイトでもこれぐらい紹介しろよと叫びたくなりますが、これを機に紹介するので、是非、有効活用してもらいたいものだと思うのでした。


(1)アクティブではないが、開いているブックを、一つずつ確認して閉じる


※クリックボタンを押して実行します。
 一つのモジュールに二つのプロシージャを設定します。
 二つ目のプロシージャは、一つ目で呼び出され、実行されます。
 クリックボタンのあるブックは残されます。
 もし、これも閉じたいなら、For~Next分の後に、次のコードを組みます。
 Activeworkbook.Close SaveChanges:=True '保存して終了
 ※保存せず終了は、SaveChanges:=False にする。
 
-------------- モジュール内開始 --------------
Public WB As Workbook
Public AWb As String
Dim rc As Long


Sub ボタン1_Click()
AWb = ActiveWorkbook.Name

For Each WB In Workbooks
    If WB.Name <> AWb Then
    Call boxSelect
    End If
Next WB

End Sub

Sub boxSelect()

rc = MsgBox(WB.Name & vbCrLf & "閉じますか?", vbYesNo + vbQuestion)

If rc = 6 Then
WB.Close savechanges:=False
ElseIf rc = 7 Then
End If
End Sub
-------------- モジュール内終了 --------------

※このコードのミソは、ファイル名を気にせず、アクティブかどうかを変数で判断。
 そして、変数をコードに組んで実行させる記述(これ、賢いわ)
※メッセージボックスを関数にする場合、その結果で実行する戻り値は次の通り。
定数 説明
vbYes 6 [はい]ボタンが押された
vbNo 7 [いいえ]ボタンが押された


(2)電子サイコロのマクロコード
※クリックボタンを押して実行します。



-------------- モジュール内開始 -------------- 
Sub ボタン1_Click()
Dim Nr As Variant

Worksheets("Sheet1").Activate
Nr = Int((6 - 1 + 1) * Rnd + 1)
Worksheets("Sheet2").Cells(3, 3).Value = Nr

End Sub
-------------- モジュール内終了 --------------

お遊びみたいなものだけど、任意抽出なんかに使えます。


(3)日付時計

※クリックボタンを押して実行します。
 Win32 APIを利用するので、宣言します。
 これにより、メッセージボックスのタイムアウト(自動消滅)が実行できます。
 
-------------- モジュール内開始 --------------
Private Declare Function MessageBoxTimeoutA Lib "user32" _
(ByVal hWnd As Long, _
  ByVal lpText As String, _
  ByVal lpCaption As String, _
  ByVal uType As Long, _
  ByVal wLanguageId As Long, _
  ByVal dwMilliseconds As Long) As Long

Sub ボタン1_Click()
Dim YYMMDD As Variant
Dim HHMM As Variant

YYMMDD = Format(Now, "Long Date")
HHMM = Format(Now, "Short Time")
 
 MessageBoxTimeoutA 0&, YYMMDD & vbCrLf & HHMM, "日付時計", vbMsgBoxSetForeground, 0, 3000

'3000は、3秒のこと

End Sub
-------------- モジュール内終了 --------------

※Win32 APIを使う方法です。
これは、アプリケーションがWindowsの各機能にアクセスするための接点です。
このため、Windows上で動作するアプリケーションをさまざまに作成できます。
プログラミングの言語・開発環境において、使用できる便利な手段になります。





いいねと思ったら、二つポチっとね!



0 件のコメント:

コメントを投稿