🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

列挙型

データ型の一種で、要素・メンバなど名前のある値や、型の列挙子によって構成されます。

Q&A

解決済

3回答

8490閲覧

EXCEL VBAで、列の追加・削除に対応できるマクロの作成方法

SYO_chan

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

列挙型

データ型の一種で、要素・メンバなど名前のある値や、型の列挙子によって構成されます。

0グッド

0クリップ

投稿2019/10/23 01:07

列の位置が変わらないことを前提に列の位置を固定化して
VBAコードを書いたマクロを作成すると、
シートの列が追加・削除された場合に、列の位置がズレることで、
マクロが正しく動作しなくなります。

https://tonari-it.com/excel-vba-enum-columns/
のように列挙体を使えば、コードの修正はかなり楽になりますが

マクロのコードに一切修正を加えなくても
自動的に列の追加や削除に対応できる方法はありますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

回答を書いているうち解決済みになっちゃいましたが、せっかくなので投稿しておきます。


セル範囲をテーブル化するという方法を検討されてはどうでしょう。

質問のリンク先サイトでも、続きの連載でテーブル化のメリットを紹介しています。

エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得

以下もうまくまとめられています。

Excelテーブル化のススメとVBA ListObject操作の自分用覚書 - Qiita

上記のリンク先では、下記のようにインデックスで参照する方法を紹介してますが、

vb

1'1列目 2ActiveSheet.ListObjects(1).ListRows(1).Range(1).Address 3'3列目 4ActiveSheet.ListObjects(1).ListRows(1).Range(3).Address

実は下記のようにテーブル名と列見出しで参照することも可能です。

vba

1'「氏名」列の1行目のデータ 2ActiveSheet.ListObjects("テーブル名").ListColumns("氏名").Range(2).Address

ちょっと記述が長いという場合は、下記のような書き方もできます。

vba

1Range("テーブル1[名前]")(1).Address

注:ListColumnsの場合は見出し行も含むが、Range("テーブル1[名前]")の場合はデータ範囲のみのようです。

これらの参照法は、見出し行の列名で参照するので、列を追加したり削除して列位置が変更されてもコードを変更する必要はありません。

投稿2019/10/23 05:36

編集2019/10/23 05:43
hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2019/10/23 06:53

普段テーブル使わないので見落としてました。 これが一番スムーズな気がします。 ただテーブルだとレイアウトが限定されてしまうのがネックですかね。 それを言ったら私の案も一緒か。
SYO_chan

2019/10/23 08:07

hatena19さん ありがとうございます。 勉強になります。
guest

0

連想配列を使えば可能かと思います。
こんな感じで。

VBA

1Dim ic As Object 2Dim ir As Range 3Dim item As Range 4 5' 1行目を取得しカラム位置を連想配列化 6Set ir = Range(Cells(1, 1), Cells(1, Range("A1").End(xlToRight).Column)) 7Set ic = CreateObject("Scripting.Dictionary") 8For Each item In ir 9 ic.Add item.Text, item.Column 10Next 11 12' 名前でセルを操作 13Cells(2, ic("品目")) = "大根"

.

投稿2019/10/23 01:36

編集2019/10/23 01:37
ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SYO_chan

2019/10/23 04:12

連想配列は全く思いつきませんでした。 発想力が素晴らしいと思います。 ありがとうございました。
guest

0

ベストアンサー

一般論で言えば、管理シートを作成し、そこに各項目の列情報を記憶しておけば良いかと。
列の追加、削除時に、その管理シートをメンテナンスすれば、マクロの修正は不要になります。

投稿2019/10/23 01:34

tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SYO_chan

2019/10/23 04:09

ありがとうございます。 なるほど。 早速、やってみます。
ttyp03

2019/10/23 04:58

tatsu99さん リンク先に書いてあることと同じことを言ってるようにしか見えないのですが。。。
tatsu99

2019/10/23 05:34 編集

https://tonari-it.com/excel-vba-enum-columns/の場合だと、 列の追加/削除でマクロの修正が入りますが、 管理シートにその情報を書いておけば、その管理シートの修正だけですみます。 従って、マクロの修正は不要になります。 修正時の手間暇は同じ程度になるかもしれませんが・・・・・ ここから先は想像ですが、質問者の方は、列の追加削除に伴い、マクロの修正依頼が自分のところに くるのを避けたかったのではないでしょうか。 マクロを使う人がズブの素人の場合、マクロの修正はできませんが、管理シートにしておけば、 管理シートの修正くらいはできます。(多少、管理シートの使い方の説明は必要になりますが) そのようにして、自分の手を煩わすことを避けたかったように思われます。
ttyp03

2019/10/23 06:50

あ、ごめんなさい。 シートを使うのか。。。 でもまあ、なんか面倒なイメージしかないです。 管理シート=対象の表と一緒のような。。。
tatsu99

2019/10/23 06:54

連想配列の扱いに慣れているならttyp03さんの方法がベターかもしれませんね。 肝心なのは、質問者がマクロをメンテナンスしなくて済むことかと。
ttyp03

2019/10/23 07:42

どれを採用するかは質問者様次第ですが、質問内容を咀嚼すると列位置がずれてもマクロ側の手直しをしなくて済む方法はないかと言うのを問われているのかと思いました。 質問ではマクロに限定していますが、管理シートを用意したところで、結局そちらに手を入れないといけないようでは質問の意図とは違うのかなと思いました。 でもtatsu99さんの回答が選ばれたということは私が深読みしすぎただけかもしれません。
SYO_chan

2019/10/23 09:44

将来、作成者の自分がいなくなったときに、 マクロを知らない人でも可能な限りメンテナンスできるようにしたいと思い 質問させていただきました。 シートの編集だけで済むのであれば、マクロを知らなくても 編集のやり方だけを理解していれば、メンテナンスできると思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問