数式マクロを復活させるアイデア

ラボ

数式マクロを復活させるアイデア

 セルに入力した数式マクロは、間違って値を直接入力してしまうと上書きされてしまい、数式マクロは失われてしまいます。
 すぐに復活できるようなマクロであれば問題ありませんが、複雑なマクロの場合作り直すのが大変です。

 バックアップを取っておくのがセオリーですが、シート内にある各セルの数式マクロをVBAのコードとして取っておくのも一つのアイデアです。

ActiveSheet.Cells(8, 7).Formula = "=SUM(G6:G7)"

という感じですね!
ただ、あちこちに数式マクロがある場合、それらの場所と数式を上記のように書くのは面倒です。

 そこで、VBAでシート上にあるすべての数式マクロを読み込んで、Debug.Print でイミディエイトウィンドウに表示させる事にします。
 ただ表示させるだけでなく、そのままコピーすればプロシージャとして使えるように出力し、イミディエイトウィンドウから標準モジュールにコピーすれば使えるようにプロシージャの形で出力するようにしました。

テスト用シート

 今回は上記のようなシートを用意しました。黄色のセルには数式マクロが入っています。
青の吹き出しが数式マクロです。

プログラム解説

'数式マクロを復活させるためのプログラムコードをイミディエイトウィンドウに表示させます。
'プログラムコードをコピーして、Moduleに貼り付けて使用します。
Sub ReFormulaMakeCode()
    
    Dim r As Range
    Dim befor As Range
    Dim cnt As Long
    Dim rc As Integer
    Dim es As String
    Dim MySheetName As String
    
    Set befor = Selection
    
    Set r = ActiveSheet.UsedRange ' 使用しているセルの範囲を取得
    r.Select
    
    MySheetName = ActiveSheet.Name
    
    Debug.Print "Sub 数式マクロを復活_" & MySheetName & "()"
    Debug.Print "    With Worksheets(""" & MySheetName & """)"
    
    cnt = 0
    For Each r In Selection
       If r.HasFormula Then
           es = Replace(r.Formula, """", """""")
           es = """" & es & """"
           Debug.Print "    .Cells(" & r.Row & "," & r.Column & ").Formula=" & es
       End If
       
       '処理が長くなってしまった時に終了できるようにする。
       If cnt Mod 1000000 = 99999 Then
           rc = MsgBox("処理を続けますか?", vbYesNo + vbQuestion, "確認")
           If rc = vbYes Then
           Else
               MsgBox "終了します。"
               Exit For
           End If
       End If
      
       cnt = cnt + 1
    Next r
     
    Debug.Print "    End With"
    Debug.Print "End Sub"
     
    befor.Select
End Sub

使用しているセルの範囲を取得

 プログラム解説です。まず、befor という変数に現在選択されているセルのRangeを保持します。これは、後から前の状態に戻すための伏線です。

 次に、ActiveSheet.UsedRange で、使用しているセルの範囲を取得しています。
これで、セルの入力がある範囲が自動で入ります。

選択された範囲を走査する

 For Eachで選択範囲を順番に見ていきます。もし数式マクロが入っていれば、その位置と値を書き出します。数式マクロがあるかどうかは、HasFormulで判断できます。

数式マクロを書き出す際の注意点

 数式マクロを書き出す時は ” (ダブルクォーテーション)に注意します。
もし数式マクロに ” が含まれている場合は、エスケープシーケンスで ”” としなければいけません。下記のような感じになります。

  es = Replace(r.Formula, “”””, “”””””)
  es = “””” & es & “”””

処理が長くなってしまった時に終了する

 もし数式マクロがたくさんあった場合を想定して、処理が長くなった場合に終了するか尋ねる処理を入れてみました。
 お使いのシートがそれほど値が多くないのであればこのコードは不要です。

最後の処理

 最後にプロシージャ部分を出力して、イミディエイトウィンドウを見るように促しています。

使い方

 数式マクロを読み込みたいシートをアクティブにします。次に、上記のプロシージャ(ReFormulaMakeCode)を実行してください。
 イミディエイトウィンドウにVBAコードが記録されます。

これをコピーして標準モジュールにコピーします。

 あとは、必要なタイミングでこのコードを実行すれば、数式マクロ部分を上書きしますので、書き換えられた箇所を元の数式マクロに戻してくれます。

 数式マクロを多用するようなシートで利用すると便利だと思います。

まとめ

 今回はDebug.Printでコードを作成するというトリッキーな方法を紹介しました。
 このような方法を使えば、複雑な数式マクロの入力をプログラムで書かせてしまうような事も可能になります。

 VBAでなく、数式マクロを多用しているようなシートでは大変便利なので是非活用してみてください。

タイトルとURLをコピーしました