2016-07-25 9 views
0

私は実行するたびに別のキーワードを使って私のサブの一部を実行したいと思います。現在、私はこのように書いていますが、私はそれを行うことができるより短い方法はありますか?私のサブの一部を繰り返してください

私は列Dに口座引落、ATM現金引き出し、およびデビットカードの購入のためのカテゴリを作ってるんだ - 列BにそれぞれD/D、C/L、およびPOSの検索私は

変数を変更しますが、毎回同じビットのコードを入力して実行します。私は "もう一度そのビットを走らせるが、SearchtermとSearchresultを変えて"と言うべき方法があるはずだと思う。

私は助けてくれる人以上の知識があると確信しています。私はすでにサブを使用しているので、そのサブ関数や関数内で実行する別のサブを挿入することはできませんか?そして私はすでにループしているので、別のループがどのように収まるのか分かりません。

あなたは何をしますか?あなたはおそらく私がこれについて新しいことを推測することができるので、過去にはほんの少しの知識しかありません。

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 

を私は小さな手順を作成つのパラメータ、すなわちSearchTermSearchResultが必要な場合は、変数を設定し、各ペアに対してFinderを呼び出します。

また、Variantの代わりにStringと宣言しました。絶対に必要なときにVariantを使用したいだけです(一部の機能はVariantが必要です)。エラーが見つからず、実行が遅くなるためです。

私たちは私たちがどのような方法でそれを使用しようとする前に何か(すなわちNot ... is Nothingを持っていることを確認するために.Findの結果を確認することを確実にするためにFinder手順にそれを抽出したとき、私はまた少しあなたのコードを変更しました。 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 

​​
+0

もちろんです!はい、これは私が必要としていたものです!変数のリストを整理するのが人生をもっと簡単にします!素晴らしい仕事。私は、あなたのテンプレートをテンプレートとして使って、問題に合わせてスクリプトを書き直しました。これは、将来もこの問題を解決する方法を教えてくれました。素晴らしい応答、ありがとう!あなたがサブ入力に変数を追加できるかどうかは分かりませんでした。 – SGPascoe

関連する問題