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について、ループであれこれ処理する場合、開始添字の違いをイチイチ意識しながらコーディングするのは明らかに間違いの元だと思います。こういうのって、どう対処すれば良いのでしょうか?
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 」とか素直に応じる場合も多い、という話です。
以上です。
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 を確認する必要もなく、
最少の添え字についてコメントつける必要もなくなります。
まぁ、好みとか主義とか流派(?)とか色々な考え方があるので、
あくまで私の場合ってことです。
以上、ひとつのスタイル(方法論)を示すことは出来ているだろうと思うのですが、
ご参考まで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
Excelのメモリ(配列)の上限は2G...
-
配列をランダムに並び替えても...
-
配列の中の最大値とそのインデ...
-
Excel2010のinputboxで複数デー...
-
構造体配列の特定のメンバーをF...
-
VBAで配列引数を値渡しできない...
-
配列のペースト出力結果の書式...
-
ExcelVBAで配列をベースに配列...
-
構造体配列内の文字列検索のよ...
-
二分探索について
-
EXCELを使って、アクセスログを...
-
COBOLの基本的な事なので...
-
2次元配列の初期値
-
VBAのワークシート関数で配列の...
-
Redim とEraseの違いは?
-
CheckBoxの配列化
-
デバイスマネージャーの一覧取得
-
構造体配列の一部初期化!!!
-
INT64対応のprintf系関数はあり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
vba フィルター 複数条件 3つ以...
-
エクセルでXY座標に並べられた...
-
Dir関数で読み取り順を操作でき...
-
Excel2010のinputboxで複数デー...
-
構造体配列の特定のメンバーをF...
-
Redim とEraseの違いは?
-
配列のペースト出力結果の書式...
-
COBOLの基本的な事なので...
-
大量の変数を定義するにはどう...
-
DBから取得した値を配列へ代入する
-
EXCEL VBAの課題です
-
VBScriptでCSVファイルを読み出...
-
VBAでMODE関数をつくる
-
配列の中の最大値とそのインデ...
-
定数配列の書き方
-
構造体配列内の文字列検索のよ...
-
CheckBoxの配列化
-
Excelのメモリ(配列)の上限は2G...
おすすめ情報