2

我编写了一个基本宏来搜索范围(在一张纸中),然后根据保存选择值的第三张纸复制选定的单元格(到另一张纸)。我已经将循环用于 i = x 到 y 但看起来宏正在跳过一些行!???!即,如果要在第 1 到第 4 行上复制 4 个有效值,则宏仅从第 2 行和第 4 行复制值(丢弃有效单元格 1 和 3)。这是代码:

Sub XXXXX()
Dim i As Integer
Dim PasteSheet As Worksheet: Set PasteSheet = Sheets("Sheet1")
Dim CopySheet As Worksheet: Set CopySheet = Sheets("Sheet2")
Dim SearchSheet As Worksheet: Set SearchSheet = Sheets("Sheet3")
Dim LookupID, LookupID_SearchRange, CopyValueID, CopyValueID_Paste As Range

For i = 7 To 2000 'I've also used the (Step 1) option with no success
RowCount = Application.WorksheetFunction.CountA(PasteSheet.Range("A:A")) + 1 'finds the last cell to be used for copy

Set LookupID = CopySheet.Range("A" & i) 'searches all values within column A from row 7 to 2000
Set LookupID_SearchRange = SearchSheet.Range("A:A") ' Seaches if the values from Sheet3 are present in Sheet 1
Set CopyValueID = CopySheet.Range("X" & i) 'counter that follows the same search on A but selects values on X
Set CopyValueID_Paste = PasteSheet.Range("A" & RowCount) 'When it finds the ID, it copies some cell to the last row in Sheet2
      ' Initially  there was an additional RowCount (+1) for CopyValueID. Corrected based on answers for future refrence of the cleaned code.
If Not IsError(Application.Match(LookupID, LookupID_SearchRange, 0)) Then
    If CopyValueID.Value <> "" Then
        CopyValueID.Copy
        CopyValueID_Paste.PasteSpecial xlPasteValues
    End If
End If
Next i

End Sub

为什么代码从第 2 行和第 4 行中选择并复制值(它看起来像是在使用 +1 步骤?)谢谢。

4

2 回答 2

3

您定义RowCountCountA + 1

RowCount = Application.WorksheetFunction.CountA(PasteSheet.Range("A:A")) + 1 'finds the last cell to be used for copy

然后您实际上在要粘贴的行中再次添加一个:

Set CopyValueID_Paste = PasteSheet.Range("A" & RowCount + 1) ' When it finds the ID, it copies some cell to the last row in Sheet2

我认为你因此覆盖了你的结果?删除其中一个+1应该可以解决问题。

社论:很高兴看到有人定义他们复制的范围,而不是使用一堆Select's... 绝对更好的编码风格!

于 2013-11-06T15:31:32.093 回答
2

我认为您+1在两个地方向 RowCount 添加了一个。

...
RowCount = Application.WorksheetFunction.CountA(PasteSheet.Range("A:A")) + 1
...
Set CopyValueID_Paste = PasteSheet.Range("A" & RowCount + 1) '<-- Remove the +1 here

其他一些注意事项 - 整体代码不错 --------------

  • 正如评论中所指出的,找到 RowCount: 的最佳实践是一致同意的RowCount = Range("A" & .Rows.Count).End(xlUp).Row + 1。这将解决列中可能出现空白单元格的问题,这会导致 COUNTA 失效。

  • 您可以在没有 COPY 和 PASTE 的情况下执行此操作CopyValueID_PASTE.value = CopyValueID.Value。如果您在很多行上执行此操作,将会产生巨大的效率差异。

于 2013-11-06T15:38:16.187 回答