excel 2007 - 计算VBA中一系列单元格的z分数

时间:2013-02-08 13:25:30

标签: excel vba statistics

所以我将这个大型电子表格与普通的excel函数放在一起,效果很好,但是我希望通过使用vba和粘贴静态值来加快速度并缩小文件大小,而不是使性能降低的引用值(工作簿)现在大约20 mb并将继续增长)

所以我知道我想要完成什么,但我正在努力将其简洁地表达出来,因为我的VBA经验还处于起步阶段,所以任何帮助都会受到赞赏。

z-score =(数字 - 所有数字的平均值)/(所有数字的stdev)

工作表(“中继”)。值(“c32”)包含所有数字的平均值 工作表(“中继”)。值(“c33”)包含所有数字的stdev

我想做的是,在列工作表(“Hitterscalc”)。range(“cb:cb”)中,使用工作表中找到的相应值(“Hitterscalc”)计算z得分。范围( “J:J”)表示该列中所有行的相应A列单元格不等于“”,其对应的AB列等于1

有人对这方面的简明陈述有任何想法吗?我可以逐个细胞地大致完成它,但是当我开始放入循环来遍历所有列时,它在我的代码中崩溃了,不幸的是在我脑海中。

谢谢你的时间

Application.ScreenUpdating = False
Worksheets("hitterscalc").Range("cb2").FormulaR1C1 = _
   "=IF(OR(RC[-79]="""",RC[-52]<>1,Settings!R4C[-74]<>""yes""),"""",(RC[-70]-relay!R32C[-77])/relay!R33C[-77])" 
Sheets("HittersCalc").Select 
Range("CB2").Select 
Selection.AutoFill Destination:=Range("CB2:CB701") Range("CB2:CB701").Select Columns("CB:CB").Select 
Selection.Copy 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False

2 个答案:

答案 0 :(得分:0)

以下内容应与您的代码相同:

Worksheets("hitterscalc").Range("cb2").FormulaR1C1 = _
   "=IF(OR(RC[-79]="""",RC[-52]<>1,Settings!R4C[-74]<>""yes""),"""",(RC[-70]-relay!R32C[-77])/relay!R33C[-77])" 

'NOTE: Here I am assumimg that there is a column (I've gone with 
'column A but you should change it to whatever is appropriate) that has data
'as far down as you plan on autofilling the columns. So we use that to find how
'far down to autofill rather than hard coding it to 701 as in your code (this is
'the same as when you push ctrl + down in excel)
dim lastRow as int
lastRow = Sheets("HittersCalc").Range("A2").End(xlDown).row

Sheets("HittersCalc").Range("CB2").AutoFill Destination:=Range("CB2:CB" & lastRow) 

'A cleaner way to copy and paste by value that doesn't involve the clipboard
Range("CB:CB").Value = Range("CB:CB").Value

答案 1 :(得分:0)

是的,我知道这已经过时了,但我最近在寻找类似的解决方案。我最终创造了自己的。我更喜欢随时随地使用的多功能功能。如果您不想计算z得分,那么您可以在嵌套的IF语句中使用该函数。

Function zscore(i As Double, rng As Range)
zscore = (i - Application.WorksheetFunction.Average(rng)) / Application.WorksheetFunction.stdev(rng) 
End Function

然后嵌套if可能是这样的:

=IF(COUNTA(A1)>0,IF(AB1=1,IF(C1=J1,zscore(C1,$C$1:$C$6),""),""),"")

无论何时需要,无需进行任何计算,您都可以随时随地获得zscore。如果这种事情经常出现,你可以扩大用户将更多单元格传递给函数的功能(对于A,AB和J中的值,或任何他们喜欢的值),而不是限制在特定的子程序中。 / p>