Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Excel VBA-有条件地向数组添加输入以进行分析_Arrays_Excel_Vba - Fatal编程技术网

Arrays Excel VBA-有条件地向数组添加输入以进行分析

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

总之,我对VBA只有非常基本的知识,对数组/矩阵没有太多的了解。我正在尝试做一些类似下面的脚本大纲的事情。基本上,我想要一个函数,它输入一系列单元格,并在满足某些条件时向数组中添加值(在本例中为0)。然后,函数将查找数组的倾斜。如果数组中没有值或存在错误,则函数返回0

任何帮助都将不胜感激,谢谢

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工作得很好!非常感谢,非常感谢你的帮助。