Excel - 宏将动态行号从一个工作簿复制到另一个工作簿

时间:2011-03-21 12:20:32

标签: excel excel-vba vba

我一直试图寻找答案,到目前为止我没有运气。

我正在寻找的解决方案是关于两个工作簿,并能够将源工作簿中的一行(它有1000行)复制到另一本书(任何时候只包含一行,不包括列标题)。

另一个问题是,下次运行宏时,我需要查看源工作簿中的下一行,例如

首先将第2行(作为列标题在第1行中)复制到另一本书的第2行 第二次运行将第3行复制到另一本书的第2行(因为阅读本书的程序仅在第2行中查找)。

所以我假设代码中需要一个计数器?

如果有任何建议,我们将非常感激。

3 个答案:

答案 0 :(得分:1)

您将需要一个宏来复制数据,因为您要进行宏运行(每次运行宏时运行一行),您需要将上次复制的行的值存储在宏外部的某处。我们称之为LastRowCopiedOver

您可以将其存储在以下几个位置之一:

  • 同一工作簿中的隐藏和受保护的工作表
  • 现有工作簿中的受保护单元

每次成功运行宏时,您都会更新LastRowCopiedOver的值,以便您知道下次要选择的行。

当您到达书的末尾时,您可以显示一个带有是/否问题的消息框,以重置回第2行。

答案 1 :(得分:0)

Static Function可以解决问题。

Static Function RowCounter() As Long
    Dim i ' Value of locally declared variable is preserved between calls.
    i = i + 1
    RowCounter = i
End Function

每次从主程序中调用它时,i将增加1.由于RowCounter是静态的,它会记住调用之间i的值。

多次运行以下子项并观察MsgBox增量。当前行将复制到“Sheet2”。将其替换为您的目的地工作表。

Sub main()
    Dim iRow As Long

    Do While iRow < 2 ' To skip headers row 1...
        ' Get next row number.
        iRow = RowCounter
    Loop
    MsgBox iRow ' To show that each time main is called, iRow will be incremented by 1.

    ' Copy and paste that row...
    Rows(iRow).Copy Destination:=Worksheets("Sheet2").Rows(2)

End Sub

您可以通过进入VBA编辑器并按标准工具栏或运行菜单中的重置按钮(方框)将计数器重置为零。

如果将计数器保存在某个受保护/隐藏的单元格或工作表中,则重置它将是PITA。

答案 2 :(得分:0)

感谢您的参与,在阅读上述解决方案后,我花了一些时间在解决方案上。 我最终创建了一个单独的excel文件,然后我使用一些VBA脚本创建一个计数器,然后将一行从大型excel源文件复制到新文件,因此它只包含一行数据。

我现在修改了我的QAWP脚本来运行这个excel宏,它现在使用新的单行电子表格在脚本中设置数据。

这似乎到目前为止工作,这意味着我可以与QAWP使用的数据表分开创建新的测试数据。

我已在下面发布了excel VBA脚本以供参考:

Sub Copy_Next_Record()

Application.Workbooks.Open _
    "C:\Documents and Settings\user\My Documents\Personal_Data.xls"
Dim RowCount As Range
Set RowCount = _
    Workbooks("Full_Personal_Data.xls").Worksheets("Count").Range("A1")   
Workbooks("Full_Personal_Data.xls").Worksheets("Data").Activate   
Rows(RowCount).Copy _
    Destination:=Workbooks("Personal_Data.xls").Worksheets("Sheet1").Rows(2)    
RowCount.Value = RowCount.Value + 1    
Workbooks("Personal_Data.xls").Close True  
Workbooks("Full_Personal_Data.xls").Close True

End Sub