Vba 使用Trimmean平均列的动态范围
早上好,我想创建一个VBA宏,它将遍历包含数据的列的数量,然后使用trimmean数组计算平均值,以排除所有低于零的值以及数据的上下10%。我已经构建了VBA脚本的其他部分,我只是不知道如何让平均部分正常工作。我已经获得了vba代码,可以用10%的数据执行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
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表示感谢!做了我需要它做的一个好的和有趣的方式!