2017-12-23 9 views
1

私は2つの一致とインデックスの式でいくつかのVBAコードを書いています。シートから一意の値を選び、それを他のシートと比較する必要があります。しかし、それは動作していません。私はいくつかのエラーを取得します。 (worksheetfunctionクラスVBAの一致プロパティを取得できません - これは誤りである)ここでマッチとインデックスを持つExcel VBA

は私のコードです:

Sub Post_Attendance() 

Sheets("DB").Activate 

'On Error Resume Next 

Dim myvalue As String 
Dim mydate As String 
Dim mypost As String 

(日付値がセルに入力された)文字列 Dtのよう 薄暗いDtを=レンジ( "C7")。バリュー

(固有IDがセルに入力された) DIMが別の活性化(文字列 EMPID =レンジ( "C8")。

値としてEMPIDセル値からワークシート、)文字列 strWsName =シートとして 暗いstrWsName( "DB")。レンジ( "A7") シート(左(strWsName、3))。見つけるため

(match関数を選択行および列のインデックス作成のための番号)
MyDateに該当= WorksheetFunction.Match(DT、範囲( "B1:Q1")、0)

myvalue = WorksheetFunction.Match(empid, Range("A5:A500"), 0) 

mypost = WorksheetFunction.Index(Range("B2:Q6"), myvalue, mydate) 

End Sub 
+0

コードを正しくフォーマットし、どのようなエラーが発生しているのかを説明してください。 –

+0

エラーは何ですか? [ask]をお読みください。 – Chris

+0

最初の "mydate"のエラーは、ワークシート関数クラスvbaのmatchプロパティを取得できません。 この時点でコードは中断しています。 どの特定の行をデバッグしても、myvalueの値は正しく表示されます。 – aji

答えて

2

まずオフ、WorksheetFunction.Matchは、文字列を返すことはありません。数値(長整数)またはエラーを返します。一致の値ではなく、一致した行または列の番号です。

次に、#N/AエラーはWorksheetFunction.Matchと一致しないのでキャッチできませんが、Application.Matchでそれをキャッチしてバリアントにすることはできます。

実際の日付は文字列ではなく数値です。生の基礎となる値は別の長い整数です。例えば小数部のない正の整数。時間があった場合や日時があった場合は、小数部分があります。

親ワークシートを適切に解決して参照してください。 do not rely upon Select or Activate

MATCHから返された数値は、内のの位置で、検索されたセルの範囲です。あなたは5行目から500行目までの行番号を探していて、それを使って2行目から6行目までの行を探します。オリジナルの行9(6以上を返すマッチ)より上のマッチは範囲外になります。

empidの値が数字の場合は、数字を処理します。あなたは見た目のようなテキストから真の数字への一致を見つけることができません。例えば99 <> "99"empidは英数字で、真の数字ではないが、前の変数の割り当てでエラーがあったと仮定します。正しい割り当てを決定するのはあなた次第です。

ここでは、サンプルデータが表示されていないことを前提としたエラー制御サブプロシージャでの最適な推測を示します。

Option Explicit 

Sub Post_Attendance() 

'On Error Resume Next 

    Dim myvalueRow As Variant, mydateCol As Variant, dt As Long, empid As String, mypost As Variant 

    dt = Worksheets("DB").Range("C7").Value2 
    empid = Worksheets("DB").Range("C8").Value2 

    With Worksheets(Left(Worksheets("DB").Range("A7").Value2, 3)) 
     'locate the column for the date 
     mydateCol = Application.Match(dt, .Range("B1:Q1"), 0) 
     If IsError(mydateCol) Then _ 
      mydateCol = Application.Match(CStr(Worksheets("DB").Range("C7").Value2), .Range("B1:Q1"), 0) 
     If IsError(mydateCol) Then 
      Debug.Print "dt not found in row 1" 
      Exit Sub 
     End If 

     'locate the row for the value 
     myvalueRow = Application.Match(empid, .Columns("A"), 0) 
     If IsError(myvalueRow) Then 
      Debug.Print "empid not found in column A" 
      Exit Sub 
     End If 

     mypost = Application.Index(.Range("B:Q"), myvalueRow, mydateCol) 
    End With 

End Sub 
+0

'Range(" B1:Q1 ")'は.Range( "B1:Q1") 'にする必要があります。上記の編集と修正。 – Jeeped

関連する問題