找到一个值,然后在另一个工作簿中寻找匹配值的最后一列

时间:2018-09-17 02:11:03

标签: excel vba

我是VBA的新手。目的是在Workbook1.Sheet1的单元格A3中查找数值。这是搜索字段:

img

我需要在Workbook2.sheet1的A列中搜索该值的匹配项,然后使用匹配的搜索值查找该行的最后一个空列,然后选择它。

Row A of workbook2.sheet1 may contain the value we are searching for

我一直在搜索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

3 个答案:

答案 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,但我希望这会有所帮助。