質問するログイン新規登録

Q&A

解決済

1回答

759閲覧

【Excel VBA】 マジックナンバーかどうか

Month16

総合スコア4

0グッド

1クリップ

投稿2023/12/07 00:44

0

1

前提・実現したいこと

Excel VBAで配列のデータをFor Each文を使ってワークシートに転記したいと思います。
A列の1行目に右に向かってデータを順番に転記したいので、開始セルはA1セルになります。
For Each文の中で列番号を+1しながら転記していくイメージです。

その際For Each文に入る前に列番号の初期値を設定しようと思っているんですが、初期値に普通に1を代入とした場合は1はマジックナンバーになるのでしょうか?
下記のソースコードだと変数iです。

該当のソースコード

VBA

1Private Const TENKI_COL As Long = 1 2Private Sub test() 3 '~何らかの処理~ 4 Dim i As Long 5 i = 1 6 Dim v 7 For Each v In 配列 8 ActiveSheet.Cells(TENKI_COL, i) = v 9 i = i + 1 10 Next v 11End Sub

補足情報

マジックナンバーだった場合、どのような方法でマジックナンバーを消すのが良いでしょうか?

⓵モジュール上部に初期値の列番号を列挙型で設定しておいて、ローカル変数iに代入する事で初期値とする
②モジュール上部に初期値の列番号を定数で設定しておいて、ローカル変数iに代入する事で初期値とする
③ソースコードは今のままで、ローカル変数iの所にコメントを入れて意味を持たせる

これ以外に方法があれば教えて頂きたいです。

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

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

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

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

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

YellowGreen

2023/12/07 03:24 編集

お求めの回答とは思えないのでコメントで。 私の場合の例です。 変数名が i ということで通常カウンタに使われる変数だとわかりますし。 i = 0 または i = 1 はインデックスの最初からと受け止めることができるので、 通常そのまま使っています。 あとは、見出し行があるデータの場合などでは、 Const numTitleRows As long = 2 lastRow As long With sheet lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row End with Dim i As Long For i = numTitleRows + 1 To lastRow ... Next i などとすることもあります。 だだ、この場合でも For i = numTitleRows + 1 To lastRow の + 1 で数字をそのまま使っていますが、 見出しの次の行という意味が伝わるので nextRow などの変数は用いず使っています。
Month16

2023/12/07 03:58

変数名だけでも伝わる事もあるんですね。 掲載して頂いたソースコードは、見出し行以外のデータ部分をループするのが良く分かります。 参考にさせて頂きます。 ありがとうございました。
guest

回答1

0

ベストアンサー

やろうとしていることの内容次第ですね。

⓵モジュール上部に初期値の列番号を列挙型で設定しておいて、ローカル変数iに代入する事で初期値とする
②モジュール上部に初期値の列番号を定数で設定しておいて、ローカル変数iに代入する事で初期値とする
③ソースコードは今のままで、ローカル変数iの所にコメントを入れて意味を持たせる

結局、意味をどこに記述するかですので、どの範囲で使うかによって記述する場所を変えたらいいでしょう。
複数のモジュールで使いまわしするなら、標準モジュールでパブリック宣言しておく。
モジュール内での使いまわしなら、モジュールの先頭でプライベート宣言。
プロシージャ内でのみなら、変数の宣言時または初期化時。
など。

Excel VBAで配列のデータをFor Each文を使ってワークシートに転記したいと思います。
A列の1行目に右に向かってデータを順番に転記したいので、開始セルはA1セルになります。

ということなら下記の1行ですみますのでマジックナンバーの入る余地はありません。

vba

1Range("A1").Resize(, UBound(v)).Value = v

ただ、「開始セルがA1」という場合、A1がなんの意味をもつのかこのコードから不明です。
vもなんのデータなのか不明です。
一種のマジックナンバーといえるでしょう。
変数vも何のデータなのか分かるように意味も持つ名前付けをするとかしたほうがいいでしょう。

エクセルのシート上のデータなら、テーブル化しておけば、列や行に意味を持たせることが可能です。
テーブルのVBAからの活用法はWEB検索すればサンプルがいろいろ見つかるので参考にしてください。
例えば、
【VBA】テーブルから値を取得する方法まとめ【“構造化参照”と“ListObjects”の比較】

実際のデータ、処理によって対応はかわってくるので、「マジックナンバー」における対応の一般論というのは特にないでしょう。

投稿2023/12/07 01:22

hatena19

総合スコア34367

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

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

Month16

2023/12/07 03:43

今の所1つのプロシージャ内だけで使う変数なので、ローカル変数として使おうと考えています。 Resizeプロパティは考えていませんでした。 ただおっしゃっている通り何の意味を持つのか不明なので、名前に意味を持たせる事を意識したいと思います。 色々と提案して頂いてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問