重复我的一部分
我想运行我的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
,它接受两个参数SearchTerm
和SearchResult
,然后设置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" '...