使用不同工作簿的参考

时间:2015-04-23 10:15:59

标签: excel-vba vba excel

此代码的想法是从名为" My list.xlsx"的工作簿中启动它。并在工作表上创建一个列表" 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

1 个答案:

答案 0 :(得分:0)

作为kaybee99 mentioned,您没有准确指出问题发生的位置,但我确实看到了一些潜在的错误区域,我会在违规行上方注明:

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中未显示)可能使用了<workbook>.Select,这会改变ActiveWorkbook的内容

    Set ExRateWb = ActiveWorkbook
  

使用此方法设置“工作簿”变量要好得多,因为无论当前哪个工作簿处于活动状态,它都保证准确无误 - 这是分配Workbook变量的首选方法。

    Set DailyPrices = Workbooks("Daily prices.xlsm")

假设您的工作表位于ActiveWorkbook,同样,无法保证当前活动工作簿中的任何内容都会包含FX工作表。建议酌情将其更改为Set Dest = ExRateWb.Worksheets("FX")Set Dest = DailyPrices.WorkSheets("FX")

    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是一个Workbook变量,其中包含您已在For Each...语句中引用的工作表集合,该语句创建了您当前所在的循环。再次引用它将无效。 ws是对DailyPrices工作簿中当前(在此循环中)工作表的引用。删除下面的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

如果这些更改无法解决问题,请详细说明您收到错误的位置,以及错误的确切位置。