[[20170330111643]] 『エラー'1004'WorkSheetFunctionクラスのVlookupプ』(misskabu) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『エラー'1004'WorkSheetFunctionクラスのVlookupプロパティを取得できません』(misskabu)

VBAのワークシート関数vlookupで検索した場所の値を書き換えたいのですが
エラーで動きません。
同じエラーで詰まっている事例をグーグルで調べてやってみましたがうまくいきませんでした。
何が間違っているのかどなたか教えていただけませんか?

Option Explicit
Private Enum 行

    最高気温 = 2
    天候 = 6
    日付 = 5
End Enum
Private Enum 列
    最高気温 = 4
    天候 = 5
    日付 = 4
End Enum

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim 最高気温セル As Range: Set 最高気温セル = Cells(行.最高気温, 列.最高気温)
    Dim 天候セル As Range: Set 天候セル = Cells(行.天候, 列.天候)
    Dim 日付セル As Range: Set 日付セル = Cells(行.日付, 列.日付)
    Dim 最高気温 As Integer
    Dim 日付 As Date
    If Target = 最高気温セル Then
   MsgBox "ChangeMethod start!!"   'これは反応するのでイベントは発動しています
        最高気温 = 最高気温セル.Value
        日付 = 日付セル.Value
        Dim 販売予測シート As Worksheet: Set 販売予測シート = Worksheets("販売予測")
        Dim 印刷シート As Worksheet: Set 印刷シート = Worksheets("印刷") 'このページから起動するマクロです。
        Dim maxrow As Integer: maxrow = 販売予測シート.Range("A1").End(xlDown).Row
        販売予測シート.Activate 'ここでシートは意図したページに画面切り替わっています
        Dim 検索範囲 As Range: Set 検索範囲 = Range("A:C")
        Debug.Print 販売予測シート.Cells(33, 1) '2017/04/01
        Debug.Print 販売予測シート.Cells(33, 3) '16
        Debug.Print TypeName(販売予測シート.Cells(33, 1).Value) 'Date
        Debug.Print ActiveSheet.Name '販売予測

        Stop 'この次の行でエラーが出ます。
        '実行時エラー'1004'WorkSheetFunctionクラスのVlookupプロパティを取得できません。
        'ローカルウィンドウに 日付 値#2017/04/01# 型Date と出ています。LongとStringにキャストしてみましたが変わりませんでした。
        'ワークシートから同じ場所をvlookupで検索すると16が返ってきます
        '範囲の指定の仕方が間違っているようなのですがRangeの中身をどう検査していいかわからず詰んでしまいました。
        Application.WorksheetFunction.VLookup(日付, ActiveSheet.Columns("A:C"), 3) = 最高気温
    End If
End Sub

< 使用 Excel:Excel2007、使用 OS:Windows10 >


 コード全体は読んでいないのですが VLOOKUPの結果を取得したいのですね?

 ふつうは

 変数 = Application.WorksheetFunction.VLookup(・・・) ですけど、

 アップされたコードは

 Application.WorksheetFunction.VLookup(・・・) = 変数

 これっておかしいですよね?

 あと、老婆心ですが、検索した日付が存在しない場合がありえるなら、
 Application.WorksheetFunction.VLookup は失敗し、実行時エラーになります。

 (そもそも、Application は、ことさらつける必要はなく、単に WorksheetFunction.VLookup でいいのですが)

 そういう場合も想定するなら WorksheetFunctionクラスのVLOOKUP ではなく ApplicationクラスのVLOOKUP
 を Variant型の変数で受けます。

 つまり、変数 = Application.VLookup です。

 で、変数の値を IsError で判定し、見つからなかった場合の条件分岐が必要になりますね。

( β) 2017/03/30(木) 11:58


 追加で。

 日付検索は、なかなかやっかいです。

 VBA で VLOOKUP を使う場合、検索値が 日付型 であれば (おそらく)失敗します。
 検索には日付のシリアル値を与える必要があるかと。
 なので、Dim 日付 As Date ではなく Dim 日付 As Double(あるいはSingle)としておく必要がありますね。

( β) 2017/03/30(木) 12:20


私からも疑問点を。

まず、このマクロはどのシートに書かれているものなのでしょう? 例えば、最高気温セルはマクロを書いたシートにありますが、検索範囲は元シート(Me)を指すようです。「販売予測」シートを見るならば、Set 検索範囲 = 販売予測シート.Range("A:C") と明示しましょう。

元データがどのようにレイアウトされているか判らないので、コードが追いにくいです。コメント書きしてくれているので、なんとなく推測はできますが。問題になっているのは、データ型の違いかと思いますが、代入が逆だったり、なにかおかしくなってしまっていますね。試しに、文字列だけの列を用意してみて、文字列でWorksheetFunction.VLookupを試してみて、次に日付に変えてみると良いかと思います。
(???) 2017/03/30(木) 13:04


ご回答いただいた皆様、コメントありがとうございます。
まだうまくいきませんが、皆様のおかげで幾つか原因もわかってきました。
シート指定を明示すると少し進展しました。Meをローカルウィンドウでみたら"印刷"シートになっていました。ありがとうございます。
また変数の代入がおかしいと指摘されて、そもそもvlookupじゃなくて一度findでセルを取得してから書き換えればいいのだと気がつきました。
日付以外の列をFindで検索すると期待したセルが返ってくるが、日付列はうまくいかない事がわかりました。

ご指摘の通りDoubleにキャストしてみましたがnothingで返されてしまいます。
そこで単にエクセルシートからCtrl+Hで検索しようとしたところ、2017/4/1 でも 42836(シリアル値)でもヒットしない事が判明しました。
このあたりの型指定に問題がありそうです。
もう少し頑張ってみます。
ご協力ありがとうございました。
(misskabu) 2017/03/30(木) 14:06


おかげさまでうまくできました。
日付のFind検索に関してはwhat:=Date型日付 Lookin:=xlValuesと指定すれば動作しました。
プログラム以前にエクセルの日付検索自体が非常に難解だということがわかりました。
色々エラートラップをしないとユーザーの操作によって止まるそうですが、とりあえず従業員に
配布できそうなところまできました。
ご協力ありがとうございました。

(misskabu) 2017/03/30(木) 14:55


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.