2

curr_symbolを見つけて、それをnew_symbolに置き換えるために、次のコードを使用しています。コードで特定の行番号内でそうするように指定しましたが、選択したシートのすべての行に検索と置換が適用されます。これは私が望むものではありません。

Sub find_replace()
Dim curr_symbol, new_symbol As String
Dim row_num, last_row As Integer
row_num = ActiveSheet.Cells(1, "A").Value 'row_num=9
last_row = ActiveSheet.Cells(2, "A").Value 'last_row=11

Do While row_num < last_row
      curr_symbol = ".ABC130301"
    new_symbol = ActiveSheet.Cells(row_num, "E").Value 'new_symbol=".BAC130306"
    With ActiveSheet.UsedRange
        .Replace curr_symbol, new_symbol, xlPart
    End With
row_num = row_num + 1
Loop
End Sub

を次のステートメントに置き換えようとしましたWith ActiveSheet.UsedRange....End Withが、それによってすべての行のcurr_symbolも置き換えられます。

ActiveSheet.Cells.Replace What:=curr_symbol, Replacement:=new_symbol, LookAt:=xlPart, _
                              SearchOrder:=xlByRows, MatchCase:=False, _
                              SearchFormat:=False, ReplaceFormat:=False

指定された行の文字列のみを置き換えるようにこれを修正するにはどうすればよいですか。

4

2 に答える 2

9

row_num置き換えたい範囲は、列 A の からまでだと思いますlast_row。これを置き換えてみてください:

With ActiveSheet.UsedRange
    .Replace curr_symbol, new_symbol, xlPart
End With

これとともに:

Cells(row_num, 1).Replace curr_symbol, new_symbol, xlPart

どこに配置ActiveSheet.UsedRangeしても、常にアクティブなシートの使用済み領域全体を参照します。これは、使用されたすべてのセルと、使用されたセルと同じ行と列にある他のセルを含むコレクションです。あなたがそれを使用した方法では文脈的ではありません(つまり、ループに関連する範囲を参照していません)。メソッドは、Replace内のすべての個々のセルに適用されますUsedRange

同様にActiveSheet.Cells; これは常に、アクティブ シート内のすべてのセルのコレクションを参照します。私の提案は と同じで、メソッドをActiveSheet.Cells(row_num, 1)適用する個々のセルを指定します。Replace

あなたの質問にはもう答えません:

余談ですが、次の行:

Dim curr_symbol, new_symbol As String

curr_symbol を Variant として宣言し、new_symbol を String として宣言します。同じことが宣言の次の行 (整数) にも当てはまります。いいえ、私はこの宣言動作も好きではありません。すべての変数のタイプを指定する必要があります。これが私が宣言する傾向がある方法です:

Dim curr_symbol As String, _
    new_symbol As String

さらに、Excel はすべての Integer 型を Long 型として内部的に格納します。Integer として宣言すると、消費するメモリの量ではなく、値のみが制限されます。特に整数の値を制限したい場合を除き、すべての Integer 宣言を Long に変更することをお勧めします。

Dim last_row As Integer

次のようにメモリを消費します。

Dim row_num as Long

しかし、速度の違いがまったくない場合は、おそらく少し遅くなります。

于 2013-02-25T00:01:38.213 に答える
3

使用している「UsedRange」範囲は、使用したスプレッドシート全体です。置換はスプレッドシート全体に適用されています。

次のように置換したい範囲を作成します。

Dim MyRange as Range
Set MyRange = Range("B7:C9")

次に、この範囲で置換を行います。

于 2013-02-25T00:03:23.130 に答える