2016-07-25 2 views
0

매번 실행될 때마다 다른 하위 키워드로 하위 항목을 실행하고 싶습니다. 현재 저는 이처럼 글을 쓰고 있습니다 만, 제가 할 수있는 짧은 방법이 있습니까?내 하위 부분을 반복하십시오.

나는 열 D에 자동 이체, ATM 현금 인출 및 직불 카드 구입에 대한 범주를 만들고있어 - 열 B에 각각 D/D, C/L 및 POS 검색 난

변수를 변경하지만 매번 같은 비트의 코드를 입력하고 실행합니다. "Run the bit again,하지만 Searchterm과 Searchresult가 바뀌 었습니다."라고 말할 수있는 것처럼 느껴집니다.

나는 확신 할 수있는 누군가가 내가 도울 수있는 것보다 더 knowledgable하다고 확신한다. 이미 하위를 사용하고 있으므로 다른 하위를 삽입하여 함수 나 함수를 실행할 수 없습니까? 그리고 이미 반복하고있어 다른 루프가 어떻게 들어갈 지 확신 할 수 없습니까?

무엇을 하시겠습니까? 당신은 아마 내가 과거에 약간의 js 지식으로 이것에 아주 새로운 것을 짐작할 수 있습니다.

Sub OrganiseDefaultCategories() 
    ' 
    ' OrganiseDefaultCategories Macro 
    ' Categorise the Bank Statement Entries with Default inputs. Run this first. 
    ' 

    Dim FoundRange As Range, FirstAddress As String, Searchterm As Variant, Searchresult As Variant 

    Searchterm = "D/D" 
    Searchresult = "Direct Debit" 

     With Range("b:b") 
     Set FoundRange = .Find(What:=Searchterm, LookIn:=xlValues, _ 
     LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
     MatchCase:=False, SearchFormat:=False) 
     FirstAddress = FoundRange.Address 
     Do 
     FoundRange.Offset(0, 2).Value2 = Searchresult 

     Set FoundRange = .FindNext(FoundRange) 
     Loop While Not FoundRange Is Nothing And FoundRange.Address <> FirstAddress 

     Searchterm = "C/L" 
    Searchresult = "ATM Cash Withdrawal" 


     Set FoundRange = .Find(What:=Searchterm, LookIn:=xlValues, _ 
     LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
     MatchCase:=False, SearchFormat:=False) 
     FirstAddress = FoundRange.Address 
     Do 
     FoundRange.Offset(0, 2).Value2 = Searchresult 

     Set FoundRange = .FindNext(FoundRange) 
     Loop While Not FoundRange Is Nothing And FoundRange.Address <> FirstAddress 

     Searchterm = "POS" 
    Searchresult = "Debit Card Purchase" 


     Set FoundRange = .Find(What:=Searchterm, LookIn:=xlValues, _ 
     LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
     MatchCase:=False, SearchFormat:=False) 
     FirstAddress = FoundRange.Address 
     Do 
     FoundRange.Offset(0, 2).Value2 = Searchresult 

     Set FoundRange = .FindNext(FoundRange) 
     Loop While Not FoundRange Is Nothing And FoundRange.Address <> FirstAddress 

    End With 


    End Sub 
+0

나는 서브 테어에 searchTerm과 searchResult 선택적 인수를 만들 것이다. – C8H10N4O2

답변

2

이 주사를 : 호출 프로 시저에서

Private Sub WhateverThisDoes(Searchterm As String, Searchresult As String) 
    Set FoundRange = .Find(What:=Searchterm, LookIn:=xlValues, _ 
          LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
          MatchCase:=False, SearchFormat:=False) 
    FirstAddress = FoundRange.Address 
    Do 
     FoundRange.Offset(0, 2).Value2 = Searchresult 

     Set FoundRange = .FindNext(FoundRange) 
    Loop While Not FoundRange Is Nothing And FoundRange.Address <> FirstAddress 
End Sub 

을 작은 절차를 만들었습니다 Finder은 2 개의 매개 변수 (SearchTermSearchResult)를 취한 다음 변수를 설정하고 각 쌍마다 Finder을 호출합니다.

나는 또한 Variant 대신 String으로 선언했습니다. 절대적으로 필요한 경우에만 Variant을 사용하고 (일부 기능은 Variant을 필요로합니다.) 오류를 찾기 어렵고 실행 속도가 느려질 수 있기 때문에 실제로 사용해야합니다. 나는 우리가 뭔가를 보장하기 위해 우리가 .Find의 결과를 확인할 수 있도록하기 위해 Finder 절차로 추출 할 때

가 나는 또한 약간의 코드를 수정 (즉 Not ... is Nothing) 어떤 방법으로 그것을 사용하기 전에. VBA는 이 아니며IF 문을 사용합니다. 따라서 .Find으로 찾지 못했다면 원래 작성한 방법으로 오류가 발생했을 것입니다.

축하합니다. 비교를하는 모든 행을 반복하지 않고 .Find을 사용하고 있습니다! .Find은 훨씬 빠릅니다.

+0

절대적으로 놀라운 답변 - 이것은 내가 찾고 있었던 것입니다! IF와의 훌륭한 조언 - 정말 좋은 아이디어이며 앞으로 새로운 계좌 명세서를 검색하는 데 도움이됩니다! 원래 변수를 입력 상자로 설정했기 때문에 원래 문자열을 사용했습니다!이것은 또 다른 'OrganiseCustomCategories'하위로 살고 있지만 수동으로 모두 만들 수있는 시대가되었습니다. 이 '기본'값을 갖는 방법은 내 회계를 엄청나게 빨라서 더 이상 변종 일 필요가 없습니다! 또 다른 좋은 캐치! 많이 배우고 있어요, 고마워요. – SGPascoe

+2

당신을 도와 준 모든 대답에 투표하십시오 (그들 옆에있는 위 화살표를 클릭하십시오). 그리고 _most_ 유용한 도움을 얻은 것의 체크 표시를 클릭하십시오. – FreeMan

1

하위에 공통 코드를 추출, 다음 전화 :

Option Explicit 

Sub OrganiseDefaultCategories() 
    ' 
    ' OrganiseDefaultCategories Macro 
    ' Categorise the Bank Statement Entries with Default inputs. Run this first. 
    ' 

    Dim SearchTerm As String 
    Dim SearchResult As String 

    SearchTerm = "D/D" 
    SearchResult = "Direct Debit" 
    Finder SearchTerm, SearchResult 
    SearchTerm = "C/L" 
    SearchResult = "ATM Cash Withdrawal" 
    Finder SearchTerm, SearchResult 
    SearchTerm = "POS" 
    SearchResult = "Debit Card Purchase" 
    Finder SearchTerm, SearchResult 

End Sub 

Sub Finder(ByVal SearchTerm As String, ByVal SearchResult As String) 

    Dim FoundRange As Range 
    Dim FirstAddress As String 

    With Range("b:b") 
    Set FoundRange = .Find(What:=SearchTerm, LookIn:=xlValues, _ 
          LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
          MatchCase:=False, SearchFormat:=False) 
    If Not FoundRange Is Nothing Then 
     FirstAddress = FoundRange.Address 
     Do 
     FoundRange.Offset(0, 2).Value2 = SearchResult 
     Set FoundRange = .FindNext(FoundRange) 
     Loop While Not FoundRange Is Nothing And FoundRange.Address <> FirstAddress 
    End If 
    End With 

End Sub 

:

WhateverThisDoes "C/L", "ATM Cash Withdrawal" 
WhateverThisDoes "POS", "Debit Card Purchase" 
'... 
+0

물론! 예, 이것이 제가 필요한 것입니다! 변수 목록을 구성하는 것이 훨씬 쉽습니다! 환상적인 작품. 템플릿을 사용하여 문제를 해결하기 위해 필요한대로 스크립트를 다시 작성했습니다.이 방법은 나중에도이 문제를 해결하는 방법을 가르쳐 줬습니다. 환상적인 반응, 정말 고마워! 하위 입력에 변수를 추가 할 수 있는지 알지 못했습니다. – SGPascoe

관련 문제