見出し画像

17-項目名で列番号を取得する!(エクセルマクロ)

特定の項目名の位置を取得してフィルタリング!

皆さんこんにちは。
今回はマクロでフィルタ操作のコードをかくとき、そもそもフィルタをかける「項目名」はわかっているけど「列番号」がわからない、というときに使うコードをご紹介します。

◆イメージ

次の図のように記録シートのB列を「美容」でフィルタをかけ、美容シートに貼付けるコードがあります。

画像6

画像2

(関連記事:マクロルーティン#16(指定のシートにまとめる)
(関連動画:【マクロルーティン8】シートの中で必要なデータのみ別のシートにまとめる方法


◆問題

一行目のコードではフィルタをかける列がB列とわかっているので、AutoFilterの引数であるFieldと指定できます。

Worksheets("記録").Range("A1").AutoFilter Field:=2, Criteria1:="美容"

ここでフィルタをかける列番号が決まっていなくて、項目名が「種類」ということがわかっている場合どうするのか、ということです。

◆こたえ

項目名の行で「種類」という文字列が入っているセルの列番号を取得する。


◆書くコード

画像5

(Option Explicitはコメントアウトして、変数宣言を強制せずに書いてます。)

★一行目が追加されて、次の行でFieldの値がretsuという変数になっています。

◆解説

1行目 >Worksheets("記録").Rows(1).Find(what:="種類").Column

Worksheets("記録").Rows(1)➡「記録」シートの1行目
Find(what:="種類")
     ➡”種類”という文字列を検索して当てはまったセルを返す書き方
             ★「What」はFindの引数で、検索するデータを指定します。
Column➡列

画像6


これで列番号が取得できるので、retsu という変数に入れておきます。

retsu = Worksheets("記録").Rows(1).Find(what:="種類")

画像5

なんで、変数に入れたかというと、、次の行でフィルタリングしているコードをご覧ください。
2行目 >Worksheets("記録").Range("A1").AutoFilter Field:=retsu, Criteria1:="美容"

AutoFilterの引数に列番号を指定するときに使いたいからです。
変数(retsu)を作らなかった場合以下のようなコードになります。

Worksheets("記録").Range("A1").AutoFilter Field:=Worksheets("記録").Rows(1).Find(what:="種類").Column, Criteria1:="美容"

書くコードが長くなります。
コードはなるべく短く分かり易く書きたいです。

◆まとめ

画像6

①一行目でフィルタリングしたい項目名の列番号を取得して変数に入れておく
retsu = Worksheets("記録").Rows(1).Find(what:="種類").Column

②次の行でフィルタリングするとき、列番号の指定を①で取得した変数にする
Worksheets("記録").Range("A1").AutoFilter Field:=retsu, Criteria1:="美容"


画像8

変数宣言を強制(Option Explicit)して書く場合は次の図のように1行コードを書くことになります。
[retsu]という変数を作ったので、その変数の宣言を最初に書きます。
Dim retsu As Long
retsuは整数です。という宣言です。

画像7


今日はここまでです。
文字列の検索をするときに使えるマクロですのでとっても便利です。



この記事が気に入ったらサポートをしてみませんか?