重复我的部分内容

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 个参数,SearchTermSearchResult,然后设置变量并为每一对调用 Finder

我还将这两个声明为 String 而不是 Variant。您真的只想在绝对必要时使用 Variant(某些函数需要 Variant),因为它会导致难以发现错误,并且执行速度较慢。

当我将它提取到 Finder 过程中时,我还稍微修改了您的代码,以确保我们检查 .Find 的结果以确保我们有一些东西(即 Not ... is Nothing 试图以任何方式使用它之前。 VBA not do short circuit IF 语句,所以如果你没有找到 .Find 的任何东西,你仍然会收到一个错误你最初写的方式。

恭喜您使用 .Find 而不是遍历所有行进行比较! .Find 会明显更快。