【问题标题】:excel files loopexcel文件循环
【发布时间】:2012-01-09 11:20:56
【问题描述】:

在我的 Excel 工作表中,我使用了引用外部工作表的公式。 我不想手动更改单元格E7 中的值(我在其中插入外部工作表的名称),而是想编写一个宏来打开所有外部工作表,更改E7 中的参考值并复制生成的值。

很遗憾,我的代码不起作用 - Excel 无法“看到”外部工作表中的值。 我应该改变什么?


Sub lista_plik()
    Dim oExcel As Excel.Application
    Dim oWB As Workbook
    Set oExcel = New Excel.Application
    folder = "path_here"
    folder2 = folder & "*.xlsx"

    arkusz = Dir(folder2)

    Do While arkusz <> ""
        x = x + 1
        Range("E7").Value = Replace(arkusz, ".xlsx", "")
        arkusz = folder & arkusz

        Set oWB = oExcel.Workbooks.Open(arkusz)
''''''''''''''''''''
HERE CODE TO COPY VALUES
'''''''''''''''''''''''
        oWB.Close
        arkusz = Dir
    Loop
End Sub

【问题讨论】:

  • 目前还不清楚(至少对我而言)您想要做什么,以及您在这里缺少什么。 E7 将使用您打开的每个新工作台名称(而不是工作表)进行更新和覆盖。你想复制什么值?对于同一张纸,新纸等?请发布更多信息
  • 为什么不在同一个 Excel 会话中打开另一个 wb?此外,您应该使用相关的工作簿来限定您的所有 Range(),否则会导致混淆......

标签: loops excel vba


【解决方案1】:

我同意 brettdj 的观点,很难知道你想要达到什么目标。

克里斯已经修正了你的两个错误,但没有解释我怀疑是问题原因的第二次更正。

在您的代码中,您使用Range("E7").Value。这指的是活动工作簿的活动工作表中的单元格 E7。 Chris 已将其更改为 oWS.Range("E7").Value,这是一个改进,但 oWS 尚未初始化,因此还不够。

我使用多个工作簿的经验是,您必须保持完全控制。我怀疑您的错误是 Excel 正在查看错误的 E7。以下步骤将消除该错误和任何类似错误。

第 1 步

通过检查WorkBooks.Count = 1,确保一开始只打开一个工作簿。如果您允许打开两个或更多工作簿,您将需要代码来检查活动工作簿是否是您想要的工作簿。所以像:

If WorkBooks.Count > 1 Then
  Call MsgBox("Please close other workbooks then try again.", vbYesOnly)
  Exit Sub
End If

第 2 步

在打开任何其他工作簿之前,记录哪个是主工作簿。

Dim WBkMaster As WorkBook

WBkMaster = ActiveWorkBook

第 3 步

始终明确引用工作簿和工作表。例如:

With WBkMaster
  With Sheets("x1")
    .Range("E7").Value = ...
    ' Extract data from Sheet x1 to variables here
  End With
  With Sheets("x2")
    ' Extract data from Sheet x2 to variables here
  End With
End With

Set WBkDestination = Application.Workbooks.Open(arkusz)

With WBkDestination
  With Sheets("x3")
    ' Save data for Sheet x3 from variables here
  End With
  With Sheets("x4")
    ' Save data for Sheet x4 from variables here
  End With
  . Close
End With
oWB = Nothing   ' Ensure no reference to closed workbook

还有其他方法可以在工作表和工作簿之间复制数据,但您没有提供足够的信息来推荐最合适的方法。关键问题是您必须完全明确要处理哪个工作表和哪个工作簿。

【讨论】:

  • +1 非常清晰且解释清楚。我不确定在这种情况下是否需要第 1 步
  • @JMax。也许你比我更小心。我检查了我的目标工作簿并且忘记在运行宏之前关闭它们,因为错误的工作簿处于活动状态而导致损坏。我经常将不希望我的用户看到的宏保存在单独的工作簿中,因此这是我希望避免的常见风险。
【解决方案2】:

如果您在 VBA 中运行它,则无需声明 Excwl 的实例。改为:

Sub lista_plik()
    Dim oWB As Workbook
    Dim oWs As Worksheet
    Set oWs = ActiveSheet

    folder = "path_here\"
    folder2 = folder & "*.xlsx"

    arkusz = Dir(folder2)

    Do While arkusz <> ""
        x = x + 1
        oWs.Range("E7").Value = Replace(arkusz, ".xlsx", "")
        arkusz = folder & arkusz

        Set oWB = Application.Workbooks.Open(arkusz)
''''''''''''''''''''
'HERE CODE TO COPY VALUES
'''''''''''''''''''''''
        oWB.Close
        arkusz = Dir
    Loop
End Sub

注意:我不确定您指的是哪个工作簿单元格E7,这里我假设它在活动工作簿中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多