【VBAリファレンス|実務向け】数式で「名前の定義」を「セルのアドレス」で表示させる裏技

スポンサーリンク

導入:なぜこのテクニックが重要なのか?

Excelで作業をしていると、特定のセルやセル範囲に「名前の定義」をすることがよくあります。例えば、「売上合計」という名前を定義して、数式で `=SUM(売上合計)` のように使うと、数式が分かりやすくなりますよね。

しかし、この「名前の定義」を使った数式を他の人に渡したり、後で見返したりしたときに、「この『売上合計』って、具体的にどのセルを指しているんだろう?」と迷ってしまうことがあります。数式上では定義された名前しか表示されないため、元のセルアドレスを確認するには、名前の管理画面を開く手間が発生します。

このブログ記事では、そんな悩みを解決し、数式内で定義された名前を直接セルのアドレスで表示させるための、ちょっとした裏技をご紹介します。これにより、数式の可読性とメンテナンス性が格段に向上します。

基礎知識:「名前の定義」とは?

Excelの「名前の定義」機能は、セルやセル範囲に分かりやすい名前を付けることができる機能です。これにより、数式が人間にとって理解しやすくなります。

  • メリット:
  • 数式が読みやすくなる(例: `SUM(売上合計)` vs `SUM(C5:C20)`)
  • 数式の入力ミスが減る
  • 後から参照範囲を変更する際、名前の管理画面で一括変更できる
  • デメリット(今回のテーマに関わる部分):
  • 数式上では定義された名前が表示され、元のセルアドレスが分かりにくくなる

実装/解決策:数式内でセルのアドレスを表示させる方法

数式内で定義された名前ではなく、セルのアドレスを表示させるには、数式を入力する際に、定義された名前を直接入力するのではなく、キーボードからセルのアドレスを直接入力するのが基本です。

しかし、これだけでは「裏技」とは言えません。ここでご紹介するテクニックは、一度数式で定義された名前を使ってしまった後でも、その数式をセルのアドレス表示に切り替える方法です。

その方法は、驚くほどシンプルです。

1. 数式が入力されているセルを選択します。
2. 数式バーに表示されている、定義された名前の部分(例: `売上合計`)を、直接キーボードで書き換えます。 このとき、定義された名前が指している実際のセルアドレス(例: `$C$5:$C$20`)を入力します。
3. [Enter]キーを押して数式を確定します。

これで、数式バーにはセルのアドレスが表示されるようになります。

ポイント:
数式バーで定義された名前を直接セルアドレスに書き換える際に、絶対参照(`$`マークが付いた状態)で入力することで、後で数式をコピーしても参照位置がずれることを防げます。

サンプルプログラム:具体的な例を見てみましょう

ここでは、例として「Sheet1」の「C5」セルに「商品名」、同じく「C6」セルに「単価」、そして「C7」セルに「数量」という名前が定義されていると仮定します。

本来、これらの名前を使って数式を作成すると、例えば「合計金額」を計算する数式は以下のようになります。

`=単価 数量`

この数式は分かりやすいですが、「単価」と「数量」が具体的にどのセルなのかは、数式だけでは判断できません。

そこで、数式バーで直接セルアドレスに書き換えてみましょう。

例1:数式バーで直接書き換える

1. 例えば「D5」セルに `=単価 数量` という数式が入っているとします。
2. 「D5」セルを選択し、数式バーを確認します。
3. 数式バーに表示されている `=単価 数量` の部分を、直接 `=C6 C7` と書き換えます。
4. [Enter]キーを押して確定します。

これで、「D5」セルの数式は `=C6 C7` となり、セルのアドレスで表示されるようになります。

例2:VBAを使った自動化(応用編)

もし、多数のセルで定義された名前をセルアドレスに一括で変換したい場合は、VBAを使うと効率的です。

Sub ReplaceDefinedNamesWithAddresses()

Dim TargetCell As Range
Dim FormulaString As String
Dim DefinedName As Variant
Dim i As Integer

‘ — 設定 —
‘ 変換したい数式が入っているセル範囲を指定します。
‘ 例: ActiveSheet.Range(“D5:D10”)
Dim TargetRange As Range
Set TargetRange = Selection ‘ 現在選択されている範囲を対象にする場合

‘ — 処理開始 —
Application.ScreenUpdating = False ‘ 画面更新を停止して処理を高速化

‘ 選択された各セルに対して処理を行う
For Each TargetCell In TargetRange

‘ セルが数式を持っているか確認
If TargetCell.HasFormula Then
FormulaString = TargetCell.Formula

‘ Excelのバージョンによって数式の取得方法が異なる場合があるため、
‘ ここでは最も一般的な「名前」の参照形式を想定して処理します。
‘ (例: =SUM(売上合計) のような形式)

‘ ワークシート上のすべての定義済み名を取得
For Each DefinedName In ThisWorkbook.Names
‘ 数式内に定義済み名が含まれているかチェック
‘ 完全一致ではなく、部分一致で置換できるように工夫が必要な場合もありますが、
‘ ここでは単純な置換例を示します。
‘ ※注意: この単純な置換では、意図しない置換が発生する可能性もあります。
‘ より厳密な処理が必要な場合は、正規表現などを使用することを推奨します。

‘ 定義済み名そのもの(例: “売上合計”)を、その参照先アドレス(例: “$C$5:$C$20″)に置換
‘ ただし、VBAで直接数式内の名前をアドレスに置換するのは複雑なため、
‘ ここでは、数式バーで手動で置換する方が一般的で安全であることを示唆します。

‘ より現実的なVBA処理の考え方
‘ 実際には、VBAで数式内の「名前」を「アドレス」に一括置換するのは、
‘ 名前が数式内でどのように使われているか(例: 引数なのか、単独なのか)を
‘ 精密に解析する必要があり、非常に高度な技術が必要です。
‘ そのため、ここではVBAで「名前をアドレスに変換する」直接的なコード例は割愛し、
‘ 手動での置換が最も簡単で確実な方法であることを強調します。

‘ もし、VBAで「名前の定義」自体を操作したい場合は、Namesコレクションを使用します。
‘ 例: ThisWorkbook.Names.Add Name:=”新しい名前”, RefersTo:=”=Sheet1!$A$1″

Next DefinedName
End If

Next TargetCell

Application.ScreenUpdating = True ‘ 画面更新を再開
MsgBox “定義済み名の数式アドレスへの置換処理(手動での確認・修正を推奨)が完了しました。”, vbInformation

End Sub

※VBAに関する補足:
上記VBAコードは、数式内の定義済み名前を直接アドレスに変換する、という非常に複雑な処理を伴うため、そのまま動作する汎用的なコードとして提供するのは困難です。実際には、数式解析や正規表現といった高度な技術が必要になります。

そのため、VBAの例としては、「もし定義済み名前を削除したい」あるいは「新しい名前を定義したい」といった、より直接的な操作に焦点を当てる方が現実的です。

このテーマにおいては、数式バーで手動で編集する方法が最も簡単で確実であることを覚えておいてください。

応用・注意点

  • 数式コピー時の挙動:

定義された名前を数式内で使用している場合、Excelはその数式を絶対参照とみなす傾向があります。そのため、数式をコピーしても、参照しているセルの位置は相対的に変更されません。数式をアドレス表示に切り替えることで、この挙動を一般的な相対参照や絶対参照のルールに従わせることができます。

  • 「名前の管理」画面との連携:

もし、定義された名前をセルのアドレスに変換した後、やはり元の名前を使いたいとなった場合は、「名前の管理」([数式]タブ > [名前の管理])を開き、再度名前を編集するか、削除して名前を定義し直すことができます。

  • 数式の複雑さ:

非常に複雑な数式や、入れ子になった関数の中で定義済み名が使われている場合、手動での置換も慎重に行う必要があります。一度アドレスに変換した後、数式が意図通りに動作するかどうか、必ずテストしてください。

  • バージョンによる違い:

Excelのバージョンによって、数式の表示や挙動に若干の違いがある場合があります。しかし、今回ご紹介した「数式バーでの直接編集」は、どのバージョンでも共通して有効な方法です。

このテクニックをマスターすれば、Excelでの数式作成や管理が、よりスムーズになるはずです。ぜひ、日々の業務で試してみてください。

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