Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Vba 使用Trimmean平均列的动态范围_Vba_Excel - Fatal编程技术网

Vba 使用Trimmean平均列的动态范围

Vba 使用Trimmean平均列的动态范围,vba,excel,Vba,Excel,早上好,我想创建一个VBA宏,它将遍历包含数据的列的数量,然后使用trimmean数组计算平均值,以排除所有低于零的值以及数据的上下10%。我已经构建了VBA脚本的其他部分,我只是不知道如何让平均部分正常工作。我已经获得了vba代码,可以用10%的数据执行trimmean函数,但是我还不能包含只取零以上值的功能。感谢您的帮助 Sub columnFormulas() Sheets.Add.Name = "Avg" Worksheets("Sheet1").Activate Set wsOu

早上好,我想创建一个VBA宏,它将遍历包含数据的列的数量,然后使用trimmean数组计算平均值,以排除所有低于零的值以及数据的上下10%。我已经构建了VBA脚本的其他部分,我只是不知道如何让平均部分正常工作。我已经获得了vba代码,可以用10%的数据执行trimmean函数,但是我还不能包含只取零以上值的功能。感谢您的帮助

Sub columnFormulas()

Sheets.Add.Name = "Avg"


Worksheets("Sheet1").Activate
Set wsOut = Worksheets("Avg")
Set myRange = Application.InputBox("Select srange", "Range", , , , , , 8)

colCount = myRange.Columns.Count
Application.ScreenUpdating = False
With wsOut
    .Activate
    For counter = 1 To colCount
        '.Cells(2, counter).Value = WorksheetFunction.StDev(myRange.Columns(counter))
        .Cells(1, counter).Value = WorksheetFunction.TrimMean(myRange.Columns(counter), 0.1)
    Next counter
End With
Application.ScreenUpdating = True

Worksheets("Avg").Columns("A:Z").AutoFit
End Sub

我唯一能做到这一点的方法是使用一种变通方法,将所有大于零的值加载到一个数组中,然后从中获取百分位数

然后根据范围进行测试,得到一个总和,其中所有值都不大于第90百分位、小于第10百分位且不小于零

一旦你有了这个总和,你就可以用计数器除以它,得到基本上的平均值:

Sub columnFormulas()

Dim sumval As Long, i As Long, upperpercentile As Long, lowerpercentile As Long
Dim myarr As Variant
Dim cell As Range

sumval = 0
i = 0
ReDim myarr(0 To 0)

Sheets.Add.Name = "Avg"

Worksheets("Sheet1").Activate
Set wsOut = Worksheets("Avg")
Set myRange = Application.InputBox("Select srange", "Range", , , , , , 8)

colCount = myRange.Columns.Count
Application.ScreenUpdating = False

With wsOut
    .Activate

    For Each cell In myRange.Columns(counter)
        If Not cell.Value <= 0 Then
            myarr(i) = cell.Value
            ReDim Preserve myarr(0 To i + 1)
            i = i + 1
        End If
    Next cell

    upperpercentile = WorksheetFunction.Percentile(myarr, 0.9)
    lowerpercentile = WorksheetFunction.Percentile(myarr, 0.1)

    For Each cell In myRange.Columns(counter)
        If Not cell.Value >= upperpercentile And _
            Not cell.Value <= lowerpercentile And _
            Not cell.Value <= 0 Then
                sumval = sumval + cell.Value
                counter = counter + 1
        End If
    Next cell

    .Cells(1, counter).Value = sumval / counter
End With
Application.ScreenUpdating = True

Worksheets("Avg").Columns("A:Z").AutoFit
End Sub
子列公式()
暗淡的sumval为Long,i为Long,上百分位为Long,下百分位为Long
Dim myarr作为变异体
暗淡单元格作为范围
sumval=0
i=0
重拨myarr(0到0)
Sheets.Add.Name=“平均值”
工作表(“表1”)。激活
放样=工作表(“平均值”)
设置myRange=Application.InputBox(“选择范围”、“范围”、、8)
colCount=myRange.Columns.Count
Application.ScreenUpdating=False
没有wsOut
.激活
对于myRange.Columns中的每个单元格(计数器)
如果不是单元格。值=上百分位和_

不是cell.Value它似乎在添加一个用户定义的函数并将其应用到过程中

Function TrimMeanX(rngDB As Range, p As Single)
    Dim vR()
    Dim n As Long
    For Each Rng In rngDB
        If Rng > 0 Then
            n = n + 1
            ReDim Preserve vR(1 To n)
            vR(n) = Rng
        End If
    Next Rng
    TrimMeanX = WorksheetFunction.TrimMean(vR, p)
End Function
Sub columnFormulas()

Sheets.Add.Name = "Avg"


Worksheets("Sheet1").Activate
Set wsOut = Worksheets("Avg")
Set myRange = Application.InputBox("Select srange", "Range", , , , , , 8)

colCount = myRange.Columns.Count
Application.ScreenUpdating = False
With wsOut
    .Activate
    For counter = 1 To colCount
        '.Cells(2, counter).Value = WorksheetFunction.StDev(myRange.Columns(counter))
        .Cells(1, counter).Value = TrimMeanX(myRange.Columns(counter), 0.1) '<~~ apply UDF
    Next counter
End With
Application.ScreenUpdating = True

Worksheets("Avg").Columns("A:Z").AutoFit
End Sub
将其应用于程序

Function TrimMeanX(rngDB As Range, p As Single)
    Dim vR()
    Dim n As Long
    For Each Rng In rngDB
        If Rng > 0 Then
            n = n + 1
            ReDim Preserve vR(1 To n)
            vR(n) = Rng
        End If
    Next Rng
    TrimMeanX = WorksheetFunction.TrimMean(vR, p)
End Function
Sub columnFormulas()

Sheets.Add.Name = "Avg"


Worksheets("Sheet1").Activate
Set wsOut = Worksheets("Avg")
Set myRange = Application.InputBox("Select srange", "Range", , , , , , 8)

colCount = myRange.Columns.Count
Application.ScreenUpdating = False
With wsOut
    .Activate
    For counter = 1 To colCount
        '.Cells(2, counter).Value = WorksheetFunction.StDev(myRange.Columns(counter))
        .Cells(1, counter).Value = TrimMeanX(myRange.Columns(counter), 0.1) '<~~ apply UDF
    Next counter
End With
Application.ScreenUpdating = True

Worksheets("Avg").Columns("A:Z").AutoFit
End Sub
子列公式()
Sheets.Add.Name=“平均值”
工作表(“表1”)。激活
放样=工作表(“平均值”)
设置myRange=Application.InputBox(“选择范围”、“范围”、、8)
colCount=myRange.Columns.Count
Application.ScreenUpdating=False
没有wsOut
.激活
对于计数器=1到colCount
'.Cells(2,计数器).Value=WorksheetFunction.StDev(myRange.Columns(计数器))

.Cells(1,counter).Value=TrimMeanX(myRange.Columns(counter),0.1)'您可能必须循环并创建一个仅包含值>0的联合范围,以便TrimMeanX表示感谢!做了我需要它做的一个好的和有趣的方式!