[[20130328215903]] 『Vlookupがデバック』(k) ページの最後に飛ぶ

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

 

『Vlookupがデバック』(k)

 Sub yyy()

Application.ScreenUpdating = False

  ActiveSheet.Protect DrawingObjects:=False, Contents:=False, Scenarios:=False

  Dim myy, myi, myr
  Dim m As Variant, k As Variant, y As Long, w As Long, i As Long

' k = Range("c2").Value

m = Application.InputBox("検索NOを入力してください")
' k = m

        If VarType(m) = vbBoolean Then
        MsgBox "キャンセルされました"
     Exit Sub
Else
 End If
        With Worksheets("Sheet1")
            myy = Application.WorksheetFunction.VLookup(m, .Range("c10:e135"), 2, False)
            myi = Application.WorksheetFunction.VLookup(m, .Range("c10:e135"), 3, False)
            .Range("d2").Value = myy
            .Range("g2").Value = myi + 1
            .Range("c2").Value = k

        MsgBox m & "が入力されました"

        End With

  myr = InputBox("メーカ名確認後数量を入力してください!")

   i = m + 10

     If IsNumeric(myr) Then
        Cells(i, 5).Value = Cells(i, 5) + myr

    Else
        MsgBox "計算できない値です"
    End If
     MsgBox "「NO」にて入力してください"
      If IsNumeric(myr) Then
      y = InputBox("年齢を入力 NO 9〜13")
        Cells(i, y).Value = Cells(i, y) + myr
      w = InputBox("来訪動機 NO 14〜22")
        Cells(i, w).Value = Cells(i, w) + myr
    End If
'
    Application.ScreenUpdating = True
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

End Sub

 c10:e135までの範囲でApplication.WorksheetFunction.VLookupを
 使いたいのですが デバッグになりますどこがおかしいのか
 教えて頂きたいのですが 宜しくお願いします

 検索値がヒットしないのでエラーになっている・・・のではないか?

 そんなハズはないと云うことなら、検索値のデータ型が、合っていないのだと思います。
 つまり、数値であるべきなのに数字(文字の一種)が入った・・・のではないか?

 >m = Application.InputBox("検索NOを入力してください") 
   m = Application.InputBox("検索NOを入力してください", Type:=1)
                                                              ↑
                              数値型を指定してみる

 (半平太) 2013/03/28(Thu) 22:27

 エクセル上で#N/Aや#VALUE!等のエラーを返すシート関数を WorkSheetFunction.関数 と、
 WorksheetFunctionクラスのものを使うと、エラー時に、実行時エラーで中断する。
 そのような関数を使う場合は、Applicationクラスのものを使う。そうすると実行時エラーにはならず
 「エラー値」がかえってくるので、それを判定する。
 エラー値が返っても受けられるように、受ける変数はVariant型にしておく。
 (アップされたコードではVariant型になっているのでOK)

    myy = Application.VLookup(m, .Range("c10:e135"), 2, False)
    If IsError(myy) Then
        MsgBox "検索値が見付かりません"
        Exit Sub
    End If
    myi = Application.VLookup(m, .Range("c10:e135"), 3, False)
        If IsError(myi) Then
        MsgBox "検索値が見付かりません"
        Exit Sub
    End If

 ところで、変数記述はプロシジャの最初にまとめておいた方が見やすい。
 それと、
 Dim m As Variant, k As Variant, y As Long, w As Long, i As Long
 このように、ちゃんと 型を明示した記述をしているのに
 Dim myy, myi, myr
 というのも混在しているのが、ちょっとちぐはぐな感じはするね。

 あと、InputBox関数とは別に、半平太さんのアドバイスの InputBoxメソッドもある。
 こちらのほうは、数値と指定すると、数値以外の入力を、メソッドの中で、はじくので
 マクロ側で、数字だったかどうかのチェックをすることが不要になるよ。

 (ぶらっと)

 (半平太)さん、(ぶらっと)さん できました ありがとうございます (K)

コメント返信:

[ 一覧(最新更新順) ]


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