2

列 A に検索パターンのリストを含むシート 1 があり、列 B に対応するカテゴリ名のリストがあります。銀行取引のさまざまな説明のリストを含むシート 2 があります。

たとえば、シート 1 には食料品、燃料、娯楽、貯蓄があり、シート 2 には「シェル サービス ステーション、abc ロード」、「コールズ スーパーマーケット」などがあります。

トランザクション列で単語を検索し、見つかった行をカテゴリに置き換えたい..

例えば。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" を使用するのはかなり危険な習慣です。どのような変更でもコード全体が台無しになるからです。名前付き階層 (アプリケーション名 - ワークブック名​​ - シート名 - できるだけ名前付き範囲などの動的範囲) を使用してみてください。個人的には、オフセット機能もあまり好きではありません。なぜ誰もがそれに夢中になっているのかわかりません。このタイプのコードを修正することはかなり不透明であり、本当に必要になることはめったにありません。全体を文字列の配列にロードしてループすることができます。短くて読みやすいです。

于 2012-05-08T13:41:49.947 に答える
0

次のコードを使用します。

Application.ScreenUpdating=false
于 2013-03-04T05:40:18.913 に答える