列の位置が変わらないことを前提に列の位置を固定化して
VBAコードを書いたマクロを作成すると、
シートの列が追加・削除された場合に、列の位置がズレることで、
マクロが正しく動作しなくなります。
https://tonari-it.com/excel-vba-enum-columns/
のように列挙体を使えば、コードの修正はかなり楽になりますが
マクロのコードに一切修正を加えなくても
自動的に列の追加や削除に対応できる方法はありますでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア34073
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総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
一般論で言えば、管理シートを作成し、そこに各項目の列情報を記憶しておけば良いかと。
列の追加、削除時に、その管理シートをメンテナンスすれば、マクロの修正は不要になります。
投稿2019/10/23 01:34
総合スコア5493
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/23 04:09
2019/10/23 04:58
2019/10/23 05:34 編集
2019/10/23 06:50
2019/10/23 06:54
2019/10/23 07:42
2019/10/23 09:44
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/23 06:53
2019/10/23 08:07