Excel VBA 質問スレッド №2120 (解決済)
列や行の削除、追加を見据えた設計
投稿者 : ミノデュタ 投稿日時 : 2025/06/03(Tue) 00:42:16 OS : 未指定 EXCEL : 未指定
vbaを使って、これまでいくつかの物を作成してきた初心者です。
みなさんにお聞きしたいのですが、excelは行と列で構成されたソフト。
例えばa列に名前があることを前提としてvbaを作成します。
でも仕様の変更で列を追加することになり、a列が名前ではなくなるケースがあると思います。
その場合、コードの全てをa列から別の列に変更するのか、a列を元から変数にしておくのか。
それとも、仕様の変更に動的に対応できる、便利な方法やコードがあるのか。
仕様の変更に対応するコードの書き方や考え方をお聞きできますか?
いつも、仕様変更の際、コードの列を全て書き換えるやり方で嫌気がさしています。
自分にはこのやり方しか思いつかないので、詳しい方の考え方をお聞きしたいです。
よろしくお願いします。
vbaを使って、これまでいくつかの物を作成してきた初心者です。
みなさんにお聞きしたいのですが、excelは行と列で構成されたソフト。
例えばa列に名前があることを前提としてvbaを作成します。
でも仕様の変更で列を追加することになり、a列が名前ではなくなるケースがあると思います。
その場合、コードの全てをa列から別の列に変更するのか、a列を元から変数にしておくのか。
それとも、仕様の変更に動的に対応できる、便利な方法やコードがあるのか。
仕様の変更に対応するコードの書き方や考え方をお聞きできますか?
いつも、仕様変更の際、コードの列を全て書き換えるやり方で嫌気がさしています。
自分にはこのやり方しか思いつかないので、詳しい方の考え方をお聞きしたいです。
よろしくお願いします。
スポンサーリンク
[返信 1] Re : 列や行の削除、追加を見据えた設計
投稿者 : てらてら 投稿日時 : 2025/06/03(Tue) 06:01:57
こんにちは。
いくつかやり方はあると思います。
一番オーソドックスなのは、モジュールの冒頭にConstを使って定義しておく方法でしょう。
Const cName As Long = 1 '名前列
仕様が変更になった時に数値を変更します。
コードは以下のようにします。
Cells(5, cName) = 10
後はNameを使う方法も考えられます。
Nameは、列や行が挿入されると一緒にずれてくれますので、勝手に列挿入された時でも追従してくれます。
ただ、少々わかりずらいというのが難点です。
やり方は、A列が名前の列の初期段階で、A1セルを選択して、名前ボックスに「名前」などとしておきます。
後は、コードで以下のようにすると、列挿入されても名前列に入力する事が可能です。
参考にしてみてください。
こんにちは。
いくつかやり方はあると思います。
一番オーソドックスなのは、モジュールの冒頭にConstを使って定義しておく方法でしょう。
Const cName As Long = 1 '名前列
仕様が変更になった時に数値を変更します。
コードは以下のようにします。
Cells(5, cName) = 10
後はNameを使う方法も考えられます。
Nameは、列や行が挿入されると一緒にずれてくれますので、勝手に列挿入された時でも追従してくれます。
ただ、少々わかりずらいというのが難点です。
やり方は、A列が名前の列の初期段階で、A1セルを選択して、名前ボックスに「名前」などとしておきます。
後は、コードで以下のようにすると、列挿入されても名前列に入力する事が可能です。
Sub test() Dim cName As Long cName = Range("名前").Column Cells(5, cName) = 10 End Sub
参考にしてみてください。
[返信 2] Re : 列や行の削除、追加を見据えた設計
投稿者 : ピロリ 投稿日時 : 2025/06/03(Tue) 21:12:12
私がよくやる手は、下のような感じです。 参考になるか分かりませんが・・・
データシートには下のような入力がされている前提で説明します。
A B
1 名前 住所
2 山田 東京都○○○
3 鈴木 大阪府○○○
4 佐藤 京都府○○○
案1:てらてらさんと被りますが、A1セルに「名前」,B1セルに「住所」の名前を付けて、
データを処理する手法。
名前を付けたセルが削除されない限り、行列の挿入・削除の影響は受けません。
案2:別シート(仮に「定義」シート)に下のような定義をしておいて、参照する手法。
悪戯されたくなければ、シートを非表示にしておくと良いでしょう。
但し、プログラムの修正は不要ですが、定義の変更は必要になります。
「定義」シート
A B
1 名前 住所
2 A1 B1
使い方は下のような感じです。名前を指定すると住所を表示するだけの処理ですけど。
その他に、「シートの保護」で、行列の挿入・削除をできないようにしちゃうって手も
ありますが、これはミノデュタさんの質問の意図とは異なると思うので余談です。
私がよくやる手は、下のような感じです。 参考になるか分かりませんが・・・
データシートには下のような入力がされている前提で説明します。
A B
1 名前 住所
2 山田 東京都○○○
3 鈴木 大阪府○○○
4 佐藤 京都府○○○
案1:てらてらさんと被りますが、A1セルに「名前」,B1セルに「住所」の名前を付けて、
データを処理する手法。
名前を付けたセルが削除されない限り、行列の挿入・削除の影響は受けません。
案2:別シート(仮に「定義」シート)に下のような定義をしておいて、参照する手法。
悪戯されたくなければ、シートを非表示にしておくと良いでしょう。
但し、プログラムの修正は不要ですが、定義の変更は必要になります。
「定義」シート
A B
1 名前 住所
2 A1 B1
使い方は下のような感じです。名前を指定すると住所を表示するだけの処理ですけど。
その他に、「シートの保護」で、行列の挿入・削除をできないようにしちゃうって手も
ありますが、これはミノデュタさんの質問の意図とは異なると思うので余談です。
Sub Sample() Dim NameRng As Range, AddrRng As Range Dim NameStr As String, i As Long NameStr = InputBox("誰の住所が知りたい?") If NameStr <> "" Then With ActiveSheet 'Set NameRng = .Range("名前") '案1の場合 'Set AddrRng = .Range("住所") '案1の場合 Set NameRng = .Range(Worksheets("定義").Range("A2")) '案2の場合 Set AddrRng = .Range(Worksheets("定義").Range("B2")) '案2の場合 i = 1 Do While NameRng.Offset(i) <> "" If NameRng.Offset(i) = NameStr Then MsgBox NameStr & "の住所は、" & AddrRng.Offset(i) Exit Sub End If i = i + 1 Loop MsgBox NameStr & "の住所は、見付かりません。" End With End If End Sub
[返信 3] Re : 列や行の削除、追加を見据えた設計
投稿者 : tek 投稿日時 : 2025/06/03(Tue) 21:48:43
もし、Excel2007以降で、項目行がユニークであり、ミノデュタさんがテーブルとして捉えることができるのなら、
シートの行列番号は全く無視することが可能です。
詳しくは”ListObject”でググってください。
もし、Excel2007以降で、項目行がユニークであり、ミノデュタさんがテーブルとして捉えることができるのなら、
シートの行列番号は全く無視することが可能です。
詳しくは”ListObject”でググってください。
[返信 4] Re : 列や行の削除、追加を見据えた設計
投稿者 : 曖昧 投稿日時 : 2025/06/04(Wed) 04:50:39
A列データのあるセルを選択して、Ctrl + * じゃいけんの?
コードが欲しかったら、これをマクロ記録して
A列データのあるセルを選択して、Ctrl + * じゃいけんの?
コードが欲しかったら、これをマクロ記録して
[返信 5] Re : 列や行の削除、追加を見据えた設計
投稿者 : tkit 投稿日時 : 2025/06/04(Wed) 10:32:18
>投稿者 : tek 投稿日時 : 2025/06/03(Tue) 21:48:43
tekさん同様、Excelのテーブル VBAではListObjectを使います。
見せるデータ(表示)と基データ(データベース)を切り分けた方が後々何かの変更があった場合、修正、改修が楽です。
基データさえまともであれば、見せ方はどうにでもなるので。
>投稿者 : tek 投稿日時 : 2025/06/03(Tue) 21:48:43
tekさん同様、Excelのテーブル VBAではListObjectを使います。
見せるデータ(表示)と基データ(データベース)を切り分けた方が後々何かの変更があった場合、修正、改修が楽です。
基データさえまともであれば、見せ方はどうにでもなるので。
[返信 6] Re : 列や行の削除、追加を見据えた設計
投稿者 : ミノデュタ 投稿日時 : 2025/06/07(Sat) 15:47:49
みなさんのおかげで様々なやり方を知ることができました。
これから勉強していきます。
教えてくださった方、ありがとうございました。
みなさんのおかげで様々なやり方を知ることができました。
これから勉強していきます。
教えてくださった方、ありがとうございました。
当掲示板について
- Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
- 記事内ではHTMLのタグは使用できません。
- 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
- Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
- Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
( 処理日時 : 2025-07-04 12:22:37 )