重复我的部分内容
Repeat part of my sub
我想 运行 我的 Sub 的一部分,每次 运行 使用不同的关键字。目前我正在这样写,但是有没有更短的方法可以做到这一点?
我正在 D 列中为直接借记、ATM 现金提取和借记卡购买创建一个类别 - 在 B 列中分别搜索 D/D、C/L 和 POS。
我正在更改变量,但每次输入和 运行ning 相同的代码。我觉得应该有一种说法 "Run that bit again, but with Searchterm and Searchresult changed!"
我敢肯定有人知识渊博,我帮不上忙。我已经在使用一个 sub,所以不能在其中插入另一个 sub 到 运行 或一个函数?而且我已经在循环了,所以我不确定另一个循环如何适应?
你会怎么做?正如您可能猜到的那样,我对此很陌生,过去只有一点点 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
将公共代码提取到一个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"
'...
试一试:
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
我创建了一个小程序 Finder
,它接受 2 个参数,SearchTerm
和 SearchResult
,然后设置变量并为每一对调用 Finder
。
我还将这两个声明为 String
而不是 Variant
。您真的只想在绝对必要时使用 Variant
(某些函数需要 Variant
),因为它会导致难以发现错误,并且执行速度较慢。
当我将它提取到 Finder
过程中时,我还稍微修改了您的代码,以确保我们检查 .Find
的结果以确保我们有一些东西(即 Not ... is Nothing
) 在 试图以任何方式使用它之前。 VBA not do short circuit IF
语句,所以如果你没有找到 .Find
的任何东西,你仍然会收到一个错误你最初写的方式。
恭喜您使用 .Find
而不是遍历所有行进行比较! .Find
会明显更快。
我想 运行 我的 Sub 的一部分,每次 运行 使用不同的关键字。目前我正在这样写,但是有没有更短的方法可以做到这一点?
我正在 D 列中为直接借记、ATM 现金提取和借记卡购买创建一个类别 - 在 B 列中分别搜索 D/D、C/L 和 POS。
我正在更改变量,但每次输入和 运行ning 相同的代码。我觉得应该有一种说法 "Run that bit again, but with Searchterm and Searchresult changed!"
我敢肯定有人知识渊博,我帮不上忙。我已经在使用一个 sub,所以不能在其中插入另一个 sub 到 运行 或一个函数?而且我已经在循环了,所以我不确定另一个循环如何适应?
你会怎么做?正如您可能猜到的那样,我对此很陌生,过去只有一点点 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
将公共代码提取到一个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"
'...
试一试:
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
我创建了一个小程序 Finder
,它接受 2 个参数,SearchTerm
和 SearchResult
,然后设置变量并为每一对调用 Finder
。
我还将这两个声明为 String
而不是 Variant
。您真的只想在绝对必要时使用 Variant
(某些函数需要 Variant
),因为它会导致难以发现错误,并且执行速度较慢。
当我将它提取到 Finder
过程中时,我还稍微修改了您的代码,以确保我们检查 .Find
的结果以确保我们有一些东西(即 Not ... is Nothing
) 在 试图以任何方式使用它之前。 VBA not do short circuit IF
语句,所以如果你没有找到 .Find
的任何东西,你仍然会收到一个错误你最初写的方式。
恭喜您使用 .Find
而不是遍历所有行进行比较! .Find
会明显更快。