首页 文章

带有匹配和索引的Excel VBA

提问于
浏览
1

我写了一些带有两个匹配和索引公式的VBA代码 . 我需要从工作表中选择唯一值并将其与其他工作表进行比较 . 但它不起作用 . 我收到一些错误 . (无法获取工作表函数类vba的match属性 - 这是错误)

这是我的代码:

Sub Post_Attendance()

Sheets("DB").Activate

'On Error Resume Next

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

(在单元格中输入的日期值)Dim Dt As String Dt = Range(“C7”) . 值

(在单元格中输入的唯一ID)Dim empid As String empid = Range(“C8”) . Value

(从单元格值激活另一个工作表)Dim strWsName As String strWsName = Sheets(“DB”) . Range(“A7”)Sheets(Left(strWsName,3)) . Select

(匹配函数查找索引的行号和列号)
mydate = WorksheetFunction.Match(Dt,Range("B1:Q1"),0)

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

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

End Sub

1 回答

  • 2

    首先, WorksheetFunction.Match 永远不会返回一个字符串;它要么返回一个数字(一个长整数),要么返回一个错误 . 它不是匹配的值,而是找到匹配的行号或列号 .

    接下来,您无法捕获与WorksheetFunction.Match不匹配的 #N/A 错误,但您可以使用 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
    

相关问题