我是VBA的新手。目的是在Workbook1.Sheet1的单元格A3中查找数值。这是搜索字段:
我需要在Workbook2.sheet1的A列中搜索该值的匹配项,然后使用匹配的搜索值查找该行的最后一个空列,然后选择它。
我一直在搜索cells.find公式,该公式可能很相似,可以帮助我完成代码,但是我搜索的公式仅提供了一个已经指定的值。
我要寻找的是一个vba代码,当您单击宏时,它将搜索在workbook1.sheet1的Range(“ C3”)中输入的任何值,无论workbook2.sheet1中是否存在匹配项。
这是我到目前为止的代码。 cells.find给我一个运行时错误91,提示“ cells.find部分”,其中包含“对象变量或块变量未设置”。
If IsEmpty(Range("C3").Value) = True Then
MsgBox "PLEASE Enter TICKET # FIRST"
GoTo Lastline
Else: GoTo Search
End If
Search:
ActiveSheet.Range("C5").Select
Set wbFrom = Workbooks.Open("C:\Users\user\Downloads\Database.xlsx")
Cells.Find(What:=Selection, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Select
Selection.End(xlToRight).Offset(1, 0).Select
Lastline:
End Sub
答案 0 :(得分:2)
您需要Workbook2.sheet1的代码表中的按钮单击事件子过程。在设计模式下右键单击按钮,然后选择查看代码,即可访问代码表。
以下是示例过程;右键单击工作表按钮后,显示的内容可能会有所不同。
我觉得太多人依赖范围。寻找其他更合适的选择。在这种情况下(将搜索条件放在单个列中),工作表的Match函数似乎更合适。
Option Explicit
Private Sub CommandButton1_Click()
If IsEmpty(Range("C3")) Then
MsgBox "PLEASE Enter TICKET # FIRST"
Exit Sub
End If
Dim m As Variant, wbFrom As Workbook
Set wbFrom = Workbooks.Open("C:\Users\user\Downloads\Database.xlsx")
With wbFrom.Worksheets("sheet1")
m = Application.Match(Range("C3").Value, .Range("A:A"), 0)
If Not IsError(m) Then
'there is almost always something better than .Select but that is what you asked for
.Cells(m, .Columns.Count).End(xlToLeft).Offset(0, 1).Select
Else
MsgBox "search term not found"
End If
End With
End Sub
请注意,此代码使用Range(“ C3”)。Value,而没有父级工作表引用。这是因为它是通过在工作表的专用代码表上继承的。这样的编码在公共模块代码表中是不合适的。
答案 1 :(得分:1)
类似的事情应该做:
forEach
请注意,这不会处理找不到票号的情况。
答案 2 :(得分:1)
如果没有适当限定对象和变量,很多事情可能会出错。
同样,您实际上不需要在这里使用Goto
:
'/* declare variables */
Dim wbFrom As Workbook, r As Range, whattofind As String
If IsEmpty(Sheet1.Range("C3").Value) = True Then
MsgBox "PLEASE Enter TICKET # FIRST"
Else
whattofind = Sheet1.Range("C3").Value '/* sheet1 of the current workbook */
Set wbFrom = Workbooks.Open("C:\Users\user\Downloads\Database.xlsx")
'/* make use of the object you set */
With wbFrom.Sheets(1) '/* refer to Sheet1 as mentioned */
Set r = .Range("A:A").Find(whattofind) '/* search Column A only, change to suit */
If Not r Is Nothing Then '/* check first if something is found */
r.End(xlToRight).Select '/* select last cell in the row
Else
'/* inform if nothing is found */
Msgbox "Item not found"
End If
End With
End If
无法测试ATM,但我希望这会有所帮助。