【问题标题】:VBA Copy - Paste - Paste special not workingVBA复制 - 粘贴 - 特殊粘贴不起作用
【发布时间】:2021-10-06 12:11:59
【问题描述】:

早上好, 我目前正在学习 VBA 编码,所以我不确定我是否做错了什么。我对PastePasteSpecial 方法有一些问题。即使从录制的宏运行脚本时,它也会显示一个名为“运行时错误'1004':应用程序定义或对象定义的错误”的错误。 简单粗暴的录制宏如下。

Sub Macro1()
'
' Macro1 Macro
'

'
    Sheets("Aggressive").Select
    ActiveCell.Range("A1:D15").Select
    Selection.Copy
    ActiveCell.Offset(18, 7).Range("A1").Select
    Sheets("All Portfolios").Select
    ActiveCell.Offset(2, -3).Range("A1").Select
    ActiveSheet.Paste
End Sub

我不确定为什么会发生这种情况,书面“ex novo”代码和 PasteSpecial 方法应用于 Range obj。 有什么我想念的吗?我还想说明它工作了一段时间(PastePasteSpecial)然后突然发生了这个错误并继续发生。 我尝试了一些在互联网上找到的解决方案,但它仍然不断发生,我认为录制的宏不起作用是不正常的。 提前谢谢!

---编辑 非常感谢@Dominique,这实际上是一个错误。 在为我的问题寻找解决方案时,我已经阅读了您发布的 URL,但是由于现在我的程序非常简单,我还没有应用“变量”方式来编写代码。 但是,即使在尝试应用指定的变量 url 方法而不是选择时,复制和粘贴方法也存在同样的问题。之前发布的代码来自一个录制的宏,所以老实说,我不知道为什么它会产生负偏移。但是,以下是我在参加在线 vba 课程时编写的代码,我无法理解问题是否再次出现在偏移方法的使用或其他方面。

Sub GenRep()
Dim x As Integer
For x = 1 To Worksheets.Count - 1
Worksheets(x).Select
Range("B6").Select
Selection.CurrentRegion.Select
Range("B2000").Select
Selection.End(xlUp).Select
ActiveCell.Offset(2, 0).Select
ActiveCell.Value = Worksheets(x).Name & "portfolio"
ActiveCell.Offset(2, 0).Select
ActiveSheet.Paste
Next x
End Sub

【问题讨论】:

  • 欢迎来到 SO。我认为您首先必须了解 Excel-VBA 的范围/单元格概念。可能这个链接可以帮助你:excelmacromastery.com/excel-vba-range-cells。然后你就可以开始复制值了。
  • 糟糕,您正在粘贴而不复制 :-)

标签: excel vba copy-paste


【解决方案1】:

我相信这是问题所在:

Sheets("All Portfolios").Select
ActiveCell.Offset(2, -3).Range("A1").Select

当您选择工作表时,您会自动选择单元格“A1”,它没有负偏移 (-3)。

我还建议您查看this URL,在那里您可以了解如何避免在 Excel 中使用过多的SelectCopyPaste

【讨论】:

  • 非常感谢,我已经编辑了我原来的帖子,因为在复制粘贴或复制粘贴特殊方法中仍有一些我不明白的东西,我不明白为什么它会起作用为我的在线导师而不适合我。
【解决方案2】:

我不知道你到底想达到什么目标, 您似乎在激活“使用相对引用”的情况下录制了宏。负偏移是正常的。录制宏时没有选择 A1,这就是它具有负偏移的原因。您可以从右侧的 D 列中选择任何列。您还记录了无用的步骤。也许如果您取消标记“使用相对引用”,您将实现您真正想做的事情,我无法确定。

我将解释您的代码的作用:

Sheets("Aggressive").Select 选择工作表“积极”

ActiveCell.Range("A1:D15").Select 选择活动单元格(最后一次在工作表上选择的单元格),然后它将从实际选择中选择 "A1:D15",例如:如果您的选择在 [E5] 上,它将选择范围 E5:H19。在这种特殊情况下,A1 是 E5。如果您输入“B1:D15”而不是“A1:D15”,它将选择“F5:H19”

Selection.Copy 复制最后一个选择

ActiveCell.Offset(18, 7).Range("A1").Select 从前一个选择中选择 18 行,向右选择 7 列(在我的情况下,从 [E5] 开始,它将是 [L22]; 这是无用的,因为它是在下一个选择之前的选择。注意 Range(" A1") 指的是 [L22](在我的示例中)本身,如上所述。

Sheets("All Portfolios").Select 选择“所有投资组合”表

ActiveCell.Offset(2, -3).Range("A1").Select 选择工作表上最后一个选定的单元格加上两行,减去三列。所以,如果你在 A1 上,正如 Dominique 所说,它没有负偏移,这就是为什么通常会出现错误。但是,如果“所有投资组合”上的最后一个选择是在 [F3] 上,例如,它会选择 [C5]。

ActiveSheet.Paste 它将复制的值/公式/任何内容粘贴到最后一个选择(上面的那个)上。如果我们使用我的示例,它将复制范围内的值 ("C5:F19")

话虽如此,这里是复制粘贴的示例

Sheets("Aggressive").Range("yourRange").Copy
Sheets("All Portfolios").Range("yourRange").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipBlanks:=False, Transpose:=False
Application.CutCopyMode = False`

您可以查找不同类型的“粘贴”和“操作”

第二个代码:

For x = 1 To Worksheets.Count - 1 Worksheets.count 取决于你的工作簿上有多少工作表,所以如果你有一个,代码将什么都不做(1-1=0)。如果您有 2 个工作表,则代码将适用于第一个工作表(2-1=1),如果您有三个工作表,它将适用于前两个工作表(3-1=2),如果您有四个工作表,它将工作在前三个工作表上(4-1=3),依此类推(这是一个循环)

循环的粗略示例:

Worksheets(1).Select 'selects first worksheet
Range("B6").Select
Selection.CurrentRegion.Select
Range("B2000").Select
Selection.End(xlUp).Select
ActiveCell.Offset(2, 0).Select
ActiveCell.Value = Worksheets(x).Name & "portfolio"
ActiveCell.Offset(2, 0).Select
ActiveSheet.Paste

Worksheets(2).Select 'selects second worksheet
Range("B6").Select
Selection.CurrentRegion.Select
Range("B2000").Select
Selection.End(xlUp).Select
ActiveCell.Offset(2, 0).Select
ActiveCell.Value = Worksheets(x).Name & "portfolio"
ActiveCell.Offset(2, 0).Select
ActiveSheet.Paste 

Worksheets(3).Select 'selects third worksheet
Range("B6").Select
Selection.CurrentRegion.Select
Range("B2000").Select
Selection.End(xlUp).Select
ActiveCell.Offset(2, 0).Select
ActiveCell.Value = Worksheets(x).Name & "portfolio"
ActiveCell.Offset(2, 0).Select
ActiveSheet.Paste 

(...)

下面的第二个选项没有用。 “B6”和“B2000”选项不整齐。此外,完全不建议使用 select,您应该避免使用它。多米尼克引用了那篇著名的文章/问题,你应该看看。

Range("B6").Select
Selection.CurrentRegion.Select
Range("B2000").Select   

请注意,代码上没有复制操作。您必须手动复制某些内容才能正常工作。

我重申,关于您想要实现的目标的信息并不多。如果您可以更具体...

【讨论】:

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