2017-05-04 12 views
0

원하는 VBA 모듈을 작성하는 방법에 대한 피드백을 받고 싶습니다. 내 파일에는 외부 데이터 (Bloomberg)에서 새 데이터를 수집 할 때 값이 변경되는 여러 열이 있습니다. 다음으로,이 범위 내의 값 중 하나가 항상 같은 ($ A $ 1 및 $ A $ 2) 두 셀의 곱보다 큰 경우 메시지를 보내려고합니다. 또한 여러 시트가 있으므로 모듈이 모든 시트에 적용되는지 확인하고 싶습니다.VBA 모듈 : 배수 범위에 대해 "교차"함수 사용

가 첫 번째 대안 : 내가 비슷한 질문을 볼 수있는 인터넷을 탐험

Private Sub Workbook_SheetCalculate(ByVal Sh As Object) 
With Sh 
    Set r1 = Sh.Range("N1:N50") 
    Set r2 = Sh.Range("AA1:AA50") 
    Set r3 = Sh.Range("AN1:AN50") 
    Set r4 = Sh.Range("BA1:BA50") 
    Set r5 = Sh.Range("BN1:BN50") 
    Set r6 = Sh.Range("CA1:CA50") 
    Set myMultipleRange = Union(r1, r2, r3, r4, r5, r6) 
    Dim myMultipleRange as Range 
    Dim Cell as Range 
    For Each Cell in myMultipleRange.Cells 
    With Cell 
    If .Value2 > 0.1 * $A$1 * $A$2 Then 
    MsgBox ("Ticker: " & Sh.Name & ", Today's volume in the " & Cells(row,column -1) " & " serie is " & Cells" & " contracts") 

그러나, 대답은 "교차을 포함

인터넷과 유래를 검색 한 후 나는 두 가지 대안이 함께했다 "-기능. Intersect는 두 개 또는 그 이상의 범위의 교차를 나타내는 Range Object를 반환한다는 것을 이해합니다. 그러나 모듈과 정확히 다른 점은 무엇입니까? 그리고 어떤 방법이 더 빠릅니까? 내 파일이 거대하기 때문에 가장 빠른 모듈을 원한다!

나는 당신이 선호하고 개선의 여지를 참조해야합니까 업을 설정 교차 기능

Private Sub Workbook_SheetCalculate(ByVal Sh As Object) 
With Sh 
    Dim r1, r2, r3, r4, r5, r6, my MultipleRange as Range 
    Set r1 = Sh.Range("N1:N50") 
    Set r2 = Sh.Range("AA1:AA50") 
    Set r3 = Sh.Range("AN1:AN50") 
    Set r4 = Sh.Range("BA1:BA50") 
    Set r5 = Sh.Range("BN1:BN50") 
    Set r6 = Sh.Range("CA1:CA50") 
    Set myMultipleRange = Union(r1, r2, r3, r4, r5, r6) 
    If Target.Value > (0.1 * sh.Range("A1").Value * sh.Range("A2").Value 
    If Not Intersect(Target, myMultipleRange) Is Nothing Then 
    MsgBox ("Ticker: " & Sh.Name & ", Today's volume in the " & Cells(row,column -1) " & " serie is " & Cells" & " contracts 

으로 두 번째 모듈을 작성하려고?

도움을 주시면 대단히 감사하겠습니다!

+0

첫 번째 방법 만 작동합니다 (모든 오류가 제거되면). 그러나 이것이 가장 빠른 접근법은 아닙니다. 가장 빠른 접근법은 배열입니다. 이후에 가능한 모든 "일치"에 대해 배열을 검색해야하며 메시지 상자에 표시해야합니다 (여러 번 나타나는 경우 한 번에 모두 표시). 개선 작업을 위해 작업 하위를 작성한 다음 [Code Review] (http://codereview.stackexchange.com/)에 게시하는 것이 좋습니다. – Ralph

+0

답장을 보내 주셔서 감사합니다. 오류가있는 방향으로 나를 밀어 넣을 수 있습니까? 그리고 이상적으로는 각 발생에 대한 메시지 상자 알림을 원합니다. 이 경우에도 귀하의 조언을 따라야합니까? 친절합니다. – HJA24

답변

0

나는이 예제들이 단지 의사 코드로 의도되었고 당신에게 해결책을 보여주기를 희망한다. 그 유효한 VBA 코드로 구성 된 경우, 하나의 범위 객체에 모두 나열하면 범위의 교차로 또는 노조와 함께 할 아무것도 필요하지 않습니다

Sub Workbook_SheetCalculate(ByVal Sh As Object) 
    ' Assign range to an array for speed, could just use the range object in a similar way 
    Dim myRange As Range 
    Dim myArray As Variant 
    Set myRange = Sh.Range("N1:N50,AA1:AA50,AN1:AN50,BA1:BA50,BN1:BN50,CA1:CA50") 
    myArray = myRange.Cells 
    ' Just calculate the product once 
    Dim product As Double 
    product = Sh.Range("A1").Value * Sh.Range("A2").Value 
    ' Loop through range, message if value is greater than product 
    Dim n As Long 
    For n = 1 To UBound(myArray) 
     If myArray(n, 1) > product Then 
      MsgBox "Sheet name: " & Sh.Name & ", Cell address: " & myRange.Cells(n).Address 
     End If 
    Next n 
End Sub 

참고 아래의 오류에 내 노트를 참조하십시오 ..

메시지 상자를 여러 개 팝업하는 것은 사용자에게 도움이되지 않습니다. 특히 "파일이 너무 크고"잠재적으로 많은 메시지 상자가있는 경우 특히 그렇습니다. 원하는 주소를 모두 문자열에 저장 한 다음 통합 문서의 어딘가에 하나의 문자열을 출력하는 것이 좋습니다.


오류 : 다른 사소한 문제가 있지만 이러한 문제의 각은 하위 치명적인 오류가 발생할 것입니다.

  • 당신은 관련 End Sub, End With, End If와 블록 및 IFS와 잠수정을 종료해야합니다.
  • Next loopvariable으로 루프를 종료해야합니다.
  • 정의하지 않은 변수는 rowcolumn처럼 사용하십시오. 당신이 뭔가를 반환 값을 할당하지 않는
  • MsgBoxSh.Range("A1").Value 괄호에 문자열을지지 않습니다해야 할 때 단지 MsgBox "my message"하지 MsgBox ("my message")
  • 를 사용 $A$1 같은 단지라는 자신의 주소로 범위 값에 액세스하려고
  • With Sh을 사용하는 경우 Sh.으로 시작할 필요가 없습니다. Set r1 = .Range("A1")과 같이 .을 사용하면됩니다.이렇게해도 오류는 발생하지 않지만 With은 무의미합니다.