后台:我正在编写一个宏,它将更改日志中的信息复制到由多个工作表组成的主文件中的匹配行中,每个工作表包含一个表。我已编写并正在进行更改,但还需要包含更改请求何时添加新行的过程。我在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))
答案 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