【问题标题】:Excel - copy from another workbook with conditional formatting intactExcel - 从另一个工作簿复制,条件格式不变
【发布时间】:2016-09-28 19:44:38
【问题描述】:

我自己已经解决了大部分问题,但让我束手无策的部分是能够粘贴条件格式。

我希望能够打开一个工作簿,运行 VBA 脚本来打开另一个工作簿,从中复制一个范围,然后将其粘贴到原始工作簿中。

我取得的最大成功是录制宏并实现了这一点: 打开原始的目标工作簿...

  1. 打开源工作簿
  2. 复制范围 A1:X105
  3. 关闭源工作簿
  4. 粘贴到目标工作簿中标题为“Temp”的工作表中

问题在于源工作簿包含条件格式,如果在粘贴到目标工作簿之前关闭源工作簿,则不会粘贴条件格式。

因此,要么我需要找到一种方法以条件格式粘贴数据,要么我需要能够在关闭源工作簿之前切换回目标工作簿。这是一个需要使用不同的目标工作簿多次运行的过程,因此 VBA 代码无法引用目标的工作簿文件名。不过,源工作簿将始终具有相同的路径。

搜索该站点,我只能找到为两个工作簿指定路径的解决方案。

这就是我现在拥有的:

Sub CopyData() 
Application.DisplayAlerts = False 
Workbooks.Open filename:="source.xlsx", _ 
UpdateLinks:=3 
Range("A1:X105").Select 
Selection.Copy 
ActiveWindow.Close 
Sheets("Temp").Select 
ActiveSheet.Paste 
Application.DisplayAlerts = True 
End Sub

我想我需要实现的是将目标工作簿声明为变量。有人可以帮忙吗?

【问题讨论】:

  • 所以听起来你的脚本必须在关闭第一个工作簿之前从源工作簿粘贴到目标工作簿。如果将其设置为工作簿变量,即使不指定工作簿名称,这也不是问题。请提供您目前开发的代码以获得进一步的帮助。
  • Sub CopyData() Application.DisplayAlerts = False Workbooks.Open filename:="source.xlsx", _ UpdateLinks:=3 Range("A1:X105").Select Selection.Copy ActiveWindow.Close Sheets("Temp").Select ActiveSheet.Paste Application.DisplayAlerts = True End Sub
  • 对不起。我不知道如何在评论中做预先格式化的文本。
  • @Robby 您必须在问题中输入代码。除了小的单线之外,任何东西都不能在 cmets 中渲染。
  • 因此 VBA 代码无法引用目标的工作簿文件名。 可能不是,但它可以 绝对可以打开 @987654323 @ 提示并以编程方式打开有问题的工作簿... :)

标签: vba excel


【解决方案1】:

您可以使工作簿变暗,然后复制和粘贴。完成后,您可以使用该变量,关闭工作簿。代码如下:

Sub CopyData()
    Application.DisplayAlerts = False
    Dim wbSource As Workbook
    Set wbSource = Workbooks.Open(Filename:="source.xlsx", UpdateLinks:=3)
    wbSource.Sheets(1).Range("A1:X105").Copy
    ThisWorkbook.ActiveSheet.Selection.Paste
    wbSource.Close
    Application.DisplayAlerts = True
End Sub

我不知道您如何确定在目标工作簿上粘贴的范围,但将其留给另一个问题。我认为 Emily Alden 的答案不会起作用,因为您无法从已关闭的来源复制。剪贴板在 Excel 中的行为与在其他应用程序中的行为不同。

【讨论】:

  • 太棒了。这正是我想要的。谢谢。粘贴部分有效,因为在此之前我有创建新工作簿并专注于 A1 的代码。所以当 source.xlsx 被关闭并且 target.xlsx 被激活时,它总是在 A1 上。
  • 对不起。我不知道它以前是如何工作的,但现在不是。在 source.xlsx 上复制 A1:X105 后,它不会在关闭之前返回到目标电子表格进行粘贴。我认为“ThisWorkbook.ActiveSheet.Paste”是错误的。
  • 试试ThisWorkbook.ActiveSheet.Selection.Paste。正如您所说,它应该在 A1 上,可能只是缺少说明要粘贴到的范围和 .Selection 应该可以做到这一点。
【解决方案2】:

根据新信息:

Sub CopyData() 
Application.DisplayAlerts = False 
Workbooks.Open filename:="source.xlsx", _ 
UpdateLinks:=3 
Range("A1:X105").Select 
Selection.Copy 
ActiveWindow.Close 
Sheets("Temp").Select 
ActiveSheet.PasteSpecial xlPasteFormats
Application.DisplayAlerts = True 
End Sub

上一个: 发件人:Copy conditional formatting from one cell to another using VBA?

Sub test()
     Sheets("B").[B1].Copy: Sheets("A").[A1:A10].PasteSpecial xlPasteFormats
End Sub

是将粘贴条件格式的代码。

您需要做的主要是更改顺序:

  1. 使用提示用户选择文件来开源

  2. 从源复制范围

  3. 将范围粘贴到原始位置
  4. 关闭源代码

【讨论】:

  • 我认为您不能在粘贴之前关闭源代码,因为剪贴板仅存储指向 excel 文件的链接,而不是数据本身。问候,
  • 哎呀。你是对的。我的意思是颠倒顺序,但您的回答更简洁,所以我将保持原样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
相关资源
最近更新 更多