Vba 在工作簿之间复制单元格

Vba 在工作簿之间复制单元格,vba,excel,Vba,Excel,有人能帮我写一些VBA代码吗 我试图在工作簿之间复制两个单元格区域(两个工作簿都应该事先创建,因为我不希望代码动态创建新工作簿) 首先,我需要复制这些范围- 从booka.xls的“第3页”,范围:单元格H5到H列的最后一行,带数据 将其复制到bookb.xls的“第1页”,从B2单元格开始,在B列中复制尽可能多的单元格 其次,我需要复制这些范围- 从booka.xls的“第3页”,范围:单元格K5到包含数据的第K列的最后一行 将其复制到bookb.xls的“第1页”,从D2单元格开始,在D列中

有人能帮我写一些VBA代码吗

我试图在工作簿之间复制两个单元格区域(两个工作簿都应该事先创建,因为我不希望代码动态创建新工作簿)

首先,我需要复制这些范围- 从booka.xls的“第3页”,范围:单元格H5到H列的最后一行,带数据 将其复制到bookb.xls的“第1页”,从B2单元格开始,在B列中复制尽可能多的单元格

其次,我需要复制这些范围- 从booka.xls的“第3页”,范围:单元格K5到包含数据的第K列的最后一行 将其复制到bookb.xls的“第1页”,从D2单元格开始,在D列中复制尽可能多的单元格

以下是我到目前为止的情况:

 Sub CopyDataBetweenBooks()

Dim iRow        As Long
    Dim wksFr       As Worksheet
    Dim wksTo       As Worksheet

    wksFr = "C:\booka.xls"
    wksTo = "C:\bookb.xls"

    Set wksFrom = Workbooks(wksFr).Worksheets("Sheet 3")
    Set wksTo = Workbooks(wksTo).Worksheets("Sheet 1")

    With wksFrom
        For iRow = 1 To 100
            .Range(.Cells(iRow, 8), .Cells(iRow, 9)).Copy wksTo.Cells(iRow, 8)
        Next iRow
    End With

End Sub

以下是如何执行其中一列操作的示例:

Option Explicit
Sub CopyCells()
    Dim wkbkorigin As Workbook
    Dim wkbkdestination As Workbook
    Dim originsheet As Worksheet
    Dim destsheet As Worksheet
    Dim lastrow As Integer
    Set wkbkorigin = Workbooks.Open("booka.xlsm")
    Set wkbkdestination = Workbooks.Open("bookb.xlsm")
    Set originsheet = wkbkorigin.Worksheets("Sheet3")
    Set destsheet = wkbkdestination.Worksheets("Sheet1")
    lastrow = originsheet.Range("H5").End(xlDown).Row
    originsheet.Range("H5:H" & lastrow).Copy  'I corrected the ranges, as I had the src
    destsheet.Range("B2:B" & (2 + lastrow)).PasteSpecial 'and destination ranges reversed
End Sub
正如您在注释中所述,上面的代码不适用于带空格的范围,因此请在下面的代码中替换
lastrow
行:

lastrow = originsheet.range("H65536").End(xlUp).Row

现在,理想情况下,您可以将其生成一个子例程,该子例程包含原始工作簿名称、工作表名称/编号和范围,以及目标工作簿名称、工作表名称/编号和范围。这样您就不必重复某些代码。

假设您从
wksTo
中引用了
wksf,那么代码应该是这样的

wksFrom.Range(wksFrom.Range("H5"), wksFrom.Range("H5").End(xlDown)).Copy wksTo.Range("B2")
wksFrom.Range(wksFrom.Range("K5"), wksFrom.Range("K5").End(xlDown)).Copy wksTo.Range("D2")

您可以使用Jonsca建议的特殊单元格。然而,我通常只是通过细胞循环。我发现它能让我更好地控制我到底在复制什么。对性能的影响很小。然而,我觉得在办公室里,确保数据准确、完整是首要任务。我写了一篇关于类似问题的回复,可以在这里找到:

iDevelop还提供了一个小型演示,演示如何将特殊电池用于相同目的。我想这会对你有帮助。祝你好运

更新 作为对


很好的开始,但在第一个空白单元格之后,它不会复制任何内容–trunks Jun 9'11 5:08


我只是想补充一点,上面链接中的教程将解决您在评论中提出的问题。不要使用
.End(xlDown)
方法,而是在单元格中循环,直到到达最后一行,然后使用
.UsedRange.Rows.Count
检索最后一行

任何列中是否有空格?是的,单元格值会有所不同,但预计会有一些空格查找工作簿。打开函数,因为我不相信您可以像现在这样打开工作簿。如果有空格,请查找范围的SpecialCells属性。再试试看,我会帮你做我所拥有的。好的开始,但在第一个空白之后,它不会复制任何东西cell@trunks是的,这就是为什么我指出您需要
范围
SpecialCells
属性。如果你想保持空白,你必须从65536(最后一个单元格)开始你的范围,然后使用xlUp一直到最后一个填充点。我推了你一下,但你得做一些步法。如果我没弄错的话,我也会在第一个空白单元格停止。@Lopsided:是的。然而,OP的代码不需要检查空格。假设列中填充了值,并且单元格之间没有空格。@shahkalpesh在对其答案的评论中没有明确指出值会有所不同,但预计会有一些空格吗?也许我误解了他。@不平衡:是的,他误解了。直到你指出来我才看。他的准则和另一个经过投票表决的答案都没有考虑到这一点。如果OP的评论被整合在问题中,以获得详细的需求,而不是在评论中,当OP被要求时,这会更好。非常感谢。