Excel将工作簿与vba

时间:2018-02-14 07:18:30

标签: excel vba excel-vba

我想问你是否可以帮我将工作簿A中的一些工作表数据复制到我的活动工作簿中(工作簿B)

我在主工作簿中有以下代码来复制工作簿A中的数据

Public Sub Worksheet_Activate()

    test

End Sub


Sub test()
    Dim Wb1 As Workbook
    Dim MainBook As Workbook

    'Open All workbooks first:
    Set Wb1 = Workbooks.Open("Z:\Folder\WorkbookA.xlsm")
'Set MainBook = Workbooks.Open(Application.ActiveWorkbook.FullName)
Set MainBook = Application.ActiveWorkbook

'Now, copy what you want from wb1:
Wb1.Sheets("Projekte").Cells.Copy
'Now, paste to Main worksheet:
MainBook.Worksheets("Projekte").Range("A1").PasteSpecial xlPasteAll
Application.CutCopyMode = False

    'Close Wb's:
    Wb1.Close SaveChanges:=False

End Sub

我知道,它会打开工作表A并突出显示并复制数据。

脚本不会将其粘贴到工作表B(执行脚本的地方)

有人知道我做错了吗?

最诚挚的问候,并感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

您应该首先在原点之前设置Mainbook(目标)(如果您要使用ActiveWorkbook)。

'Set MainBook First
   Set MainBook = ThisWorkbook
'Open All workbook:
   Set Wb1 = Workbooks.Open("Z:\Folder\WorkbookA.xlsm")

为了清楚起见,这只是我在这个上的OC。

答案 1 :(得分:0)

您必须正确引用您的工作簿和工作表对象

如果你必须粘贴范围的整个内容(包括格式,注释......),那么你想编写如下代码(注释中的解释):

Option Explicit

Sub test()
    Dim targetSheet As Worksheet

    Set targetSheet = ActiveSheet 'store currently active sheet
    Workbooks.Open("Z:\Folder\WorkbookA.xlsm").Sheets("Projekte").UsedRange.Copy Destination:=targetSheet.Range("A1") ' open the wanted workbook and copy its "Projekte" sheet used range to 'targetSheet (i.e.: the sheet in the workbook where it all started) from its cell A1
    ActiveWorkbook.Close SaveChanges:=False ' close the currently active workbook (i.e. the just opened one)
End Sub

如果您只需要粘贴值,那么这就是要走的路(更快!):

Option Explicit

Sub test()
    Dim targetSheet As Worksheet

    Set targetSheet = ActiveSheet 'store currently active sheet

    With Workbooks.Open("Z:\Folder\WorkbookA.xlsm").Sheets("Projekte").UsedRange ' open the wanted workbook and reference its sheet "Projekte" used range
        targetSheet.Range("A1").Resize(.Rows.Count, .Columns.Count).Value = .Value
        .Parent.Parent.Close SaveChanges:=False 'close the parent workbook of referenced range (i.e., the newly opened workbook)
    End With
End Sub

答案 2 :(得分:0)

我的建议是永远不要使用ActiveWorkbook

在大多数情况下,当人们使用ActiveWorkbook时,他们实际上打算使用ThisWorkbook。区别在于:

  • ActiveWorkbook是当前选定的屏幕上方的#34;"确切地说,代码运行的那一刻。这可以是用户在代码运行时单击的任何工作簿。因此,您永远无法100%确定获得正确的工作簿。

  • ThisWorkbook是您的代码目前运行的实际工作簿。这并没有改变。所以这是一个明确定义的参考,并且没有关于哪个工作簿目前处于最佳位置的赌博。

关于您的方法无效的原因

Set Wb1 = Workbooks.Open("Z:\Folder\WorkbookA.xlsm") 'this line makes WorkbookA the active one
Set MainBook = Application.ActiveWorkbook 'this makes MainBook = WorkbookA

因此,简单的Set MainBook = Application.ThisWorkbook应该适用于此。

另一项建议

SheetsWorksheets不一样。确保在使用Sheets时永远不会使用Worksheets

  • Sheets包含工作表和图表
  • Worksheets仅包含工作表

示例Sheets(1).Range("A1")如果是图表则会失败。