excel - 计算已关闭 Excel 文件中数据的平均值/标准偏差
问题描述
我知道我可以使用
ExecuteExcel4Macro("'C:\Location\Name\[excel1Test.xlsx]Sheet1'!R3C3")
(https://stackoverflow.com/questions/32015693/getting-a-range-from-a-closed-workbook-into-an-array)从关闭的工作簿中获取值
并对打开的工作簿进行标准偏差计算
Public Function MySdiv(Worksheet As String, lookRange As String) As Double
Set myRange = Worksheets(Worksheet).Range(lookRange)
answer = Application.WorksheetFunction.StDev(myRange)
MySdiv = answer
End Function
我有一个封闭的 Excel,我知道这个 Excel 的名称和路径以及所有内容,我想对 Sheet1 的.StDev
数组执行一个函数C1:C2000
excel1Test.xlsx.
问题是获取 的数组C1:C2000
,并在该数组上执行 a .StDev
。
有excel1Test.xlsx
很多兄弟,他们都位于同一个文件夹中。它们看起来都有些相似。换句话说,它们都有C1:C2000
和Sheet1
。
我知道了
通过使用ExecuteExcel4Macro(arg)
and 一个While
循环来找出数组的大小和一个For
循环来填充数组。
Function ArrayOut(strLocation As String, sheet As String, filename As String) As Double()
Dim RowNum As Long, ref As String, arrWh() As Double, x As Integer, arg As String
RowNum = 3
ref = "C" & RowNum
arg = " '" & strLocation & "[" & filename & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)
x = 1
Do While Not (ExecuteExcel4Macro(arg) = 0) ' while this cell doesn't equal to 0
ReDim arrWh(0 To x - 1)
RowNum = RowNum + 1
ref = "C" & RowNum
arg = " '" & strLocation & "[" & filename & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)
x = x + 1
Loop
RowNum = 3
x = 1
ref = "C" & RowNum
arg = " '" & strLocation & "[" & filename & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)
For i = LBound(arrWh) To UBound(arrWh)
arrWh(i) = ExecuteExcel4Macro(arg)
RowNum = RowNum + 1
ref = "C" & RowNum
arg = " '" & strLocation & "[" & filename & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)
Next i
RowNum = 3
x = 1
ArrayOut = arrWh
End Function
然后将结果放入此函数中:
Function AssiSTDVCal(Arr() As Double) As Double
Dim Mean As Double, i As Long, x As Long, NewArr() As Double
ReDim NewArr(UBound(Arr))
Mean = MeanCal(Arr)
For i = LBound(Arr) To UBound(Arr)
NewArr(i) = (Arr(i) - Mean) * (Arr(i) - Mean)
Next i
For x = LBound(NewArr) To UBound(NewArr)
Sum = Sum + NewArr(x)
Next x
AssiSTDVCal = Sqr(Sum / (x - 1))
End Function
Function AssistSTDVCal(MeanNum As Double, Arr() As Double) As Double
Dim i As Long, NewArr(UBound(Arr)) As Double, Sum As Double
For i = LBound(Arr) To UBound(Arr)
NewArr(i) = Abs(Arr(i) - MeanNum)
Next i
Dim x As Long
For x = LBound(NewArr) To UBound(NewArr)
Sum = Sum + NewArr(x)
Next x
AssistSTDVCal = sqrt(Sum / (x - 1))
End Function
'Mean calculation
Function MeanCal(Arr() As Double) As Double
Dim i As Long, Sum As Double, avg As Double
For i = LBound(Arr) To UBound(Arr)
Sum = Sum + Arr(i)
Next i
avg = Sum / i
MeanCal = avg
End Function
这段代码非常非常慢。我有 100 多个 Excel 文件,每个文件 6 张,每张 5000 到 100 行不等...
我正在再次寻求帮助以加快此代码的速度。
解决方案
推荐阅读
- ibm-cloud - 如何在 Apache Spark 中跟踪我的应用程序的当前执行情况
- php - 如何重置 Apache
- html - 为什么导航栏折叠按钮总是显示在我的网页上?
- java - BufferedImage 像素扫描留下空白
- c++ - 如何在 macOS 中使用 Clang 从可执行文件中删除所有本地符号名称?
- javascript - Angular Router Animations - 编译错误 - 装饰器不支持函数调用
- python-3.x - 如何在 Pytorch 中获取自定义数据集的 class_to_idx 映射
- xamarin.android - Visual Studio 2017 Xamarin 需要使布局可滚动
- canvas - 对 fabric.js 中的单位感到困惑
- mysql - putSql 处理器后 executeSql 失败