首页 > 解决方案 > VBA 将工作簿固定为各种工作簿

问题描述

我想我想更轻松地做我的日常事务。我对 VBA 没有任何广泛的了解,所以我将它与“记录 VBA”一起使用。

我有 2 个工作簿:(1)“DATABASE.xlsx” - 固定,它总是收集数据(2)许多工作簿,即“xxx.xlsx”,“yyyy.xlxs”,“zzzz.xlsx”等 - 可变工作簿,改变每个时间取决于我从工作簿中复制的内容 (1) - 我将自己手动打开 (2)

我的问题是如何编写我的 VBA 将数据从 (1) 复制到各种工作簿 (2)。我不知道如何定义总是变化的 (2) 工作簿。我可以手动选择 (2) 个工作簿。它不必是非常专业的东西。这只是关于从(1)到(2)的应对......

我做了如下:

Sub Makro10() ' ' Makro10 Makro ' ' Klawisz skrótu: Ctrl+Shift+X '
    Windows("DATABASE.xlsx").Activate
    ActiveCell.Offset(0, 2).Range("A1:H1").Select
    Selection.Copy
    Windows("xxx.xlsx").Activate
    ActiveCell.Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Windows("DATABASE.xlsx").Activate
    ActiveCell.Offset(0, 8).Range("A1").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("xxx.xlsx").Activate
    ActiveCell.Offset(0, 9).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Windows("DATABASE.xlsx").Activate
    ActiveCell.Offset(0, 1).Range("A1:C1").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("xxx.xlsx").Activate
    ActiveCell.Offset(0, 7).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Windows("DATABASE.xlsx").Activate
    ActiveCell.Offset(0, 3).Range("A1:B1").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("xxx.xlsx").Activate
    ActiveCell.Offset(0, 14).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False End Sub

它仅适用于特定的(2)工作簿“xxx.xlsx”,但我想将它用于各种(2)。我正在寻求支持,在此先感谢。

标签: excelvba

解决方案


实现这一点的最简单方法是替换代码中的所有Windows("xxx.xlsx").Activate实例Workbooks(2).Activate

但是您必须确保没有打开其他工作簿,因为代码可能会根据您打开 excel 文件的方式意外引用另一个工作簿。所以从技术上讲,您需要首先打开工作簿 (1),即 DATABASE.xlsx。然后打开您需要的任何工作簿 (2) 并运行代码。

Sub Makro10() ' ' Makro10 Makro ' ' Klawisz skrótu: Ctrl+Shift+X '
Windows("DATABASE.xlsx").Activate
ActiveCell.Offset(0, 2).Range("A1:H1").Select
Selection.Copy
Workbooks(2).Activate
ActiveCell.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Windows("DATABASE.xlsx").Activate
ActiveCell.Offset(0, 8).Range("A1").Select
Application.CutCopyMode = False
Selection.Copy
Workbooks(2).Activate
ActiveCell.Offset(0, 9).Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Windows("DATABASE.xlsx").Activate
ActiveCell.Offset(0, 1).Range("A1:C1").Select
Application.CutCopyMode = False
Selection.Copy
Workbooks(2).Activate
ActiveCell.Offset(0, 7).Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Windows("DATABASE.xlsx").Activate
ActiveCell.Offset(0, 3).Range("A1:B1").Select
Application.CutCopyMode = False
Selection.Copy
Workbooks(2).Activate
ActiveCell.Offset(0, 14).Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False End Sub

这里发生的是 VBA 引用了打开的第二个工作簿(即工作簿(2))并根据代码将数据粘贴到那里。在您之前的代码中,因为您记录了它,所以它总是使用 xxx.xlsx 文件,因为这就是您记录它的方式。

如果可能的话,我建议将代码保存在 DATABASE.xlsx 中并将文件保存为宏文件 (DATABASE.xlsm)。这样,您可以打开工作簿 (1) 和工作簿 (2)(您想要的任何一个)并运行工作簿 (1) 中的代码。

希望这可以帮助!快乐编码!


推荐阅读