【问题标题】:VBA - Using Cells with Range to copy and pasteVBA - 使用具有范围的单元格复制和粘贴
【发布时间】:2015-04-14 01:52:08
【问题描述】:

我是 VBA 的初学者,我很难理解我下面的陈述有什么问题。为了给出我想要做的事情的背景,我有一个源表 (oldViewsWbk),我想将其单元格复制到我的最终工作簿 (finalViewsWbk) 中,然后对这些复制的单元格执行一些逻辑。

ActiveSheet.Range(Cells(2, 2), Cells(246, 2)).Value = oldViewsWbk.Sheets(1).Range(Cells(2, 2), Cells(246, 2)).Value

我的 ActiveSheet 是我的最终工作簿。现在我已经对行号和列号进行了硬编码,但是一旦我可以正常工作,它们就会被变量替换。

我知道我可以使用 Copy 和 PasteSpecial 来完成这项工作,但我想知道为什么这个特定的语句不断抛出错误 '1004': Object defined or Application defined error。也许我根本不能这样做,但我想知道它背后的原因是什么。

非常感谢!

【问题讨论】:

  • 看看stackoverflow.com/questions/28861117/… .Range(Cells 不会将工作表引用从范围传递到单元格。
  • 是的。你说的对。我没有引用 oldViewsWbk 中的 Cells 并明确引用它们使其工作。感谢您的帮助和及时回复。
  • 尽可能避免使用Active* 的宝贵经验!

标签: vba excel


【解决方案1】:

Cells 指的是活动工作表。 .Cells 指的是您引用的工作表。

dim rng as Range
With oldViewswbk.Sheets(1)
    Set rng = .Range(.Cells(2,2),.Cells(246,2))
Wend

ActiveSheet.Range(Cells(2,2),Cells(246,2)).Value = rng.Value

【讨论】:

  • 是的,这行得通。我只是明确地引用了 oldViewsWbk 中的单元格,它按预期运行。再次感谢您的帮助
【解决方案2】:

这都是关于如何启动代码的,例如,

Sub Button1_Click()
    Dim wb As Workbook
    Dim bk As Workbook
    Dim ws As Worksheet
    Dim sh As Worksheet
    Dim WSrng As Range
    Dim shRng As Range

    Set wb = Workbooks("Book3 1.xlsx")
    Set bk = Workbooks("Book3 2.xlsx")

    Set ws = wb.Sheets("Sheet1")
    Set sh = bk.Sheets("Sheet1")

    Set WSrng = ws.Range("A1:A10")
    Set shRng = sh.Range("A1:A10")

    WSrng.Value = shRng.Value


End Sub

【讨论】:

    【解决方案3】:

    因为在调用 Cells 时不引用工作表,所以隐含了活动表。它适用于等式的左侧,因为区域和单元格都在同一张表上(ActiveSheet)

    ActiveSheet.Range(Cells(2, 2), Cells(246, 2)).Value
    

    但不在右侧,因为工作表是 oldViewsWbk.Sheets(1) 而单元格在 activeSheet 上

    oldViewsWbk.Sheets(1).Range(Cells(2, 2), Cells(246, 2)).Value
    

    要解决这个问题,请使用

    ActiveSheet.Range(ActiveSheet.Cells(2, 2), ActiveSheet.Cells(246, 2)).Value = oldViewsWbk.Sheets(1).Range(oldViewsWbk.Sheets(1).Cells(2, 2), oldViewsWbk.Sheets(1).Cells(246, 2)).Value
    

    【讨论】:

    • 是的。我意识到我没有引用 oldViewsWbk 的单元格,因此是问题所在。我无法为您的答案投票(低代表点:p),但非常感谢您的帮助。
    【解决方案4】:

    为避免此类问题,请使用:

    ActiveSheet.Range("B2:B246").Value = oldViewsWbk.Sheets(1).Range("B2:B246").Value
    

    【讨论】:

    • 我可以直接使用范围,但我想避免对列和行进行硬编码。此外,我将在 while 循环中使用此语句,因此需要一种使用 Cells 使其工作的方法。但是感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多