重复我的一部分

我想运行我的Sub的一部分,每次运行时使用不同的关键字。 目前我是这样写的,但是我可以做的更短吗?

我在D栏中列出了直接借记,ATM取现和借记卡购买类别 – 分别在B列中searchD / D,C / L和POS。

我正在改变variables,但是每次都要input和运行相同的代码。 我觉得应该有一种方法来说“再次运行这个位,但是Searchterm和Searchresult已经改变了!

我确定有人比我能帮上更多的知识。 我已经在使用一个子所以不能插入另一个子运行在它,或function? 而我已经循环,所以我不知道另一个循环如何适应?

你会怎么做? 正如你大概可以猜到,我对这个很陌生,过去只有一点点知识。

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 

给这个镜头:

 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 

我创build了一个小程序Finder ,它接受两个参数SearchTermSearchResult ,然后设置variables并为每个对调用Finder

我也把这两个声明为String而不是Variant 。 你真的只想在绝对必要的时候使用Variant (一些函数需要一个Variant ),因为它可能导致很难发现错误,并且执行起来较慢。

当我将其提取到Finder过程中时,我也稍微修改了一下代码,以确保尝试以任何方式使用它之前 ,检查.Find的结果以确保我们有某些东西(即Not ... is Nothing )。 VBA不会做短路IF语句,所以如果你没有find任何与.Find东西,你仍然会收到一个错误,就像你原来写的那样。

恭喜使用.Find而不是循环遍历所有行进行比较! .Find将显着更快。

将通用代码提取到一个Sub中,然后调用它:

 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 

从调用程序:

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