2017-06-23 12 views
2

ExcelのVlookup関数について助けが必要です。 私は2つのワークシートを持っています。最初に会社コードがあり、2番目には会社コードに基づいて価値を見つける必要があります。関連するコードは次のとおりです。V20のExcel 2016 Vlookup関数

Dim Compcode, AUC, OB As String 
Dim WS1, WS2 As Worksheet 
Set WS1 = ThisWorkbook.Worksheets("Main Sheet") 
Set WS2 = ThisWorkbook.Worksheets("Data") 
Compcode = WS1.Cells(2, 1).Value 'Company code WS1 A2 

AUC = Application.WorksheetFunction.VLookup(Compcode, WS2.Range("A2:C30"), 2, False) 
OB = Application.WorksheetFunction.VLookup(Compcode, WS2.Range("A2:C30"), 3, False) 

私は変数とVLOOKUP関数自体のそれぞれの点心を変更しようとしましたが、私はいつも同じエラーメッセージを取得:

実行時エラー ' 438 ':オブジェクトはこのプロパティまたはメソッドをサポートしていません

+2

あなたのコードに影響を与えるべきではありませんが、実際には 'Compcode'と' AUC'を 'String'、WS1'を' Worksheet'と宣言する必要があります。 (つまり、文字列としてAUCを文字列として、OBを文字列として、Dim WS1をワークシートとして、WS2をワークシートとして使用する)。そして、FWIW、あなたのコードは私のために働く。 – YowE3K

+0

WS2.Range( "A2:C30")の会社コードは数値かテキスト(数値はテキスト形式)ですか? –

+0

すべてがテキストベースです。いずれのフィールドにも数字はありません。 – Thrazzon

答えて

2

問題は、多くの場所ですることができます。とにかく、明らかに、VLOOKUPは、このようCompcodeは、このようなVariant

何かがうまくなりする必要があり、数値と文字列のビットうるさいです:

Option Explicit 

Public Sub TestMe() 

    Dim Compcode  As Variant 
    Dim AUC    As String 
    Dim OB    As String 

    Dim WS1    As Worksheet 
    Dim WS2    As Worksheet 

    Set WS1 = ThisWorkbook.Worksheets("Main Sheet") 
    Set WS2 = ThisWorkbook.Worksheets("Data") 

    Compcode = WS1.Cells(2, 1).Value 

    Dim rngRange As Range 

    Set rngRange = WS2.Range("A2:C30") 

    AUC = Application.WorksheetFunction.VLookup(Compcode, rngRange, 2, False) 
    OB = Application.WorksheetFunction.VLookup(Compcode, rngRange, 3, False) 

End Sub 

あなたが明示的にすべての変数を宣言する必要があり、これはc++/cのではありませんカンマでそれらを宣言し、VBEditorが理解することを願ってください。

また、数式を範囲に変更しました。

+1

'VLookup'は' String'検索値でうまく動作します。 – YowE3K

+0

文字列でコードを試すまで@ YowE3Kと思っていました。 'Compcode'を文字列に変更して試してみてください。それは失敗するでしょう。私はその場合に '1004 'を得る。 – Vityata

+0

'String'(テキストを検索している場合)で動作しますが、数値があれば' String'は数値と一致しません。しかし、それは1004のエラーではなく、438のエラーを与えます。だから** IF ** ''メインシート'!A2'は数字で、検索範囲は数値です。変更すると1004エラーが停止します。 – YowE3K

2

WorksheetFunction.Vlookupは入力に対して非常に揮発性で、遭遇したようにランタイムエラーを簡単にスローする可能性があります。

あなたの問題は、多くのものの一つかもしれないが、私の提案された解決策は、だけではなく、Findを使用することです:

Sub test() 
    Dim Compcode As Variant, AUC As Variant, OB As Variant 
    Dim WS1 As Worksheet, WS2 As Worksheet 

    Set WS1 = ThisWorkbook.Worksheets("Main Sheet") 
    Set WS2 = ThisWorkbook.Worksheets("Data") 
    Compcode = WS1.Cells(2, 1).Value 'Company code WS1 A2 

    Dim rng As Range 
    Set rng = WS2.Range("A2:C30").Find(Compcode, , , xlWhole) 

    If Not rng Is Nothing Then 
     AUC = rng.Offset(0, 1).Value 
     OB = rng.Offset(0, 2).Value 
    End If 
End Sub 
+0

'VLookup'は、検索する場所の' Range'でうまく動作します。 [Table_array - 2つ以上のデータ列。範囲または範囲名への参照を使用してください。](https://msdn.microsoft.com/en-us/vba/excel-vba/articles/worksheetfunction-vlookup-method-excel) – YowE3K

+1

@ YowE3K、私は決して気に入らなかったとにかく...更新された答え – CallumDA

+1

'VLookup'を避けて、いつも' VLookup'を避けている人々のグループのためのもう一つの投票... – Vityata