Vba 重复我的一部分

Vba 重复我的一部分,vba,excel,ms-office,Vba,Excel,Ms Office,我想运行我的Sub的一部分,每次运行时使用不同的关键字。目前我是这样写的,但有没有一个更短的方法可以让我这样做呢 我在D列中为直接借记、ATM现金取款和借记卡购买做了一个分类——分别在B列中搜索D/D、C/L和POS 我正在更改变量,但每次都键入并运行相同的代码。我觉得应该有一种方式来表达“再次运行该位,但Searchterm和Searchresult已更改!” 我相信有人比我更了解情况。我已经在使用sub,因此无法插入另一个sub以在其中运行,或者插入一个函数?我已经在循环了,所以我不确定另一

我想运行我的Sub的一部分,每次运行时使用不同的关键字。目前我是这样写的,但有没有一个更短的方法可以让我这样做呢

我在D列中为直接借记、ATM现金取款和借记卡购买做了一个分类——分别在B列中搜索D/D、C/L和POS

我正在更改变量,但每次都键入并运行相同的代码。我觉得应该有一种方式来表达“再次运行该位,但Searchterm和Searchresult已更改!”

我相信有人比我更了解情况。我已经在使用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-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)