2013-02-08 210 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中的值,或任何他們喜歡的值),而不是限制在特定的子程序中。

相關問題