2017-03-22 4 views
1

名前付き範囲を使用するときにVLookup関数を機能させることができません。 をどのように参照しているのかとは関係がありますが、動作する解決策を見つけることができません。VLookup&Named Rangeで変数を設定する

[]、([])、( "")、["" ])......

(以下コードの更新と拡張部分である)

If Transaction_Type = 1 Then 
    Debug.Print "Transaction Type :"; Transaction_Type 
    Range("n10").Value = "Income" 

    Debug.Print "COA # = "; TransactionInfo.Income_COA_Number.Value 
    COA_Number = TransactionInfo.Income_COA_Number.Value 
    Debug.Print COA_Number 

    Range("n12").Value = TransactionInfo.Income_COA_Number.Value 

    'thought from STACK OVERFLOW 
    Debug.Print Range("COA_Range").Address() 

    COA_1 = Application.WorksheetFunction.VLookup(COA_Number, Range("COA_Range"), 2, False) 
    Debug.Print COA_1 
    Range("n13").Value = COA_1 
+0

「TransactionInfo.Income_COA_Number」とは何ですか? 'ThisWorkbook.Names(" COA_Range ")。RefersToRange'で名前付き範囲を参照することもできます。 – PatricK

+0

これはユーザーフォームから取得された値です。 TransactionInfo.Income_COA_Number.Valueは、残りのマクロ全体で機能します。あなたの "thisworkbook.names ..."は失敗しました –

+2

'Debug.Print Range(" COA_Range ")。Address()'を追加して、範囲が見つかるようにしてください。 –

答えて

0

思慮深い応答のために、@Shaiラドーを@jainashishに感謝します。私はそれぞれからいくつかのポインタを拾うことができました。

しかし、実際に誰が私の問題を解決したのですか? "数値"はテキストとして読み込まれ、CLng()式は私のために働いていました。私は下に私の更新されたコードを追加しました。

If Transaction_Type = 1 Then 
    Debug.Print "Transaction Type :"; Transaction_Type 
     Range("n10").Value = "Income" 

     'thought from STACKOVERFLOW 
      'need to make sure that the number taken fromt the userform is ACTUALLY a number and not text that looks like a number 
       'use CLng to convert 

    Debug.Print "COA # = "; CLng(TransactionInfo.Income_COA_Number.Value) 
     COA_Number = CLng(TransactionInfo.Income_COA_Number.Value) 
      Debug.Print "COA # = "; COA_Number 
     Range("n12").Value = COA_Number 

      'thought from STACK OVERFLOW 
       Debug.Print Range("COA_Range").Address() 
        'Yes the range is being found... 
         Dim COA_Range As Range 
         Set COA_Range = Range("COA_Range") 
          Debug.Print COA_Range.Address() 

     COA_1 = WorksheetFunction.VLookup(COA_Number, Range("COA_Range"), 2, False) 
       Debug.Print COA_1 
        Range("n13").Value = COA_1 

     COA_2 = WorksheetFunction.VLookup(COA_Number, Range("COA_Range"), 3, False) 
       Debug.Print COA_2 
        Range("n14").Value = COA_2 

     COA_3 = WorksheetFunction.VLookup(COA_Number, Range("COA_Range"), 4, False) 
       Debug.Print COA_3 
        Range("n15").Value = COA_3 

     COA_4 = WorksheetFunction.VLookup(COA_Number, Range("COA_Range"), 5, False) 
       Debug.Print COA_4 
        Range("n16").Value = COA_4enter code here 
0

を使用しようとしApplication.Vlookup代わりにApplication.WorksheetFunctionを使用.Vlookup。そして、これにバリアントが等しくなるように設定し、一致が見つからない場合、それはISERROR

は、以下のサンプルコードを参照してください使用して試験することができるエラー2042が返されます:

Dim ws As Worksheet: Set ws = ActiveSheet   'Change the sheet reference appropriately 
Dim rngLookUpTable As Range: Set rngLookUpTable = ws.Range("COA_Range")  
Dim vReturn As Variant 

If Transaction_Type = 1 Then 
    Range("N10").Value = "Income" 
    COA_Number = TransactionInfo.Income_COA_Number.Value 
    Range("N12").Value = TransactionInfo.Income_COA_Number.Value 
    vReturn = Application.VLookup(COA_Number,rngLookUpTable, 2, False) 
    Range("N13").Value = IIF(IsError(vReturn),"Not Found",vReturn) 
End If 

VLOOKUPとマッチのWorksheetFunctionバージョンはエラーを必要としますコードをエラーハンドラに再ルーティングし、評価する次のステートメントに戻ります。アプリケーション関数を使用すると、混乱を避けることができます。 @Jeepedコメントに続いて

+0

ありがとうございました!正確な解決策を投稿しました –

1

、あなたのUser_Formの値がテキストボックスに「TransactionInfo」という名前のことを確認して「Income_COA_Numberは、」数値を持ち、そしてあなたのRange("COA_Range")細胞中のため、すべての値。

  • Application.Matchを使用する:

    Iv'eは2つのオプションのソリューションを(あなたがprefferものを選択)を加えました。

  • Findを使用してください。

コード

Option Explicit 

Sub VLookUpNamedRange() 

Dim ws     As Worksheet 
Dim Transaction_Type As Long 
Dim MyCOARng   As Range 
Dim COA_1    As Variant 
Dim COA_Number   As Long 
Dim FndRng    As Range 

Set ws = Worksheets("Sheet7") '<-- modify "Sheet7" to your sheet's name  
Set MyCOARng = ws.Range("COA_Range") '<-- set Range to "COA_Range" Named Range 

COA_Number = TransactionInfo.Income_COA_Number.Value 

' === Option 1: Use Application.Match === 
If Not IsError(Application.VLookup(COA_Number, MyCOARng, 2, False)) Then ' <-- VLookup Successful 
    COA_1 = Application.VLookup(COA_Number, MyCOARng, 2, False) 
Else ' <-- VLookup failed 
    COA_1 = COA_Number & " Not found in 'COA_Range' " 
End If 

' === Option 2: Use Find === 
Set FndRng = MyCOARng.Find(What:=COA_Number, LookIn:=xlValues, lookat:=xlWhole) 
If Not FndRng Is Nothing Then '<-- successful find 
    COA_1 = FndRng.Offset(, 2).Value 
Else '<-- not found in your range 
    COA_1 = COA_Number & " Not found in 'COA_Range' " 
End If 

Debug.Print COA_1 ' <-- for DEBUG Only 

End Sub 
+0

ありがとうございました!私は以下の私の正確な解決策を掲載しました –

関連する問題