まりふのひと

Excel/VBAでワークシート関数を使うのに苦戦

結論はこちら


パソコン同好会で使っている「よくわかる Microsoft Office Excel演習問題集」の Lesson36 に「カレンダー」がある。「インストラクターのネタ帳」にも、年度末のこの時期、結構なアクセスがある らしい。
因みに、「Excel演習問題集Lesson36「カレンダー」の補完」のアクセス件数を調べてみた。


一週間後に迫った来年度、当区の自治会会長をすることになったが、途端に入ってきた業務が「集会所の予約」管理。j留守にすることが多い(アウトドア志向のため)k無携帯電話。で、上述のカレンダーのことがあったので、「実務に役立つカレンダー」作りに挑戦、自宅のどのパソコンからでも見られるようにしよう...
Lesson36「カレンダー」は、予定は印刷して書き込む 方式である。例えば、パソコン同好会のように、「毎週○曜日の○時から使いたい」と言われると‥‥
そこでマクロを作成し、このような事態に対応出来るようなカレンダーの挑戦! の、第一歩でつまづいた。

VBAでワークシート関数を使うには

Excel2003のヘルプより

Visual Basic でワークシート関数を使用する
 Visual Basic ステートメントでは、ほとんどのワークシート関数を使用できます。使用できるワークシート関数の一覧を表示するには、ここをクリックしてください。
Visual Basic からワークシート関数を呼び出す
Visual Basic では、WorksheetFunction オブジェクトを介して Excel ワークシート関数を使用できます。
 次の Sub プロシージャは、Min ワークシート関数を使用してセル範囲の最小値を決定します。最初に、変数 myRange を Range オブジェクトとして宣言します。次に、この変数にシート 1 のセル範囲 A1:C10 を設定します。別の変数 answer には変数 myRange に Min 関数を適用した結果を割り当てます。最後に、変数 answer の値をメッセージ ボックスに表示します。

Sub UseFunction()
    Dim myRange As Range
    Set myRange = Worksheets("Sheet1").Range("A1:C10")
    answer = Application.WorksheetFunction.Min(myRange)
    MsgBox answer
End Sub

 引数として範囲参照を必要とするワークシート関数を使用する場合、Range オブジェクトを指定する必要があります。たとえば、Match ワークシート関数を使用してセル範囲を検索できます。ワークシート セルには、=MATCH(9,A1:A10,0) などの数式を入力します。しかし、Visual Basic プロシージャでは、Range オブジェクトを指定することにより、同じ結果が得られます。

Sub FindFirst()
    myVar = Application.WorksheetFunction _
        .Match(9, Worksheets(1).Range("A1:A10"), 0)
    MsgBox myVar
End Sub

使いたかったのは VLookup 関数。上記ヘルプを真似て次のようにコーディングした。

    strAns = Application.WorksheetFunction _
        .VLookup(datDate, Worksheets("予約").Range("A2:D366"), 4, False)

実行すると、「実行時エラー'1004' / WorksheetFunctionクラスのVLookupプロパティを取得できません」


そう言われても、私も困るんです...
ググっていると、
 そのエラーは見つからなかったときに出るものです。
でも、見つからない可能性はあるわけですから、通常はそれを考慮したコードを書くものなのですよ ‥‥
閃いてエラートラップしたが、「検索されてもいいはずなのに出来ない」状態が続く...


編集後記

  1. Excel VBAでワークシート関数を使うには、エラートラップすること!
  2. 属性を確実に合せること。
    • 今回、検索キーは「日付」だったので、DateSerial関数で「日付型」のデータ(datDate)を作った。
    • Excelテーブルの日付は「シリアル値」なので、がこれが検索できなかった原因。
      • lngDate(as Long) = datDate(as Date) で属性変換し、
      • .VLookup(lngDate, Worksheets("予約").Range("A2:D366"), 4, False) で検索できた。
  3. 結局、8時間要してマクロβ版が完成した。