Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA复制范围从另一个电子表格转置_Vba_Excel_Transpose - Fatal编程技术网

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

Excel VBA复制范围从另一个电子表格转置,vba,excel,transpose,Vba,Excel,Transpose,我想从工作簿中复制一个范围,并将其转换到当前工作表中 为什么在这一行上会出现“下标超出范围”错误: 工作簿(“Libraries\Documents\Book1.xlsx”)。工作表(“Sheet1”)。范围(“A1:A5”)。副本 Excel只允许同时打开一个具有特定文件名的工作簿,即使这些工作簿存在于不同的目录中(它们必须存在,或者不能具有相同的文件名) 工作簿集合的索引只是文件名,而不是完全限定的路径和名称 我不确定第一点是否是第二点的原因,或者第二点是否是第一点的原因,但它们是相关的

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

为什么在这一行上会出现“下标超出范围”错误:

工作簿(“Libraries\Documents\Book1.xlsx”)。工作表(“Sheet1”)。范围(“A1:A5”)。副本

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

  • 工作簿
    集合的索引只是文件名,而不是完全限定的路径和名称

我不确定第一点是否是第二点的原因,或者第二点是否是第一点的原因,但它们是相关的

因此,您的代码应该是:

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
它指定一个
工作簿
对象来引用新打开的工作簿,然后在
复制
语句中使用该对象

注意:在此代码中,“Libraries\Documents\Book1.xlsx”是对文件的相对引用,例如,如果当前目录是
C:\Temp
,则它将查找文件
C:\Temp\Libraries\Documents\Book1.xlsx
。如果可能的话,你应该认真考虑使用绝对引用。

< P>我这样做:

    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 select中。但通常您会选择一个工作簿,打开它,选择一些数据,复制它,粘贴它,然后关闭工作簿。经常发生。希望这有帮助。我相信我发现您必须激活新选择的工作簿才能对其执行操作。您始终可以将包含代码的工作簿称为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
我经常用这种方法

哦,我调用了在工作簿打开时设置的公共变量(您可以找到该方法)。为了呼叫私人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

非常感谢。如何指定工作簿的路径?无需指定路径-任何时候都只能打开一个名为“Book1.xlsx”的工作簿,因此Excel知道它是以该名称打开的工作簿。(或者您想知道如何打开工作簿???)请参见下面的内容,但您不能像上面提到的那样打开多个同名工作簿。很好的做法是明确说明您所指的工作簿和工作表,否则最终会遇到Excel无法为您解决的问题。现在我明白了-我的逻辑有缺陷。我打开了一个工作表,我想将另一个工作簿中具有不同文件名的区域复制到其中。我知道另一个工作簿的文件名。太好了!!刚刚添加:wbSrc.Close SaveChanges:=False
Application.Run "Global_Variables.SetPublicVariables"
'that is modulename.methodname if you want to pass arguments following
'Application.Run "modulename.methodname", arg1, arg2, etc.