我写了一些带有两个匹配和索引公式的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 回答
首先,
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应该是字母数字而不是真正的数字,但考虑到先前变量赋值的错误,由您决定正确的赋值 .这是我对错误控制子程序的最佳猜测(假设您没有显示样本数据) .