2013-02-08 279 views
0

所以我把这个大电子表格与普通的excel函数放在一起,效果很好,但我想加快速度,并使用vba和粘贴来缩小文件大小静态值,而不是参考值,这会降低性能(工作簿现在大约为20 MB,并且将继续增长)excel 2007 - 计算VBA中一系列单元格的z分数

所以我知道我想完成但我努力把它放在一个简洁表达,因为我的VBA经验仍处于起步阶段,所以任何帮助将不胜感激。

z得分=(数 - 平均的所有数字的)/(所有数字的STDEV)

工作表( “中继”)值( “C32”)包含的所有数字 工作表的平均值(”。接力“)值(” C33“)包含了所有的数字

的STDEV我想要做什么,是在列工作表(” Hitterscalc CB“)的范围(”:CB“),calcuate的Z - 对应于该列中所有行的工作表(“Hitterscalc”)。范围(“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 
+1

这一切都与公式。一旦你有了它,然后使用宏记录器为第一行重新使用公式,然后让它自动填充,最后复制和粘贴值。关闭宏记录器并查看代码。它会给你一个很好的起点。您可能有兴趣使用Range(..)。End(xlDown)来计算您需要自动填充多少距离 – Dan 2013-02-08 13:29:53

+0

有没有办法进一步清除这个问题? 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选择 Selection.AutoFill Destination:= Range(“CB2:CB701”) 范围(“CB2:CB701”)。选择 列(“CB:CB”)选择 范围)。选择 Selection.Copy 选择。PasteSpecial Paste:= xlPasteValues,Operation:= xlNone,SkipBlanks _ := False,Transpose:= False Application.CutCopyMode = False – kamelkid2 2013-02-08 13:59:58

+0

而不是像这样的代码添加到您的答案中,因为它很难阅读除此以外。这次我已经为你编辑了它。 – Dan 2013-02-08 15:05:53

回答

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 
0

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

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

,然后嵌套,如果可能是这样的:

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

这给你一个zscore其中的一次,每当你需要它,当你想要它,而无需进行任何计算。如果这种事情经常出现,你可以扩大功能,让用户将更多的细胞传递给函数(对于A,AB和J中的值,或任何他们喜欢的值),而不是限制在特定的子程序中。

相关问题