Excel VBA复制范围从另一个电子表格转置

时间:2017-12-22 00:40:11

标签: excel vba excel-vba transpose

我想从工作簿中复制一个范围并将其转置到我当前的工作表中。

为什么我会在此行中收到“下标超出范围”错误:

  

工作簿( “库\文件\ Book1.xlsx”)工作表( “工作表Sheet”)范围。( “A1:A5”)复制

Sub PasteSpecial_Examples()
'https://stackoverflow.com/questions/8852717/excel-vba-range-copy-transpose-paste
'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

2 个答案:

答案 0 :(得分:1)

  • Excel只允许同时打开一个具有特定文件名的工作簿,即使这些工作簿存在于不同的目录中(它们必须存在,或者它们不能具有相同的文件名)。

    < / LI>
  • 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。如果可能,您应该认真考虑使用绝对参考。

答案 1 :(得分:0)

我这样做:

    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

完成后不要忘记关闭工作簿。我不得不修剪一堆代码,因为我的文件启动到一个大的case选择。但通常您选择一个工作簿,打开它,选择一些数据,复制它并粘贴它,关闭工作簿。发生了很多。希望这可以帮助。我相信我发现你必须激活新选择的工作簿才能对其执行操作。您始终可以使用其中的代码作为ThisWorkbook

来引用工作簿

为了避免混淆,并且由于它们被用在一堆模块中,我有一个全局变量模块,其中包含以下内容,但如果你没有复杂的项目,你可以在sub的顶部执行此操作。

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

我使用这种方法很多。 。 。 。 。 。

哦,我打开工作簿上设置的公共变量(你可以找到那个方法)。要调用私人子,您必须使用。

Application.Run "Global_Variables.SetPublicVariables"
'that is modulename.methodname if you want to pass arguments following
'Application.Run "modulename.methodname", arg1, arg2, etc.

干杯,快乐的编码 - WWC