• ベストアンサー

Excel VBA 配列の開始添字について

Excel VBAで、「Option Base 1」により配列の添字を1開始にしない場合、セルの値を取り込んだ配列の処理に凄く困らないでしょうか?例えば Dim A,B A=Range(Cells(1,1),Cells(100,500)).value B=Array(1,3,5,7) とかいう場合、どうしてもAは添字が1開始になり、Bの方は0開始になりますよね? AとBについて、ループであれこれ処理する場合、開始添字の違いをイチイチ意識しながらコーディングするのは明らかに間違いの元だと思います。こういうのって、どう対処すれば良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

#1、cjです。 書き漏れていることがありました。 例として、 " 1 オリジン "の一次元配列(またはコレクション) と " 0 オリジン "の一次元配列 を どちらも予め定義された状態で取得するような場合には、 私も素直に「 + 1 」とか「 - 1 」とか書くことが殆どです。 関連付けしながらのループ処理をさらにループする必要があるような場合で 「 + 1 」とか「 - 1 」とか煩雑になり過ぎている時などは ReDim Preserve を使って、どちらかを再定義して 添え字を揃えることも、たまーに、あります。   B(0 To 3) について、UBound()関数やLBound()関数などを併用しつつ   ReDim Preserve B(1 To 4) のように添え字をずらすやり方です。 でもこれは、普通じゃない感じがしますね(私は)。 一応知識としては持っていた方がよいかな、という程度で、 これは流行らないとは思います。 「 + 1 」とか「 - 1 」とか素直に応じる場合も多い、という話です。 以上です。

absolute_space
質問者

お礼

ややこしくなってきたらDim A(1 to 3)など、明記するのが良さそうですね。

その他の回答 (1)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 VBAを書く人それぞれにそれぞれの正解があるようなテーマかも知れません。 まず、 > ...配列の添字を1開始にしない場合、'セルの値を取り込んだ配列の処理に凄く困らないでしょうか?... 慣れて熟れれば、平気になるでしょうし、 このテーマを質問テーマにしたあなたなら、きっと困らなくなる日も近いと思います。 配列といえば(少なくとも一次元配列の多くは)" 0 オリジン "というのが標準ですね。 " 0 オリジン "同士を関連付けする経験もそこそこに、 " 1 オリジン "と組み合わせた関連付けをする必要に迫られて 多少なりとも困惑する、というのは皆さん経験することだとは思います。 初心者に対してなら、アドバイスとしては、'とにかく慣れることで、前に進みましょう' とか、言うべきなのかも知れませんね。 私の場合は、、、 殆ど全くOption Base 1 は書きません。 確かに(件が合えば)書く時には条楽なのですが、 他人が書いたコードや過去に自分が書いたコードを読む時、 Option Base 1 と、うんと上の方に1行書いてあるだけでは、 心もとないですし、却って混乱することもあるからです。 仕事では、配列を定義(再定義)する行に 最少の添え字についてコメントを付けるように配慮していますが、 なんか無駄なことやってる気がすることもしばしばありました。 私個人と私がルールを決められる場面では、 Option Base 1 は使わないと決め、必要ならOption Base 0 と明示することにしています。 その上で、 Array関数が返す" 0 オリジン "の一次元配列 と セル範囲から取得する" 1 オリジン "の二次元配列 を 関連付ける場合は、以下のような方法を採ります。 ' ' ========================= Option Base 0 Sub test()   Dim A, B   A = Range("A1:B4").Value   B = VBA.Array(, 1, 3, 5, 7) End Sub ' ' ========================= VBA.Array()関数は、Option Baseに依存せず(影響されず)常に" 0 オリジン "です。   B = VBA.Array(, 1, 3, 5, 7) は、   B = VBA.Array(Empty, 1, 3, 5, 7) の省略形で、この場合、   B(0 To 4) で定義されます。   B(0) を使わない前提で、疑似的に" 1 オリジン "として扱う、ということです。 実際に使うのは   B(1 To 4) ということになります。 使いもしない要素の為にメモリを割くことが許せないという考え方が昔はありました。 このやり方は近年少しずつ市民権を得てきていて、その内主流になるだろうと思っています。 実際これに慣れてみると、 「 + 1 」とか「 - 1 」とか、いちいち書かなくて済みますし、 Option Base を確認する必要もなく、 最少の添え字についてコメントつける必要もなくなります。 まぁ、好みとか主義とか流派(?)とか色々な考え方があるので、 あくまで私の場合ってことです。 以上、ひとつのスタイル(方法論)を示すことは出来ているだろうと思うのですが、 ご参考まで。

absolute_space
質問者

お礼

遅くなりましたが、ありがとうございました。

関連するQ&A