VBAサンプル集
数式内の不要なシート名を削除する(HasFormula)

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
公開日:2014-11-14 最終更新日:2020-04-13

数式内の不要なシート名を削除する(HasFormula)


複数のシートにまたがる数式を入力していると、自身のシート名!が数式についてしまいます、
この自身のシート名!は不要であり、式を見づらくしてしまいます、
この不要なシート名を、マクロVBAで一括削除します。


ブックの全シート、全セルを対象として、
数式の中から、自身のシート名!を削除するマクロVBAになります。

使用されている全セルを巡回

Sub sample1()
  Dim ws As Worksheet
  Dim rng As Range
  For Each ws In Worksheets
    For Each rng In ws.UsedRange
      If rng.HasFormula And _
        rng.Formula Like "*" & ws.Name & "!*" Then
        rng.Formula = Replace(rng.Formula, ws.Name & "!", "")
      End If
    Next
  Next
End Sub

全シートの処理

For Each ws In Worksheets
ここは問題ないと思いますが、ForEachについては以下を参照してください。

第59回.コレクション処理(For Each)|VBA入門
・For Each の構文 ・Exit For ・For Each の使用例 ・RangeオブジェクトのFor Each ・For Each サイト内の参考ページ

全セルの処理

For Each rng In ws.UsedRange
書き方はいろいろありますが、使用されているセルだけを対象としています。

最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)
・最終行取得の基本:手動ではCtrl + ↑、VBAではCells(1, 1).End(xlDown) ・最終列の取得 ・特殊な表の場合 ・CurrentRegion ・SpecialCells(xlCellTypeLastCell) ・UsedRange ・Findメソッド ・サイト内関連ページ

数式の判定

If rng.HasFormula Then
Rangeオブジェクト.HasFormula
数式が設定されている場合は
Trueが返されますので、これで判定しています。

空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)
・セルの値が空白の判定 ・計算式が入っていない判定 ・エラー値の判定 ・IsEmpty関数:空白を判定するVBA関数 ・TypeName関数:データ型を判定するVBA関数 ・RangeオブジェクトのFormulaプロパティ ・空白セルを正しく判定する方法続編

自身のシート名!を削除

rng.Formula = Replace(rng.Formula, ws.Name & "!", "")
Rangeオブジェクト.Formula
これは数式のプロパティですが、この他に
FormulaLocal
FormulaR1C1
等々があります。
どれを使用しても構いませんが、
必ず、左辺と右辺で同じものを使用してください。
当たり前ではありますが、結構ミスしやすい部分になります。

数式にシート名が含まれているかは、
InStr関数
・InStr関数 ・InStrB関数 ・InStr関数の使用例 ・InStr関数の応用例1 ・InStr関数の応用例2 ・InStr関数の応用例3 ・InStr関数の練習問題 ・ ・
Like演算子
・Like演算子 ・パターン文字列式(ワイルドカード、文字リスト、文字範囲) ・Like演算子の使用例 ・正規表現について
どちらでも構いませんが、上記VBAではLike演算子にしてみました。。

コードも短く理解しやすいVBAだと思います。
ただし、計算式の入っていないセルまで巡回しているので、大量データが入っていると処理時間がかかってしまいます。
そこで、以下では計算式の入っているセルだけを対象にします。

計算式が入っているセルだけ巡回

Sub sample2()
  Dim ws As Worksheet
  Dim formulaRng As Range
  Dim rng As Range
  On Error Resume Next
  For Each ws In Worksheets
    Set formulaRng = ws.Cells.SpecialCells(xlCellTypeFormulas)
    If Err Then
      Err.Clear
    Else
      For Each rng In formulaRng
        If rng.Formula Like "*" & ws.Name & "!*" Then
          rng.Formula = Replace(rng.Formula, ws.Name & "!", "")
        End If
      Next
    End If
  Next
End Sub

先の、「使用されている全セルを巡回」との違いは、
Set formulaRng = ws.Cells.SpecialCells(xlCellTypeFormulas)
これで、数式の入っているセルだけを先に取得している点です。

第135回.ジャンプの選択オプション(SpecialCells)|VBA入門
・ジャンプの選択オプションとは ・RangeオブジェクトのSpecialCellsメソッド ・SpecialCellsの使用例

ただし、SpecialCellsは該当するセルが存在しないとエラーになってしまうので、

VBA マクロ 数式 シート名

そこで、On Error Resume Nextで対応しています。
・On Error Resume Next ・Errオブジェクト ・On Error Resume Next の使用例 ・「On Error Resume Next」の最後に

処理時間はこちらの方が少なくて済みます。



同じテーマ「マクロVBAサンプル集」の記事

印刷ダイアログを使用する(xlDialogPrint)

入力しやすいように、セルに色をつけている事が多いと思いますが、印刷時には、ちょっとじゃまな場合もあります。インク(トナー)も無駄ですしね。印刷時に色指定を解除して印刷する方法になります。Application.Dialogs(xlDialogPrint).Show 印刷タイアログを表示します。
名前定義の一覧と削除(Name)
・名前定義の一覧を取得し、シートに書き出すマクロVBA ・非表示の名前定義を表示 ・サイト内の関連ページ
シートを名前順に並べ替える
シートを名前順に並べ替える方法になります。配列を使っていますが、配列が難しい場合は、シートに書き出して処理すれば良いでしょう、並べ替えもシート上なら簡単です。上記では、シート名を文字列として処理しています。
数式内の不要なシート名を削除する(HasFormula)
数式の参照しているセルを取得する
セルに入っている数式の参照しているセルを取得するには、RangeのPrecedentsプロパティを使いますが、このプロパティは他のシートの参照には対応していません。また、セルの参照先を取得するプロパティには、Dependentsプロパティがあります。
増殖した条件付き書式を整理統合する
・条件付き書式の増殖に関する、Microsoft サポート ・増殖した条件付き書式の実例と対応 ・簡単なVBAでの対応 ・VBAで条件付き書式を整理統合した結果 ・今回のVBAコードの発想について ・Application.ConvertFormulaメソッド ・増殖した条件付き書式を整理統合するVBA ・条件付き書式で設定できる書式 ・増殖した条件付き書式を整理統合するVBAの使い方 ・増殖した条件付き書式を整理統合の最後
条件付き書式で変更された書式を取得する
条件付き書式が設定されている場合、当然ですが見た目は、本来そのセルに設定されている書式ではなく、条件付き書式の条件によって設定されている書式になります。VBAで、この条件付き書式によって設定された書式を取得します。これが取得できるようになったのは、Excel2010からですので、このページで紹介するVBAコードはE…
セル結合/解除でセル値を退避/回復
・セル結合/解除でセル値を退避/回復のVBA ・退避したセル値の全削除と一覧出力 ・セル結合/解除の最後に
セル結合なんて絶対に許さないんだからね
セル結合の弊害はネットに溢れているのでここで改めて説明の必要はないでしょう。とはいえ、ついついセル結合してしまう事ありますよね、人間だからね。VBAで適切に処理すればセル結合もきちんと処理は可能です。
セルの数式をネスト色分けしてコメント表示
・セルの数式をネスト色分けしてコメント表示のVBA ・セルの数式をネスト色分けしてコメント表示の使用例 ・セルの数式をネスト色分けしてコメント表示の最後に
セル結合して表を見やすくする(非推奨)
・セル結合して表を見やすくするVBA ・マクロVBAのショートカット登録 ・セル結合して表を見やすくするVBAの使い方


新着記事NEW ・・・新着記事一覧を見る

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ