Vba 评估误差
我有两张我正在处理的纸。用户按下此按钮的sheet1包含一个名为“内阁日期”的列,该列只是与每个报告相关的日期列表。 Sheet2(截止日期)还包含内阁日期列,与在此日期之前要满足的一系列截止日期相匹配(在同一行中)。 //例如,1月份内阁的任何报告草案的截止日期都将在同一行// 我想制作一个按钮,当按下该按钮时,将在表2中找到与活动单元格(表1上)中的日期相匹配的内阁日期,并选择其下的标题(searchCol),然后在表2中的正确内阁日期中返回该事件的确切截止日期值 我目前遇到的问题是,当我运行此按钮时,它似乎没有从sheet2中拾取文件柜日期值,并导致带注释的行计算为nothing/true,并跳过将打印截止日期的代码块 当我按下这个按钮时,我得到的只是“未找到截止日期”。即使事实上有一个值,它也应该得到Vba 评估误差,vba,excel,Vba,Excel,我有两张我正在处理的纸。用户按下此按钮的sheet1包含一个名为“内阁日期”的列,该列只是与每个报告相关的日期列表。 Sheet2(截止日期)还包含内阁日期列,与在此日期之前要满足的一系列截止日期相匹配(在同一行中)。 //例如,1月份内阁的任何报告草案的截止日期都将在同一行// 我想制作一个按钮,当按下该按钮时,将在表2中找到与活动单元格(表1上)中的日期相匹配的内阁日期,并选择其下的标题(searchCol),然后在表2中的正确内阁日期中返回该事件的确切截止日期值 我目前遇到的问题是,当我运
Option Explicit
Private Sub CommandButton1_Click()
Dim cabDate As String, findme As Range
Dim searchCol As Integer
searchCol = ActiveCell.Column
cabDate = WorksheetFunction.Index(Range("A1:O9999"), ActiveCell.Row, 2)
If Not IsEmpty(cabDate) Then
With Worksheets("Deadlines").Range("B:B")
Set findme = Application.WorksheetFunction.VLookup(cabDate, Sheets("Deadlines").Range("A1:O9999"), 1, False)
If Not findme Is Nothing Then
Dim findmeAddr As String
findmeAddr = findme.Address(True, True)
Dim printable As String
printable = findme.Offset(0, searchCol).Value
MsgBox (printable)
Else
MsgBox ("Deadline not found")
End If
End With
Else
MsgBox ("invalid or non existent cabinet date")
End If
End Sub
并非所有的人都有编码经验,因此任何帮助都将不胜感激
编辑:
您将所有不同类型的变量以及每个函数返回的类型弄混了
WorksheetFunction.Index
-返回特定单元格(或单元格范围)的值,因此需要将cabDate定义为字符串。
因此,与其使用如果不是cabDate,则使用(因为它不是范围),不如使用如果不是IsEmpty(cabDate),则使用
使用Set findme
的Find
方法返回一个范围
,因此您以后不能将其与findme=findme.Address(True,True)
一起使用,但您需要将另一个变量定义为String
,然后您可以读取字符串的地址
最后,由于要从可打印的中读取一个值,因此它必须是字符串或整数,而不是范围
代码
Option Explicit
Private Sub CommandButton1_Click()
Dim cabDate As String, findme As Range
Dim searchCol As Integer
searchCol = ActiveCell.Column
cabDate = WorksheetFunction.Index(Range("A1:O9999"), ActiveCell.Row, 2)
If Not IsEmpty(cabDate) Then
With Worksheets("Deadlines").Range("B:B")
Set findme = .Find(what:=cabDate)
If Not findme Is Nothing Then
Dim findmeAddr As String
findmeAddr = findme.Address(True, True)
Dim printable As String
printable = findme.Offset(0, searchCol).Value
MsgBox (printable)
Else
MsgBox ("Deadline not found")
End If
End With
Else
MsgBox ("invalid or non existent cabinet date")
End If
End Sub
试一试
因为Range
对象的Find()
方法会记住这些参数的最后设置,即使是从Excel UI中设置的
并确保ActiveCell
是您实际期望的 您好,感谢我所做的更改:)但是我现在仍然在同一个地方跳过代码块,我认为这可能与我的数据结构或使用.Find方法搜索sheet2时在“with”中设置的范围有关,引用的是一个空白单元格,而不是包含匹配数据的单元格。@Dingge如我上面所述,在工作表中共享您的数据结构将有助于我们帮助您在这里,左边是人们搜索截止日期的工作表,使用该按钮,我希望他们能够在活动单元格上按下该按钮,并从Sheet2中检索截止日期。您可能在单元格格式一致性方面有问题,因为您使用的是日期,它可能以不同的方式格式化。仍然会得到相同的跳过,我可能会尝试在此处混淆数据类型,感谢您的帮助我不会说数据类型是罪魁祸首,而是逐步检查您的代码并检查ActiveCell
是否符合您的实际期望,它一直在使用msgbox和调试器通知来向我显示变量被正确拾取。到目前为止,cabDate似乎打印得很好,无论我将活动单元格放置在何处,它都会从表1中为我提供正确的cabDate。我现在的问题似乎是让程序在sheet2上找到一个精确的匹配,我一直在调试器中得到'findme=nothing',我也尝试过使用Vlookup,但这也找不到匹配的值。日期真的是日期吗?我的意思是,如果您查询?cabDate.Value
会返回什么?因此设置cabDate=WorksheetFunction.Index(范围(“A1:O9999”),ActiveCell.Row,2)
没有按预期工作,是吗?
Set findme = .Find(what:=cabDate, lookIn:=xlValues, lookAt:=xlWhole)