Arrays Excel VBA-有条件地向数组添加输入以进行分析
总之,我对VBA只有非常基本的知识,对数组/矩阵没有太多的了解。我正在尝试做一些类似下面的脚本大纲的事情。基本上,我想要一个函数,它输入一系列单元格,并在满足某些条件时向数组中添加值(在本例中为0)。然后,函数将查找数组的倾斜。如果数组中没有值或存在错误,则函数返回0 任何帮助都将不胜感激,谢谢Arrays Excel VBA-有条件地向数组添加输入以进行分析,arrays,excel,vba,Arrays,Excel,Vba,总之,我对VBA只有非常基本的知识,对数组/矩阵没有太多的了解。我正在尝试做一些类似下面的脚本大纲的事情。基本上,我想要一个函数,它输入一系列单元格,并在满足某些条件时向数组中添加值(在本例中为0)。然后,函数将查找数组的倾斜。如果数组中没有值或存在错误,则函数返回0 任何帮助都将不胜感激,谢谢 Function array_analysis(array_input As Range) Dim my_array As Variant Dim skew As Double For Each i
Function array_analysis(array_input As Range)
Dim my_array As Variant
Dim skew As Double
For Each i In array_input
If array_input(i).Value <> 0 Then
'add value to my_array
End If
Next i
'if array is empty array_analysis = 0
skew = Application.WorksheetFunction.skew(my_array)
array_analysis = skew
End Function
函数数组分析(数组作为范围输入)
将my_数组变暗为变体
双斜
对于数组_输入中的每个i
如果数组_输入(i)。值为0,则
'为我的_数组添加值
如果结束
接下来我
'如果数组为空数组_analysis=0
skew=Application.WorksheetFunction.skew(我的数组)
数组_分析=倾斜
端函数
Skew()
具有非零数据的函数
使用Office 365,您可以编写如下代码,以便仅使用非零数据进行计算:
Function array_analysis(rng As Range)
'Purp.: get only data <> 0 (in contiguous range)
With Application.WorksheetFunction
'get non zero data
Dim NonZeroData
NonZeroData = Evaluate("=Filter(" & rng.Address & "," & rng.Address & "<>0" & ","""")")
'return function result
On Error Resume Next
array_analysis = .skew(NonZeroData)
If Err.Number <> 0 Then array_analysis = 0: Err.Clear
End With
End Function
函数数组\u分析(rng作为范围)
'目的:仅获取数据0(在连续范围内)
使用Application.WorksheetFunction
'获取非零数据
弱非零数据
非零数据=计算(“=过滤器(&rng.Address&“,&rng.Address&“0”&“,”))
'返回函数结果
出错时继续下一步
数组_分析=.skew(非零数据)
如果错误号为0,则数组_analysis=0:Err.Clear
以
端函数
除了@RonRosenfeld的评论之外:
如果不处理O365,则可以使用范围的行数(最大值)重新确定临时数组temp
,为所有单元格条件零增加一个新计数器(例如ii=ii+1
),然后添加一个由ii
索引的新temp
元素,并最终重读到ii
,以获得非零数据。从范围计算偏差
代码
Option Explicit
Function calculateSkewFromRange(InputRange As Range) As Double
' Write values from Input Range to Input Array ('InputData').
Dim InputData As Variant
If InputRange.Rows.Count > 1 Or InputRange.Columns.Count > 1 Then
' Input Range contains multiple cells.
InputData = InputRange.Value
Else
' Input Range contains only one cell.
ReDim InputData(1 To 1, 1 To 1)
InputData(1, 1) = InputRange.Value
End If
' Write values from Input Array to Skew Array ('SkewData').
Dim SkewData As Variant
ReDim SkewData(1 To UBound(InputData, 1) * UBound(InputData, 2))
Dim CurrentValue As Variant
Dim i As Long
Dim j As Long
Dim k As Long
For i = 1 To UBound(InputData, 1)
For j = 1 To UBound(InputData, 2)
CurrentValue = InputData(i, j)
If VarType(CurrentValue) = vbDouble Then
If CurrentValue <> 0 Then
k = k + 1
SkewData(k) = InputData(i, j)
End If
End If
Next j
Next i
' Calculate Skew.
If k > 0 Then
' Data found.
ReDim Preserve SkewData(1 To k)
calculateSkewFromRange = Application.WorksheetFunction.skew(SkewData)
Else
' No data found.
calculateSkewFromRange = 0
End If
End Function
Sub testCalculateSkewFromRange()
Dim rng As Range
Set rng = Columns("A")
Debug.Print calculateSkewFromRange(rng)
End Sub
选项显式
函数将kewFromRange(InputRange作为Range)计算为Double
'将值从输入范围写入输入数组('InputData')。
作为变量的Dim输入数据
如果InputRange.Rows.Count>1或InputRange.Columns.Count>1,则
'输入范围包含多个单元格。
InputData=InputRange.Value
其他的
'输入范围仅包含一个单元格。
ReDim输入数据(1对1,1对1)
InputData(1,1)=InputRange.Value
如果结束
'将值从输入数组写入倾斜数组('SkewData')。
将数据作为变量
ReDim-SkewData(1到UBound(InputData,1)*UBound(InputData,2))
变差电流值
我想我会坚持多久
Dim j尽可能长
暗k一样长
对于i=1到UBound(输入数据,1)
对于j=1到UBound(输入数据,2)
CurrentValue=输入数据(i,j)
如果VarType(CurrentValue)=vbDouble,则
如果当前值为0,则
k=k+1
SkewData(k)=输入数据(i,j)
如果结束
如果结束
下一个j
接下来我
'计算倾斜。
如果k>0,则
“找到数据。
重拨数据(1到k)
calculateSkewFromRange=Application.WorksheetFunction.skew(SkewData)
其他的
“没有找到任何数据。
calculateSkewFromRange=0
如果结束
端函数
子测试计算kewFromRange()
变暗rng As范围
设置rng=列(“A”)
调试.打印calculateSkewFromRange(rng)
端接头
<代码>查看ReDIM保存,或者考虑使用集合或字典对象,然后将结果值添加到数组中。我可能会在这个项目中使用ArrayList
。如果您有O365,请使用工作表函数进行操作。谢谢您的帮助。我完全按照您概述的方式尝试了您的代码,只是在“with”部分添加了缩进。它返回了#值!在每个单元格中。您的数据范围是什么-您可以编辑样本或图片吗@JOEJACKSON1234您是否注意到skew
之前的
前缀,即数组\ u分析=.skew(非零数据)
@Joejackson1234再次感谢您的帮助,我做了更改,但结果仍然是函数的每个条目都有一个0值或“-”。我还将数据图片粘贴到原始问题中作为编辑。我得到-1.221374067作为单元格J117
中指示单元格的函数结果。用-
标记的单元格是否包含除格式化零以外的任何内容@Joejackson1234工作得很好!非常感谢,非常感谢你的帮助。