2016-10-10 17 views
0

ランタイムエラー' 13 'が発生しました:次のコードで型が一致しません。このエラーについて私が理解しているところからは、式に2種類の変数があることが原因と考えられます。これは、私のインデックスマッチ関数は、数値とセルをテキストと連結して数値を返すため、私にとって多少真実です。数値をテキストとして書式化しようとしましたが、同じエラーが発生し続けます。これが問題なのだろうか?もしそうなら、私はここでやろうとしていることを誰かがこの/異なる方法の回避策を知っていますか?ありがとう!VBAインデックス一致ランタイムエラー'13 ':タイプが一致しません

Sub Lookup2() 
    Dim cell As Range 
    Dim lookUp1Sht As Worksheet 
    Dim lookUp2Sht As Worksheet 
    Dim lookUp2Rng As Range 
    Dim val1 As Variant 

    Set lookUp1Sht = ThisWorkbook.Worksheets("New") 
    Set lookUp2Sht = ThisWorkbook.Worksheets("input") 
    Set lookUp2Rng = ThisWorkbook.Worksheets("comp").Range("A1:C136") 

    For Each cell In Range("CaliforniaL") 
     With cell ' 
      Select Case True 
       Case IsNumeric(.Value) 
       .Offset(0, 1).Value = CDbl(.Value) 
       Case Else 
       .Offset(0, 1).Value = (Application.WorksheetFunction.Index(lookUp2Sht.Range("K:K"), Application.WorksheetFunction.Match(cell.Value & cell.Offset(0, -3), lookUp2Sht.Range("A:A") & lookUp2Sht.Range("H:H"), 0))) 
      End Select 
     End With 
    Next 
End Sub 
+0

どのラインが特にエラーになりますか?ブレークモード中に何かをホバーすると、あなたの関数や変数の値を見て、どれがバム値を返しているかを知ることができますか? – Tim

+0

これは、インデックス一致機能を持つ行にあります。行の各部分にカーソルを合わせると、.Offset(0,1).Value = Empty – Ashley

+0

Range()内の各セルFor Cell –

答えて

0

私は "ダブル"マッチを行う関数を書いています(おそらくExcelで利用できるものがありましたが、それを探すのが面倒です)。それを使って、あなたのcあなたのコードは次のように書き直すことができます:

Sub Lookup2() 
    Dim cell As Range 
    Dim lookUp1Sht As Worksheet 
    Dim lookUp2Sht As Worksheet 
    Dim lookUp2Rng As Range 
    Dim val1 As Variant 

    Set lookUp1Sht = ThisWorkbook.Worksheets("New") 
    Set lookUp2Sht = ThisWorkbook.Worksheets("input") 
    Set lookUp2Rng = ThisWorkbook.Worksheets("comp").Range("A1:C136") 

    For Each cell In Range("CaliforniaL") 
     With cell 
      If IsNumeric(.Value) Then 
       .Offset(0, 1).Value = CDbl(.Value) 
      Else 
       val1 = DoubleMatch(lookUp1Sht.Cells(.Row, "A").Value, lookUp2Sht.Range("A:A"), _ 
            lookUp1Sht.Cells(.Row, "L").Value, lookUp2Sht.Range("H:H")) 
       If IsError(val1) Then 
        .Offset(0, 1).Value = val1 
       Else 
        .Offset(0, 1).Value = lookUp2Sht.Cells(val1, "K").Value 
       End If 
      End If 
     End With 
    Next 
End Sub 

Function DoubleMatch(Key1 As Variant, Range1 As Range, Key2 As Variant, Range2 As Range) As Variant 
    'This function only performs an "Exact Match" 
    If Range1.Rows.Count <> Range2.Rows.Count Then 
     DoubleMatch = CVErr(xlErrRef) 
     Exit Function 
    End If 
    If Range1.Columns.Count > 1 Or Range2.Columns.Count > 1 Then 
     DoubleMatch = CVErr(xlErrRef) 
     Exit Function 
    End If 

    Dim c As Range 
    Dim r As Long 
    Dim address1 As String 
    With Range1 
     Set c = .Find(What:=Key1, LookIn:=xlValues, LookAt:=xlWhole) 
     If c Is Nothing Then 
      DoubleMatch = CVErr(xlErrNA) 
      Exit Function 
     End If 
     address1 = c.Address 

     Do 
      r = c.Row - Range1.Row + 1 
      If Key2 = Range2(r, 1).Value Then 
       DoubleMatch = r 
       Exit Function 
      End If 
      Set c = .Find(What:=Key1, LookIn:=xlValues, LookAt:=xlWhole, After:=c) 
      If c Is Nothing Then 
       DoubleMatch = CVErr(xlErrNA) 
       Exit Function 
      End If 
      If c.Address = address1 Then 
       DoubleMatch = CVErr(xlErrNA) 
       Exit Function 
      End If 
     Loop 
    End With 
    DoubleMatch = CVErr(xlErrNA) 
End Function 
+0

それは働いて、ありがとう@ YowE3k! – Ashley

0

私は問題を推測しているが、この部分である:

cell.Value & cell.Offset(0, -3) 

cell.valuecell.Offsetreturns a range objectながら、セル内のデータを返しています。 Match関数にはlookup_valueが必要であり、値と範囲オブジェクトを連結できないため、エラーが発生します。実際には、あなたは、すべての範囲を連結することはできませんので、あなたのmatch関数の第二引数にも失敗します:

lookUp2Sht.Range("A:A") & lookUp2Sht.Range("H:H") 

を使用すると、ワークシートのセルにこれらの式を入れた場合(例えば、=match(A2 & d2, A:A & H:H, 0)あなたが表示されます

VBAコードではワークシート関数を使用する価値がありませんでしたが、価値がないというわけではありません。必要性を見たことはありません。

+1

'cell.Value&cell.Offset(0、-3)'は有効です - セルオブジェクトのデフォルトプロパティ(少なくともその状況では)はValueなので、 'cell.Offset(0、-3)' 'cell.Offset(0、-3).Value'と等価です。 – YowE3K

+0

私はVBAを初めて使うのでワークシート関数を使用しました。これは私がよく知っているものです。ワークシート関数を使用せずにこれを達成する別の方法を知っていますか? – Ashley

関連する問題