Excel VBA 从另一个电子表格复制范围转置
Excel VBA Copy Range Transpose from Another Spreadsheet
我想从工作簿中复制一个范围并将其转置到我当前的 sheet 中。
为什么我会在这一行收到 "Subscript out of range" 错误:
Workbooks("Libraries\Documents\Book1.xlsx").Worksheets("Sheet1").Range("A1:A5").Copy
Sub PasteSpecial_Examples()
'
'https://www.excelcampus.com/vba/copy-paste-cells-vba-macros/
Workbooks("Libraries\Documents\Book1.xlsx").Worksheets("Sheet1").Range("A1:A5").Copy
ActiveSheet.Range("A1").PasteSpecial Transpose:=True
End Sub
Excel 只允许同时打开一个具有特定文件名的工作簿,即使这些工作簿存在于不同的目录中(它们必须存在,否则它们不能具有相同的目录)文件名).
Workbooks
集合的索引只是文件名,而不是完全限定的路径和名称。
我不确定第一点是第二点的原因,还是第二点是第一点的原因,但它们是相关的。
所以你的代码应该是:
Sub PasteSpecial_Examples()
Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1:A5").Copy
ActiveSheet.Range("A1").PasteSpecial Transpose:=True
End Sub
根据暗示您在 运行 您的代码时尚未打开 Libraries\Documents\Book1.xlsx
的评论,您可以这样做:
Sub PasteSpecial_Examples()
Dim wsDst As WorkSheet
Set wsDst = ActiveSheet
Workbooks.Open "Libraries\Documents\Book1.xlsx"
Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1:A5").Copy
wsDst.Range("A1").PasteSpecial Transpose:=True
End Sub
继续按名称引用工作簿。
或者,稍微好一点,这样做:
Sub PasteSpecial_Examples()
Dim wbSrc As WorkBook
Dim wsDst As WorkSheet
Set wsDst = ActiveSheet
Set wbSrc = Workbooks.Open("Libraries\Documents\Book1.xlsx")
wbSrc.Worksheets("Sheet1").Range("A1:A5").Copy
wsDst.Range("A1").PasteSpecial Transpose:=True
End Sub
它分配一个 Workbook
对象来引用新打开的工作簿,然后在 Copy
语句中使用该对象。
注意:在此代码中 "Libraries\Documents\Book1.xlsx"
是对文件的 相对 引用,例如如果当前目录是 C:\Temp
,那么它将查找文件 C:\Temp\Libraries\Documents\Book1.xlsx
。如果可能,您应该认真考虑使用绝对引用。
我是这样做的:
Dim Finfo As String
Dim FilterIndex As Long
Dim Title As String
Dim ExportFilename As Variant
Dim CopyBook As Workbook
Dim CopySheet As Worksheet
Dim MnthName As String
'Set up file filter
Finfo = "Excel Files (*.xls*),*.xls*"
'Set filter index to Excel Files by default in case more are added
FilterIndex = 1
' set Caption for dialogue box
Title = "Select a the DD Revenue Master file to Export to"
'get the Forecast Filename
ExportFilename = Application.GetOpenFilename(Finfo, FilterIndex, Title)
'Handle file Selection
If ExportFilename = False Then
'No Export File was Selected
MsgBox "No file was selected"
Else
'Check and see if this is a correct Export File
Workbooks.Open (ExportFilename)
Set CopyBook = ActiveWorkbook
Set CopySheet = CopyBook.Worksheets(1)
MsgBox "Valid File Selected."
Application.CutCopyMode = False
revenueSheet.Range("A1:BO500").Copy
CopyBook.Worksheets(1).Activate
CopyBook.Worksheets(1).Range("A1").PasteSpecial Paste:=xlPasteColumnWidths
CopyBook.Worksheets(1).Range("A1").PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False 'erase the clipboard
'close your stuff that you dont want open
End If
End Sub
完成后不要忘记关闭工作簿。我不得不 trim 编写一堆代码,因为我的文件在一个大案例中启动 select。但是经常你select一个工作簿,打开它,select一些数据,复制,粘贴,关闭工作簿。经常发生。希望这可以帮助。我相信我发现您必须激活新的 selected 工作簿才能对其执行操作。您始终可以将其中包含代码的工作簿引用为 ThisWorkbook
为了避免混淆,因为它们在一堆模块中使用,我有一个全局变量模块,其中包含以下内容,但如果您没有复杂的项目,您可以在子模块的顶部执行此操作。
Option Explicit
Public thisWB As Workbook
Public functionSheet As Worksheet
Public revenueSheet As Worksheet
Public salesSheet As Worksheet
Public scratchSheet As Worksheet
Public lastRow As Double
'**********************************************************
'This sub routine will be used to intialize public variables
'**********************************************************
Private Sub SetPublicVariables()
Set thisWB = ActiveWorkbook
Set functionSheet = thisWB.Worksheets("Data Functions")
Set revenueSheet = thisWB.Worksheets("DD Monthly Revenue")
Set salesSheet = thisWB.Worksheets("Salespersons")
Set scratchSheet = thisWB.Worksheets("ScratchSheet")
End Sub
我经常使用这种方法。 . . . . .
哦,我在打开工作簿时调用 public 变量设置(你可以找到那个方法)。要呼叫私人潜艇,您必须使用。
Application.Run "Global_Variables.SetPublicVariables"
'that is modulename.methodname if you want to pass arguments following
'Application.Run "modulename.methodname", arg1, arg2, etc.
干杯,编码愉快 - WWC
我想从工作簿中复制一个范围并将其转置到我当前的 sheet 中。
为什么我会在这一行收到 "Subscript out of range" 错误:
Workbooks("Libraries\Documents\Book1.xlsx").Worksheets("Sheet1").Range("A1:A5").Copy
Sub PasteSpecial_Examples()
'
'https://www.excelcampus.com/vba/copy-paste-cells-vba-macros/
Workbooks("Libraries\Documents\Book1.xlsx").Worksheets("Sheet1").Range("A1:A5").Copy
ActiveSheet.Range("A1").PasteSpecial Transpose:=True
End Sub
Excel 只允许同时打开一个具有特定文件名的工作簿,即使这些工作簿存在于不同的目录中(它们必须存在,否则它们不能具有相同的目录)文件名).
Workbooks
集合的索引只是文件名,而不是完全限定的路径和名称。
我不确定第一点是第二点的原因,还是第二点是第一点的原因,但它们是相关的。
所以你的代码应该是:
Sub PasteSpecial_Examples()
Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1:A5").Copy
ActiveSheet.Range("A1").PasteSpecial Transpose:=True
End Sub
根据暗示您在 运行 您的代码时尚未打开 Libraries\Documents\Book1.xlsx
的评论,您可以这样做:
Sub PasteSpecial_Examples()
Dim wsDst As WorkSheet
Set wsDst = ActiveSheet
Workbooks.Open "Libraries\Documents\Book1.xlsx"
Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1:A5").Copy
wsDst.Range("A1").PasteSpecial Transpose:=True
End Sub
继续按名称引用工作簿。
或者,稍微好一点,这样做:
Sub PasteSpecial_Examples()
Dim wbSrc As WorkBook
Dim wsDst As WorkSheet
Set wsDst = ActiveSheet
Set wbSrc = Workbooks.Open("Libraries\Documents\Book1.xlsx")
wbSrc.Worksheets("Sheet1").Range("A1:A5").Copy
wsDst.Range("A1").PasteSpecial Transpose:=True
End Sub
它分配一个 Workbook
对象来引用新打开的工作簿,然后在 Copy
语句中使用该对象。
注意:在此代码中 "Libraries\Documents\Book1.xlsx"
是对文件的 相对 引用,例如如果当前目录是 C:\Temp
,那么它将查找文件 C:\Temp\Libraries\Documents\Book1.xlsx
。如果可能,您应该认真考虑使用绝对引用。
我是这样做的:
Dim Finfo As String
Dim FilterIndex As Long
Dim Title As String
Dim ExportFilename As Variant
Dim CopyBook As Workbook
Dim CopySheet As Worksheet
Dim MnthName As String
'Set up file filter
Finfo = "Excel Files (*.xls*),*.xls*"
'Set filter index to Excel Files by default in case more are added
FilterIndex = 1
' set Caption for dialogue box
Title = "Select a the DD Revenue Master file to Export to"
'get the Forecast Filename
ExportFilename = Application.GetOpenFilename(Finfo, FilterIndex, Title)
'Handle file Selection
If ExportFilename = False Then
'No Export File was Selected
MsgBox "No file was selected"
Else
'Check and see if this is a correct Export File
Workbooks.Open (ExportFilename)
Set CopyBook = ActiveWorkbook
Set CopySheet = CopyBook.Worksheets(1)
MsgBox "Valid File Selected."
Application.CutCopyMode = False
revenueSheet.Range("A1:BO500").Copy
CopyBook.Worksheets(1).Activate
CopyBook.Worksheets(1).Range("A1").PasteSpecial Paste:=xlPasteColumnWidths
CopyBook.Worksheets(1).Range("A1").PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False 'erase the clipboard
'close your stuff that you dont want open
End If
End Sub
完成后不要忘记关闭工作簿。我不得不 trim 编写一堆代码,因为我的文件在一个大案例中启动 select。但是经常你select一个工作簿,打开它,select一些数据,复制,粘贴,关闭工作簿。经常发生。希望这可以帮助。我相信我发现您必须激活新的 selected 工作簿才能对其执行操作。您始终可以将其中包含代码的工作簿引用为 ThisWorkbook
为了避免混淆,因为它们在一堆模块中使用,我有一个全局变量模块,其中包含以下内容,但如果您没有复杂的项目,您可以在子模块的顶部执行此操作。
Option Explicit
Public thisWB As Workbook
Public functionSheet As Worksheet
Public revenueSheet As Worksheet
Public salesSheet As Worksheet
Public scratchSheet As Worksheet
Public lastRow As Double
'**********************************************************
'This sub routine will be used to intialize public variables
'**********************************************************
Private Sub SetPublicVariables()
Set thisWB = ActiveWorkbook
Set functionSheet = thisWB.Worksheets("Data Functions")
Set revenueSheet = thisWB.Worksheets("DD Monthly Revenue")
Set salesSheet = thisWB.Worksheets("Salespersons")
Set scratchSheet = thisWB.Worksheets("ScratchSheet")
End Sub
我经常使用这种方法。 . . . . .
哦,我在打开工作簿时调用 public 变量设置(你可以找到那个方法)。要呼叫私人潜艇,您必须使用。
Application.Run "Global_Variables.SetPublicVariables"
'that is modulename.methodname if you want to pass arguments following
'Application.Run "modulename.methodname", arg1, arg2, etc.
干杯,编码愉快 - WWC