2017-12-03 8 views
1

をクラッシュし検索と置換:私は以下のように、検索と置換、簡単なVBAコードを使用しています

Sub MultiFindNReplace() 
'Update 20140722 
Dim Rng As Range 
Dim InputRng As Range, ReplaceRng As Range 
xTitleId = "KutoolsforExcel" 
Set InputRng = Application.Selection 
Set InputRng = Application.InputBox("Original Range ", xTitleId, 
InputRng.Address, Type:=8) 
Set ReplaceRng = Application.InputBox("Replace Range :", xTitleId, Type:=8) 
Application.ScreenUpdating = False 
For Each Rng In ReplaceRng.Columns(1).Cells 
InputRng.Replace what:=Rng.Value, replacement:=Rng.Offset(0, 1).Value 
Next 
Application.ScreenUpdating = True 
End Sub 

はしかし、データセットは大きな685000以上の値であり、これは私のExcelドキュメントをクラッシュし。私はエラーキャッチや他の方法を見つけて置き換えることを試みた。

両方の列がsheet2にあります。交換対象の列が列10、列と交換され、列17であり、18は

データは

999    999     5 
5     1     4 
27    2     4 
3     3     2 
...    ...     ... 
999    207     1.3 
スコア変身銀行 で銀行 時間とともにこの

時間のように見えます

検索686950のエントリを持つ最初のカラムのすべてを、2つのカラムそれぞれの変換されたスコア(カラム3)に置き換えます。これには、80の異なる月次エントリのバンクがあります。

+0

単純な「VLOOKUP」で十分でしょうか? – xthestreams

+0

問題は、686,950エントリのカラムを置き換える必要があることです。銀行との時間のエントリーの数は80であり、それに伴う変換されたスコアも80の値を持っています。 –

+0

あなたがVBAの使用を主張する場合、1つのコメントはReplaceRngではなくInputRngをループすることを検討するようにします。現時点では、686950 * 80の操作を行っています。あなたがInputRngをループした場合、ReplaceRngの各セルとセルを比較し、値を置き換えた後に内部ループを終了すると、おそらく時間が半分になります(つまり、40個のセルの後に平均してその数が見つかります)。よりスマートな検索(バイナリ検索など)を使用した場合は、6×686950の操作まで減らすことができます。 – xthestreams

答えて

0

hteワークシートの値の置換に基づく計算サイクルがある可能性があります。これは、入力ブック内の1つ以上のセル、または開いているワークブック内の揮発性の式(間接、住所、今日、今など)を参照する先行式が原因である可能性があります。ワークシートのコードシート(​​例:Worksheet_Changeなど)またはワークブックのコードページ(Workbook_SheetChangeなど)内にイベント依存コードが存在することもあります。

画面更新をオフにすると同時に、計算​​を無効にしてイベントを無効にします。

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 
Application.EnableEvents = False 

'... all of the processing code 

Application.EnableEvents = True 
Application.Calculation = xlCalculationAutomatic 
Application.ScreenUpdating = True 

あなたのサブ手順は、「インメモリ」作業と、一度、すべての置換が実行された一斉エン値を置き換えるから利益を得ることができます。次の方法を使用してi5 Surface Proの効率を〜30%向上させました。

Option Explicit 

Sub multiFindNReplace2() 
    Dim rng As Variant, xTitleId As String, r As Long 
    Dim dataRng As Variant, mtch As Variant, inputRng As Range, replaceRng As Range 

    xTitleId = "KutoolsforExcel" 
    Set inputRng = Application.InputBox(PROMPT:="Original Range:", Title:=xTitleId, Default:=Selection.Address, Type:=8) 
    rng = Application.InputBox(PROMPT:="Replacement Range:", Title:=xTitleId, Default:="$M$2:$N$81", Type:=8).Value2 
    dataRng = inputRng.Value2 


    Debug.Print Timer 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 
    Application.EnableEvents = False 

    For r = LBound(rng, 1) To UBound(rng, 1) 
     mtch = Application.Match(rng(r, 1), dataRng, 0) 
     Do While Not IsError(mtch) 
      dataRng(mtch, 1) = rng(r, 2) 
      mtch = Application.Match(rng(r, 1), dataRng, 0) 
     Loop 
    Next r 

    inputRng.Resize(UBound(dataRng, 1), UBound(dataRng, 2)) = dataRng 

    Application.EnableEvents = True 
    Application.Calculation = xlCalculationAutomatic 
    Application.ScreenUpdating = True 
    Debug.Print Timer 

End Sub 
+0

明日の朝にお試しになりますよ、ありがとうございます –

+0

まだExcelがクラッシュしています。大学のコンピュータでは処理できないと思います –

+0

コードをお寄せいただきありがとうございます。一度に50k個のエントリを実行することに決めました。一度に50kのforループを実行する方法 –

関連する問題