使用Personal.xlsb - 在VBA中引用活动工作簿

时间:2016-09-29 20:38:46

标签: excel vba excel-vba

我的Personal.xlsb文件中的模块中有许多脚本。它保持隐藏,但在这个脚本中,我们的想法是每次都在不同的工作簿中运行它。它打开一个单独的工作簿(source.xlsx),从中复制一个范围,粘贴到原始工作簿,然后关闭source.xlsx。

当涉及到“ThisWorkbook.ActiveSheet.Paste”部分时,它将其粘贴到Personal.xlsb工作簿中,而不是实际打开且可见的目标工作簿。如何确保将其粘贴到正确的工作簿中?工作簿的文件名总是不同的,所以我不能指定路径或类似的东西。

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.Paste
    wbSource.Close
    Application.DisplayAlerts = True
        Call CopyCFormat
End Sub

2 个答案:

答案 0 :(得分:3)

在大多数情况下不要使用ThisWorkbook,因为它引用了存储宏的工作簿(在本例中为personal.xlsb)。

相反,您可以使用ActiveWorkbook来指代在运行宏时具有焦点的工作簿。您还可以将ActiveWorkbook分配给变量以便于参考。

Sub CopyData()
Application.DisplayAlerts = False
Dim wbSource As Workbook
Dim wbTarget as Workbook

Set wbTarget = ActiveWorkbook

Set wbSource = Workbooks.Open(Filename:="source.xlsx", UpdateLinks:=3)
wbSource.Sheets(1).Range("A1:X105").Copy

wbTarget.ActiveSheet.Paste
wbSource.Close
Application.DisplayAlerts = True
    Call CopyCFormat
End Sub

您还可以引用活动工作表,而不指定它所在的工作簿,如下:

Dim wbSource As Workbook
Dim shtTarget as Worksheet

Set shtTarget = ActiveSheet

Set wbSource = Workbooks.Open(Filename:="source.xlsx", UpdateLinks:=3)
wbSource.Sheets(1).Range("A1:X105").Copy

shtTarget.ActiveSheet.Paste

运气!

答案 1 :(得分:0)

如果我理解它,你应该只添加另一个工作簿变量。

Sub CopyData()
Dim mainWB  As Workbook
Dim mainWS  As Worksheet
Set mainWB = ActiveWorkbook
Set mainWS = mainWB.Sheets(1)    ' Change this to whatever you need it to be

Application.DisplayAlerts = False
Dim wbSource As Workbook
Set wbSource = Workbooks.Open(Filename:="source.xlsx", UpdateLinks:=3)
wbSource.Sheets(1).Range("A1:X105").Copy

mainWS.Paste
wbSource.Close
Application.DisplayAlerts = True
Call CopyCFormat
End Sub