2013-02-08 5 views
0

의 셀 범위에서 z- 점수를 계산하므로 큰 스프레드 시트를 정상적인 Excel 기능과 함께 사용할 수는 있지만 속도를 높이고 vba를 사용하여 파일 크기를 작게 만들고 붙여 넣기를 원합니다. 정적 값은 성능이 저하되는 참조 된 값과 반대되는 것입니다 (통합 문서는 현재 약 20MB이며 계속 증가 할 것입니다)Excel 2007 - VBA

그래서 나는 무엇을하고 싶은지 알기 쉽게 간결하게 설명하려고합니다. 나의 VBA 경험으로서의 표현은 아직 초기 단계이기 때문에 어떤 도움을 주시면 감사하겠습니다.

Z 점수 = (수 - 모든 수의 평균)/(모든 수치의 표준 편차)

워크 ("중계") 값이 ("C32")가 모든 숫자 워크의 평균 ("포함한다. 릴레이 "). 값 ("c33 ")은 모든 숫자의 stdev를 포함합니다.

열 워크 시트 ("Hitterscalc ")에서 range ("cb : cb ")에 z를 계산합니다. ("Hitterscalc"). 해당 열의 모든 행에 대해 해당 워크 시트 ("Hitterscalc")에서 해당 값이 발견되고 해당 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

+0

에 이것을 더 자세히 정리할 방법이 있습니까? Application.ScreenUpdating = False 워크 시트 ("hitterscalc") 범위 ("cb2") FormulaR1C1 = _ "= IF (OR (RC [-79] =" "" ", RC [-52] <> 1, 설정! R4C [-74] <> "예" ")," "", (RC [-70] -relay! R32C [-77])/릴레이! R33C [-77]) " 시트 범위 : "CB2 : CB701" 선택 범위 : "CB : CB" 범위 ("CB2 : CB701") 선택 범위범위 (CB2 : CB701)) 선택. 선택. 복사 선택.PasteSpecial 붙여 넣기 : = xlPasteValues, 작업 : = xlNone, SkipBlanks _ : = False, Transpose : = False Application.CutCopyMode = False – kamelkid2

+0

코드를 코드에 추가하여 주석에 모두 넣는 것보다 읽기가 어렵습니다. 그렇지 않으면. 이번에는 이미 편집 해 놨어. – Dan

답변

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 

같은 중첩 될 수 있다면 무엇인가 : 이것은 당신 zscore 곳 - 영원 때마다 당신이 그것을 원할 때 당신이 어떤 계산을 할 필요없이, 필요한에게 제공

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

. 이런 종류의 일이 정기적으로 일어나면 사용자가 특정 서브 루틴에 제약을받는 대신 함수에 더 많은 셀을 전달할 수있는 기능을 확장 할 수 있습니다 (A, AB, J 또는 원하는 값).

관련 문제