Excel 使用不同工作簿的参考资料

Excel 使用不同工作簿的参考资料,excel,vba,Excel,Vba,此代码的思想是从名为My list.xlsx的工作簿启动它,并在My list的工作表FX上创建一个列表;此列表将基于另一个已打开的名为Daily prices.xlsm的工作簿的电子表格 当我尝试到处玩的时候,它似乎不喜欢我引用其他工作簿上的列表来复制它的方式。这是我的密码: Sub forEachWs() Dim ws As Worksheet, dest As Worksheet Dim LastRow As Long Dim LastRowDestination

此代码的思想是从名为My list.xlsx的工作簿启动它,并在My list的工作表FX上创建一个列表;此列表将基于另一个已打开的名为Daily prices.xlsm的工作簿的电子表格

当我尝试到处玩的时候,它似乎不喜欢我引用其他工作簿上的列表来复制它的方式。这是我的密码:

Sub forEachWs()
    Dim ws As Worksheet, dest As Worksheet
    Dim LastRow As Long
    Dim LastRowDestination As Long
    Dim ExRateWb As Workbook
    Dim DailyPrices As Workbook

    Set ExRateWb = ActiveWorkbook
    Set DailyPrices = Workbooks("Daily prices.xlsm")
    Set dest = Worksheets("FX")

    For Each ws In DailyPrices.Worksheets
        Select Case ws.Name
            Case "FX", "BBG prices", "PRICES"

            Case Else

                MsgBox DailyPrices.Name

                LastRow = ws.UsedRange.Rows.Count
                LastRowDestination = dest.UsedRange.Rows.Count + 2

                DailyPrices.ws.Range(Cells(1, 1), Cells(LastRow, 5)).Copy
                ExRateWb.dest.Cells(LastRowDestination, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _ 
                                    SkipBlanks:=False, Transpose:=False

        End Select
    Next
End Sub
正如您所说,您并没有指出问题发生的确切位置,但我确实看到了一些潜在的错误区域,我将在违规行上方指出:

Sub forEachWs()
    Dim ws As Worksheet, dest As Worksheet
    Dim LastRow As Long
    Dim LastRowDestination As Long
    Dim ExRateWb As Workbook
    Dim DailyPrices As Workbook
假设这将指向代码所在的工作簿。但是,不能保证这种情况仍然存在,因为OP中可能使用了其他未显示的代码。选择将更改Active工作簿的内容的代码

使用此方法设置工作簿变量要好得多,因为无论当前处于活动状态的工作簿是什么,都可以保证它是准确的-这是分配工作簿变量的首选方法

您的工作表假定在ActiveWorkbook中,同样,不保证当前活动工作簿中的任何内容都会有一个FX工作表。建议将其更改为设置Dest=ExRateWb.WorksheetsFX或设置Dest=DailyPrices.WorksheetsFX(视情况而定)

    Set dest = Worksheets("FX")

    For Each ws In DailyPrices.Worksheets
        Select Case ws.Name
            Case "FX", "BBG prices", "PRICES"
我建议在这里至少写一条评论,承认你故意不为这三张工作表做任何事情。有助于防止您或其他人下一次通过您的代码时出现问题&想知道意外删除了什么内容

            Case Else
                MsgBox DailyPrices.Name
                LastRow = ws.UsedRange.Rows.Count
                LastRowDestination = dest.UsedRange.Rows.Count + 2
DailyPrices是一个工作簿变量,其中包含一组工作表,您已在For Each中引用了这些工作表。。。语句,该语句创建了您当前所在的循环。再次引用它将无效。ws是对DailyPrices工作簿中当前循环工作表的引用。删除每日价格。参考下文

                DailyPrices.ws.Range(Cells(1, 1), Cells(LastRow, 5)).Copy
与上述注释类似,Dest已被定义为属于特定工作簿的工作表,因此ExRateWb限定符是不必要的,事实上是无效的。移除它

                ExRateWb.dest.Cells(LastRowDestination, 1).PasteSpecial _
                           Paste:=xlPasteValues, Operation:=xlNone, _ 
                           SkipBlanks:=False, Transpose:=False

        End Select
    Next
End Sub

如果这些更改不能解决该问题,请具体说明错误的位置,以及错误的具体内容。

在哪一行标记错误?
                DailyPrices.ws.Range(Cells(1, 1), Cells(LastRow, 5)).Copy
                ExRateWb.dest.Cells(LastRowDestination, 1).PasteSpecial _
                           Paste:=xlPasteValues, Operation:=xlNone, _ 
                           SkipBlanks:=False, Transpose:=False

        End Select
    Next
End Sub