粘贴值时如何引用非活动工作表?

Posted

技术标签:

【中文标题】粘贴值时如何引用非活动工作表?【英文标题】:How do I refer to an inactive sheet when doing a paste values? 【发布时间】:2013-10-13 23:27:45 【问题描述】:

我是 Excel 中的 VBA 新手。我正在尝试编写一个代码,将一个单元格的值粘贴到另一个单元格中,然后自动填充到同一列中的特定范围。如何在工作表不活动的情况下在后台执行此操作?这是宏记录器写的代码:

Sheets("Results").Select
Range("D8").Select
Selection.Copy
Range("E8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Application.CutCopyMode = False
Selection.AutoFill Destination:=Range("E2:E8"), Type:=xlFillDefault
Range("E2:E8").Select
Selection.AutoFill Destination:=Range("E2:E44"), Type:=xlFillDefault
Range("E2:E44").Select
Columns("E:E").EntireColumn.AutoFit

【问题讨论】:

【参考方案1】:

您可以使用以下内容指定非活动工作簿或工作表:Workbooks("Book1").Sheets("Sheet1")

例如:

Workbooks("Book1").Sheets("Sheet1").Range("D8").Copy
Workbooks("Book1").Sheets("Sheet2").Range("E8").PasteSpecial Paste:=xlPasteValues

【讨论】:

谢谢!这对于复制部分非常有效,您知道如何进行自动填充吗? 您可以使用Range("E2:E44").PasteSpecial 粘贴到整个范围,而不仅仅是单元格E8(我不确定您是在复制公式还是值)。下面的代码将使用自动填充,让我知道这是否有效:Worksheets("Sheet1").Range("E8").AutoFill Destination:=Worksheets("Sheet1").Range("E2:E44")【参考方案2】:

使用明确定义到其父工作表(如果需要,还可能是工作簿)的范围对象:

Dim copyRange as Range
Dim destRange as Range

Set copyRange = Sheets("Results").Range("D8")  'Or Workbooks("Book1").Sheets("SheetName").Range("D8")
Set destRange = Sheets("Other Sheet").Range("E8")  'Or Workbooks("Book2").Sheets("Another Sheet").Range("E8")
copyRange.copy
destRange.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Application.CutCopyMode = False
destRange.AutoFill destRange.Offset(-7, 0).Resize(8, 1), xlFillDefault
destRange.AutoFill destRange.Resize(36, 1), xlFillDefault

destRange.EntireColumn.Autofit

我不清楚您何时/是否在宏记录器会话期间更改了工作表,我也不清楚您正在进行的各种选择/自动填充。如果您需要帮助弄清楚这些部分,请告诉我,我在上面猜到了。

这是您可能使用的另一种方法:

Dim copyRange as Range
Dim destRange as Range
Dim dt as Date
Set copyRange = Sheets("Results").Range("D8")
Set destRange = Sheets("Other Sheet").Range("E2")  

dt = DateAdd("d", -6, DateValue(copyRange.Value))  'get the value 6 days before
copyRange.Copy destRange 'copy the formatting/etc
destRange.Value = dt     'insert the value
destRange.AutoFill destRange.Resize(44, 1), xlFillDefault
destRange.EntireColumn.Autofit

【讨论】:

感谢复制部分工作得非常好。我仍然无法让自动填充与此代码一起使用。我收到“编译错误:预期:语句结束”。为了更好地解释,我只在“结果”表上工作,我试图将 D8 复制到 E8,然后将 E8 自动填充到 E2 并向下到 E44。如果您需要更多信息,请告诉我,再次感谢! 好吧,现在说得通了,但为什么不直接复制到 E2 并自动填充到 E44? 该行中有错字和缺少逗号,我已将其修复为从 E8:E44 自动填充。您能解释一下为什么需要自动填充两次,而不是粘贴到 E2 并向下填充到 E44 吗? 单元格 E8 是从另一个来源提取的日期。我需要在该日期之前的 6 天和之后的 36 天自动填充。 嗯,试试上面的修订版(假设你想从E8增加/减少日期值。

以上是关于粘贴值时如何引用非活动工作表?的主要内容,如果未能解决你的问题,请参考以下文章

当另一个工作簿处于活动状态时,UDF 引用命名表错误

Excel VBA,从非活动工作表中获取范围

根据行数据复制特定单元格并粘贴到特定工作表上

工作表之间的 Excel 自动填充与单元格引用

Excel中改变排序后,关联的工作表的数据就改变了,如何让关联的数据保持不变?

将行添加到多个工作表时清除错误