在许多表中查找值,然后在匹配表

时间:2015-08-13 00:36:03

标签: vba excel-vba excel

后台:我正在编写一个宏,它将更改日志中的信息复制到由多个工作表组成的主文件中的匹配行中,每个工作表包含一个表。我已编写并正在进行更改,但还需要包含更改请求何时添加新行的过程。我在Col A中有一个与请求匹配的列表,因此我需要在文件中搜索匹配的Col A值,然后转到表中的第一个空行(仍然有很多空白空间在表),然后复制相关信息。

Function AddMatch(LOBID As String) As Range
Dim arrSheets, s As Worksheet, f As Range
Dim addr1 As String
arrSheets = Array("Sheet names all go here")
For Each s In arrSheets
    Set s = ActiveWorkbook.Sheets(s)
    Set f = s.Columns("A").Find(LOBID, Cells(Rows.Count, "A"), xlValues, xlWhole)
    If Not f Is Nothing Then
        addr1 = f.Address()
        Do
            Set AddMatch = f.EntireRow 
            Exit Function
            Set f = s.Columns("A").Find(LOBID, f, xlValues, xlWhole)
        Loop While f.Address() <> addr1
    End If
Next s
Set AddMatch = Nothing
End Function

我有这个函数,它找到LOBID匹配的工作表中的行。它可能过于复杂,但我使用相同的函数和两个标准进行另一个操作,因此它是一个简单的复制粘贴。我需要对表中找到匹配项的第一个空行进行操作,这是我将添加新信息的位置(从更改日志中复制)。

这将返回Col A中匹配的第一行。

Set destRNG = AddMatch(CStr(changeWS.Cells(i, "A")))

我有一种感觉,有一个非常简单的补充,让我从这一行到表格中的第一个空白,但我不断得到一个方法'范围'的对象'_Global'错误几乎我尝试过的一切。有更简单的方法吗?提前感谢您的帮助。

后续行动:尝试将范围从更改日志复制到新行。这会抛出一个对象'_Global'错误的方法'范围',不知道如何调整它以使其工作。

rw.Range(Cells(1, 1), Cells(1, 10)) = changeWS.Range(Cells(i, 1), Cells(i, 10))

1 个答案:

答案 0 :(得分:1)

这样的事情:

Sub Tester()
Dim rw As Range
    Set rw = FirstEmptyRow("AAA")
    If Not rw Is Nothing Then
        Debug.Print "Found empty row on " & rw.Parent.Name, rw.Address()
    Else
        Debug.Print "Not found..."
    End If

End Sub



Function FirstEmptyRow(LOBID As String) As Range
    Dim arrSheets, s, rv As Range

    arrSheets = Array("Sheet1", "Sheet2", "Sheet3")
    For Each s In arrSheets
        Set s = ActiveWorkbook.Sheets(s)
        'any match on this sheet?
        If Not IsError(Application.Match(LOBID, s.Columns("A"), 0)) Then
            Set rv = s.Rows(2) 'start here and work down...
            Do While Application.CountA(rv) > 0
                Set rv = rv.Offset(1, 0)
            Loop
            Exit For
        End If
    Next s

    Set FirstEmptyRow = rv
End Function

编辑:

rw.Range(Cells(1, 1), Cells(1, 10)) = changeWS.Range(Cells(i, 1), Cells(i, 10))

这里有一个问题,因为没有工作表限定符的Cells()始终指向ActiveSheet,因此您实际上是在尝试跨多个工作表创建范围,因此会出错。

rw.Range(rw.Cells(1, 1), rw.Cells(1, 10)).Value = _
  changeWS.Range(changeWS.Cells(i, 1), changeWS.Cells(i, 10)).Value

会更正确,但我更喜欢这种方法:

rw.Cells(1, 1).Resize(1, 10).Value = changeWS.Cells(i, 1).resize(i, 10).Value