【问题标题】:Calculating Data from Separate Workbook VBA从单独的工作簿 VBA 计算数据
【发布时间】:2014-10-06 01:55:58
【问题描述】:

我正在尝试整理一个主电子表格,该电子表格从 100 多个包含各种数据的工作簿中提取。我无法弄清楚如何访问已关闭的工作簿以计算其中一行的标准偏差。

Sub RefreshSourceData()
    Dim sourceFile, fileName As String, path As String
    Dim dispersionRange As Range
    path = "U:\SPACE Info\Meeting Materials\Strategy Files\"
    fileName = "[" & ActiveCell.EntireRow.Cells(1, 1).Value & ".xls]"
    sourceFile = "=" & path & fileName
    dispersionRange = "=" & path & fileName & "Account'!R:R"
    Range("B" & ActiveCell.Row).Formula = sourceFile & "Summary'!$F$2"
    Range("C" & ActiveCell.Row).Formula = sourceFile & "Summary'!$F$3"
    Range("D" & ActiveCell.Row).Formula = sourceFile & "Summary'!$B$10"
    Range("E" & ActiveCell.Row).Formula = sourceFile & "Summary'!$D$10"
    Range("F" & ActiveCell.Row).Formula = WorksheetFunction.StDev(dispersionRange)
End Sub

我收到了各种错误,现在是“对象变量或未设置对象变量。”

我也尝试过创建一个包含路径和文件名的工作簿变量,但这也没有奏效。

【问题讨论】:

  • 可能最简单的方法是使用 VBA 打开每个工作簿 (workbooks.open),进行计算,关闭工作簿,然后转到下一个工作簿。您当前的错误正在发生,因为您没有“设置”dispersionRange

标签: vba excel statistics


【解决方案1】:

这些是一些尽力而为的建议,因为我无法测试所有内容(我没有你的数据)。

对于您的直接错误,我认为您打算将 dispersionRange 设为 String,而不是 Range

此外,在添加公式引用时,请确保在 sourceFile 周围添加单引号,例如:

Range("B" & ActiveCell.Row).Formula = "'" & sourceFile & "Summary'!$F$2"
Range("C" & ActiveCell.Row).Formula = "'" & sourceFile & "Summary'!$F$3"
Range("D" & ActiveCell.Row).Formula = "'" & sourceFile & "Summary'!$B$10"
Range("E" & ActiveCell.Row).Formula = "'" & sourceFile & "Summary'!$D$10"
                                      ^^^^^

dispersionRange 也是如此(注意缺少 =):

dispersionRange = "'" & path & fileName & "Account'!R:R"

最后,最后一个 .Formula(对于“F”列)应该是 .Value,因为 StDev 返回一个 Double。此外,StDev 函数不将范围作为字符串,而是将范围对象作为适当的范围对象,因此请尝试以下操作:

Range("F" & ActiveCell.Row).Value = WorksheetFunction.StDev(Range(dispersionRange))

更新

为避免混淆,我已经修改了您的代码,并将其列在下面。请注意,这是未经测试的,因为我无权访问您的工作簿,但它应该可以工作。

Sub RefreshSourceData()

  Dim sourceFile, fileName As String, path As String
  Dim dispersionRange As String

  path = "U:\SPACE Info\Meeting Materials\Strategy Files\"
  fileName = "[" & ActiveCell.EntireRow.Cells(1, 1).Value & ".xls]"
  sourceFile = path & fileName
  dispersionRange = "'" & path & fileName & "Account'!R:R"

  Range("B" & ActiveCell.Row).Formula = "='" & sourceFile & "Summary'!$F$2"
  Range("C" & ActiveCell.Row).Formula = "='" & sourceFile & "Summary'!$F$3"
  Range("D" & ActiveCell.Row).Formula = "='" & sourceFile & "Summary'!$B$10"
  Range("E" & ActiveCell.Row).Formula = "='" & sourceFile & "Summary'!$D$10"

  Range("F" & ActiveCell.Row).Value = WorksheetFunction.StDev(Range(dispersionRange))

End Sub

【讨论】:

  • 现在我收到运行时错误 1004“对象 '_Global' 的方法 'Range' 失败。”看来它不喜欢 Range(dispersionRange)
  • @user2662565:我已经用应该可以工作的最终代码版本更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
相关资源
最近更新 更多