【问题标题】:Copy cells between workbooks在工作簿之间复制单元格
【发布时间】:2011-06-09 02:20:04
【问题描述】:

有人可以帮我写一些 VBA 代码吗?

我正在尝试在工作簿之间复制 2 个单元格范围(两个工作簿都应该预先创建,因为我不希望代码动态创建新工作簿)。

首先我需要复制这些范围- 从 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

【问题讨论】:

  • 列中有空格吗?
  • 是的,单元格值会有所不同,但预计会有一些空白
  • 查找 Workbooks.Open 函数,因为我不相信您可以像现在这样打开工作簿。如果会有空格穿插查找范围的 SpecialCells 属性。再试一次,我会帮助你完成我所拥有的。

标签: vba excel


【解决方案1】:

假设您有对wksFromwksTo 的引用,代码应该是这样的

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")

【讨论】:

  • 如果我没记错的话,也会在第一个空白单元格处停止。
  • @Lopside:是的。但是,OP 的代码不需要检查空格。假设该列填充了值并且单元格之间没有任何空白。
  • @shahkalpesh 在评论他的回答时没有特别说值会有所不同,但预计会有一些空白?也许我误解了他。
  • @Lopsided:是的,他做到了。在你指出之前我没有读过它。他的代码和其他赞成的答案都没有考虑到这一点。如果 OP 提出的 cmets 在被要求时被合并到问题中以比在 cmets 中更详细地提出要求,那会更好。谢谢。
【解决方案2】:

以下是如何处理其中一列的示例:

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

正如您在 cmets 中所述,上面的代码不适用于带有空格的范围,因此请用下面的代码替换 lastrow 行:

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

现在,理想情况下,您可以将其制成一个子例程,该子例程接受源工作簿名称、工作表名称/编号和范围,以及目标工作簿名称、工作表名称/编号和范围。这样你就不必重复一些代码了。

【讨论】:

  • 好的开始,但它不会在第一个空白单元格之后复制任何内容
  • @trunks 是的,这就是为什么我指出您需要RangeSpecialCells 属性。如果你想保持空白,你必须从 65536(最后一个单元格)开始你的范围,然后使用 xlUp 一直到最后一个填充点。我给了你一个轻推,但你必须做一些步法。
【解决方案3】:

您可以使用 Jonsca 建议的特殊单元格。但是,我通常只是循环遍历单元格。我发现它让我可以更好地控制我正在复制的内容。对性能的影响非常小。但是,我觉得在办公场所,确保数据准确和完整是首要任务。我写了一个与此类似的问题的回复,可以在这里找到:

iDevelop 还提供了一个关于如何将特殊单元格用于相同目的的小型演示。我认为它会帮助你。祝你好运!

更新

回应……

良好的开端,但它不会在第一个空白单元格之后复制任何内容 – trunks 2011 年 6 月 9 日 5:08

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多