2017-02-13 98 views
-1

私は、さまざまなデータセットとピボットテーブルから構築された一連の関数を持っています。一部のデータ操作中に、テーブルの1つが削除され、再作成されます。これは、そのテーブル名に依存するいくつかの数式を分割します。Excel VBA:#REF!検索と置換

#REFを置き換えるために、VBAを使用してすべての式を検索して置換する方法を探しています(これらはすべて少し異なります)。 「DATASETNEW」という用語を使用します。

そのような式の例は次のとおり

=IF(ISNA(VLOOKUP($A2,#REF!,4,FALSE)="12000"),"No Stock",VLOOKUP($A2,#REF!,5,FALSE)) 
+0

VBAにある必要がある場合:メモリ(ロットの高速化)または範囲ですべてのワークシートのすべてのUsedCellの式をループする必要がある場合は、それに応じて数式を変更します。 – PatricK

+0

...どのように私はそれをやるだろうか?私は数式ですべてのセルをループし、数式全体を置き換えることができますが、#REFだけを置き換える方法はわかりません!テキスト? –

答えて

0

ます(Ctrl + H)を検索し、交換式の中にそれらを更新します。

+0

うん。私は実際にプログラムでそれをやりたいと思っています。 –

0

あなたはこれを試すことができます。

Option Explicit 

Sub ChangeFormulas() 
    Const LOOK_FOR As String = "#REF!" 
    Const REPLACE_WITH As String = "DATASETNEW" 
    Dim oWS As Worksheet, lCalcMode As Long 
    Dim aFormulas As Variant, r As Long, c As Long, bHasLookFor As Boolean 

    lCalcMode = Application.Calculation 
    Application.Calculation = xlCalculationManual 
    Debug.Print "WORKSHEET", "ROW", "COLUMN", """" & LOOK_FOR & """?", "FORMULA" 
    For Each oWS In ThisWorkbook.Worksheets 
     aFormulas = oWS.UsedRange.Formula 
     Select Case oWS.UsedRange.Cells.Count 
      Case Is > 1 
       For r = LBound(aFormulas, 1) To UBound(aFormulas, 1) 
        For c = LBound(aFormulas, 2) To UBound(aFormulas, 2) 
         bHasLookFor = (InStr(1, aFormulas(r, c), LOOK_FOR, vbTextCompare) > 0) 
         If bHasLookFor Then 
          Debug.Print oWS.Name, r, c, bHasLookFor, aFormulas(r, c) 
          oWS.UsedRange.Cells(r, c).Formula = Replace(aFormulas(r, c), LOOK_FOR, REPLACE_WITH) 
         End If 
        Next c 
       Next r 
      Case 1 
       bHasLookFor = (InStr(1, aFormulas, LOOK_FOR, vbTextCompare) > 0) 
       If bHasLookFor Then 
        Debug.Print oWS.Name, 1, 1, bHasLookFor, aFormulas 
        oWS.UsedRange.Cells(1, 1).Formula = Replace(aFormulas, LOOK_FOR, REPLACE_WITH) 
       End If 
     End Select 
    Next oWS 
    Application.Calculation = lCalcMode 
End Sub 

ワークブック内のすべてのワークシートを介してこれがループ、を探し、必要に応じて、これらの文字列を置換します。イミディエイトウィンドウに進行状況を表示します。