Vba 重复我的一部分
我想运行我的Sub的一部分,每次运行时使用不同的关键字。目前我是这样写的,但有没有一个更短的方法可以让我这样做呢 我在D列中为直接借记、ATM现金取款和借记卡购买做了一个分类——分别在B列中搜索D/D、C/L和POS 我正在更改变量,但每次都键入并运行相同的代码。我觉得应该有一种方式来表达“再次运行该位,但Searchterm和Searchresult已更改!” 我相信有人比我更了解情况。我已经在使用sub,因此无法插入另一个sub以在其中运行,或者插入一个函数?我已经在循环了,所以我不确定另一个循环如何适应 你会怎么做?正如你可能猜到的那样,我对这个很陌生,在过去只有一点js知识Vba 重复我的一部分,vba,excel,ms-office,Vba,Excel,Ms Office,我想运行我的Sub的一部分,每次运行时使用不同的关键字。目前我是这样写的,但有没有一个更短的方法可以让我这样做呢 我在D列中为直接借记、ATM现金取款和借记卡购买做了一个分类——分别在B列中搜索D/D、C/L和POS 我正在更改变量,但每次都键入并运行相同的代码。我觉得应该有一种方式来表达“再次运行该位,但Searchterm和Searchresult已更改!” 我相信有人比我更了解情况。我已经在使用sub,因此无法插入另一个sub以在其中运行,或者插入一个函数?我已经在循环了,所以我不确定另一
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-OrganizeDefaultCategories()
'
'OrganizeDefaultCategories宏
'使用默认输入对银行对账单条目进行分类。先运行这个。
'
Dim FoundRange作为范围,FirstAddress作为字符串,Searchterm作为变量,Searchresult作为变量
Searchterm=“D/D”
Searchresult=“直接借记”
带范围(“b:b”)
Set FoundRange=.Find(What:=Searchterm,LookIn:=xlValues_
查看:=xlPart,搜索顺序:=xlByRows,搜索方向:=xlNext_
MatchCase:=False,SearchFormat:=False)
FirstAddress=FoundRange.Address
做
FoundRange.Offset(0,2).Value2=搜索结果
设置FoundRange=.FindNext(FoundRange)
非FoundRange时循环为Nothing,而FoundRange.Address为FirstAddress
Searchterm=“信用证”
Searchresult=“ATM现金取款”
Set FoundRange=.Find(What:=Searchterm,LookIn:=xlValues_
查看:=xlPart,搜索顺序:=xlByRows,搜索方向:=xlNext_
MatchCase:=False,SearchFormat:=False)
FirstAddress=FoundRange.Address
做
FoundRange.Offset(0,2).Value2=搜索结果
设置FoundRange=.FindNext(FoundRange)
非FoundRange时循环为Nothing,而FoundRange.Address为FirstAddress
Searchterm=“POS”
Searchresult=“借记卡购买”
Set FoundRange=.Find(What:=Searchterm,LookIn:=xlValues_
查看:=xlPart,搜索顺序:=xlByRows,搜索方向:=xlNext_
MatchCase:=False,SearchFormat:=False)
FirstAddress=FoundRange.Address
做
FoundRange.Offset(0,2).Value2=搜索结果
设置FoundRange=.FindNext(FoundRange)
非FoundRange时循环为Nothing,而FoundRange.Address为FirstAddress
以
端接头
将公共代码提取到子代码中,然后调用它:
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
将公共代码提取到子代码中,然后调用它:
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
试一试:
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
选项显式
子类别()
'
'OrganizeDefaultCategories宏
'使用默认输入对银行对账单条目进行分类。先运行这个。
'
将搜索项设置为字符串
将搜索结果设置为字符串
SearchTerm=“D/D”
SearchResult=“直接借记”
查找器搜索术语,搜索结果
SearchTerm=“信用证”
SearchResult=“ATM现金取款”
查找器搜索术语,搜索结果
SearchTerm=“POS”
SearchResult=“借记卡购买”
查找器搜索术语,搜索结果
端接头
子查找器(ByVal SearchTerm作为字符串,ByVal SearchResult作为字符串)
将范围变暗为范围
将第一个地址设置为字符串
带范围(“b:b”)
Set FoundRange=.Find(What:=SearchTerm,LookIn:=xlValues_
查看:=xlPart,搜索顺序:=xlByRows,搜索方向:=xlNext_
MatchCase:=False,SearchFormat:=False)
如果不是FoundRange,则为Nothing
FirstAddress=FoundRange.Address
做
FoundRange.Offset(0,2).Value2=搜索结果
设置FoundRange=.FindNext(FoundRange)
非FoundRange时循环为Nothing,而FoundRange.Address为FirstAddress
如果结束
以
端接头
我创建了一个小程序Finder
,它包含两个参数,SearchTerm
和SearchResult
,然后设置变量并为每一对调用Finder
我还将这两个变量声明为String
,而不是Variant
。您确实只希望在绝对必要时使用Variant
(某些函数需要Variant
),因为这会导致难以发现的错误,并且执行速度较慢
在将代码提取到Finder
过程中时,我也稍微修改了代码,以确保我们在尝试以任何方式使用它之前检查的结果。Find
以确保我们有一些东西(即不是……什么都不是
)。VBA不会使IF
语句短路,因此,如果您没有在.find
中找到任何内容,您仍然会收到一个与最初编写的方式相同的错误
祝贺您使用。查找,而不是在所有行中循环进行比较<代码>。查找
将大大加快。试一试:
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
选项显式
子类别()
'
'OrganizeDefaultCategories宏
'使用默认输入对银行对账单条目进行分类。先运行这个。
'
将搜索项设置为字符串
将搜索结果设置为字符串
SearchTerm=“D/D”
SearchResult=“直接借记”
查找器搜索术语,搜索结果
SearchTerm=“信用证”
SearchResult=“ATM现金取款”
查找器搜索术语,搜索结果
SearchTerm=“POS”
SearchResult=“借记卡购买”
查找器搜索术语,搜索结果
端接头
子查找器(ByVal SearchTerm作为字符串,ByVal SearchResult作为字符串)
将范围变暗为范围
将第一个地址设置为字符串
带范围(“b:b”)
Set FoundRange=.Find(What:=SearchTerm,LookIn:=xlValues_
查看:=xlPart,搜索顺序:=xlByRows,搜索方向:=xlNext_
MatchCase:=False,SearchFormat:=False)