VBA: 2008年3月アーカイブ

コレクションに、ある値(メンバー)が既に存在するかをチェックする関数
重複チェックなどに便利です。
Function isMemberOfCollection(col As Collection, query) As Boolean
    Dim item
    
    For Each item In col
        If item = query Then
            isMemberOfCollection = True
            Exit Function
        End If
    Next
    
    isMemberOfCollection = False
    
End Function
使うときは、
If isMemberOfCollection(myCollection, myValue) Then
    MsgBox "エラー:" & vbLf & vbLf _
     & "値が重複しています。" &  myValue
    End
End If
のような形で呼び出します。
エラー処理などに使えます。
VBAでMsgBoxを表示すると、OKボタンを押すまで処理が中断してしまうので不便だなーと思っていました。
調べてみたら、教えてGoo!に良いやり方が載っていました。
Sub test()
  Dim myShell As Object
  Set myShell = CreateObject("Wscript.Shell")
  myShell.PopUp "ここにメッセージ", 5, "ここにタイトル"
  Set myShell = Nothing
End Sub
ExcelのVBAでもPowerpointのVBAでもこのコードで動きます。
アプリの処理中に、ユーザにメッセージを伝えるのに使えそうですね。
プログレスバーで進捗表示してもいいんですが、処理が大げさになりがちなので、こっちの方が簡単ですね。
これは便利!

foreachを使ってますか?

初級プログラマに意外と知られていないforeach。

何が便利かというと、
カウンタや添え字(index)を意識せずに、配列の要素に対してアクセスし、何らかの処理をすることができます。

foreachを使わない場合、

for(i=0;i<=n;i++){ print 配列名[i]; }
のように、配列の要素数とカウンタを使ったダサイ記述をするハメになります。
一方、foreachを使えば楽ができます。

私はこのforeachが大好きです。
foreachのおかげで、配列が好きになりました。

以下、Perl , PHP, VBA, JavaScriptで、配列の全要素を表示する例です。

Perl  
foreach my $item (@items) { print $item; }
PHP
foreach ( $items as $item){ echo $item; }
JavaScript
for(var i in items){ alert(items[i]);}
VBA  
For Each item In items
  MsgBox item
Next


※注1 Perlの場合は、さらに短く書けます。
foreach (@items){ print $_ ;}  または
for(@items){ print $_;}      または
print for @items; 

※注2 VBAのこのコードは、厳密にはコレクションといって、配列とは別のものです。 しかし実質的には配列のように使えます。

このアーカイブについて

このページには、2008年3月以降に書かれたブログ記事のうちVBAカテゴリに属しているものが含まれています。

前のアーカイブはVBA: 2008年2月です。

次のアーカイブはVBA: 2008年5月です。