2

嘿,我有一张 sheet1,其中包含 A 列中的搜索模式列表,以及 B 列中相应的类别名称列表。我有一张 sheet2,其中包含我的银行交易的各种描述列表。

例如,在表 1 中,我有杂货、燃料、娱乐、储蓄,在表 2 中,我有“壳牌服务站、abc 路”、“Coles 超市”等。

我想在交易列中查找单词,然后将找到的行替换为类别..

例如。如果我在 Sheet2 中找到“Shell”这个词,我想用“Fuel”这个词替换该行

到目前为止,我已经完成了这项工作,但我不认为这是最有效或最有效的方法。下面是我的代码。

Sub UpdateCats()
Dim x As Integer
Dim FindString As String
Dim ReplaceString As String
Dim NumRows As Integer
'Replace and update Categories
With Sheets("Categories")
    .Activate
  ' Set numrows = number of rows of data.
  NumRows = Range("A2", Range("A2").End(xlDown)).Rows.Count
  ' Select cell a1.
  Range("A2").Select
  ' Establish "For" loop to loop "numrows" number of times.
  For x = 1 To NumRows
     FindString = ActiveCell.Value
     ActiveCell.Offset(0, 1).Select
     ReplaceString = ActiveCell.Value
     ActiveCell.Offset(1, -1).Select

     With Sheets("Data")
        .Activate
        'With Columns(2)
        Cells.Replace What:=FindString, Replacement:=ReplaceString, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False
        'End With
     End With
     Sheets("Categories").Activate
  Next
End With
End Sub

到目前为止我不喜欢我的代码的原因是因为它在循环中运行时必须不断地在工作表之间切换(激活)。有没有办法更好地做到这一点?

4

4 回答 4

1

总的来说,我不认为这是一个很好的方法。使用“ActiveCell”和“.Activate”是一个相当危险的习惯,因为任何更改都会搞砸你的整个代码。尝试使用命名层次结构(名称应用程序-名称工作簿-名称表-动态范围,例如命名范围)。我个人也不是很喜欢offset函数,不知道为什么大家都这么痴迷,修改这种代码比较不透明,很少真的需要。您可以将整个内容加载到字符串数组中并循环遍历它。它简短易读。

于 2012-05-08T13:41:49.947 回答
0

Use this piece of code:

Application.ScreenUpdating=false
于 2013-03-04T05:40:18.913 回答
0

这将大大缩短处理时间。

Sub UpdateCats()
    Dim v As Long, vFSRSs As Variant

    On Error GoTo bm_Safe_Exit
    Application.EnableEvents = False
    Application.ScreenUpdating = False

    'Replace and update Categories
    With Sheets("Categories")
        vFSRSs = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp).Offset(0, 1)).Value2
    End With

    With Sheets("Data")
        With .Columns(2)
            For v = LBound(vFSRSs, 1) To UBound(vFSRSs, 1)
                'Debug.Print vFSRSs(v, 1) & " to " & vFSRSs(v, 2)
                .Replace What:=vFSRSs(v, 1), Replacement:=vFSRSs(v, 2), _
                         LookAt:=xlWhole, MatchCase:=False
            Next v
         End With
    End With

bm_Safe_Exit:
    Application.EnableEvents = True
    Application.ScreenUpdating = True

End Sub

通过将搜索项和替换项存储在二维数组中,通过工作表单元格的循环被丢弃。此外,已避免使用任何形式的Worksheet.Activate 方法或范围。.Select

请参阅如何避免在 Excel VBA 宏中使用 Select 以了解更多摆脱依赖 select 和 activate 来实现目标的方法。

于 2015-08-15T10:28:45.777 回答
0

我会使用内置的应用程序功能对您有利。在我的代码中,我实现了“TypeName”和“Search”方法,基本上与 Ctrl+F 和 Ctrl+replace 做同样的事情,只是变得更具可读性。我认为重要的是要注意 VBA 方法的强大功能,并在使用更非正统的方法之前先使用这些方法。

Sub Cats()

With ThisWorkbook
For i = 1 To Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row

    Dim lookupvalue As String

    lookupvalue = Sheets(1).Cells(i, 1).Value

    For n = 1 To Sheets(2).Cells(Rows.Count, 1).End(xlUp).Row

        If TypeName(Application.Search(lookupvalue, Sheets(2).Cells(n, 1))) = "Double" Then
                Sheets(2).Cells(n, 1).Value = Sheets(1).Cells(i, 2).Value
                GoTo exitloop
        End If
    Next n
exitloop:
Next i

End With

End Sub
于 2015-11-05T02:31:18.207 回答