
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Java Java 南京錠 2 2023/02/04 11:46
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
レコードセットの中身を配列に...
-
POSTリクエストの投げ方
-
配列のペースト出力結果の書式...
-
構造体配列の特定のメンバーをF...
-
定数配列の書き方
-
エクセルでXY座標に並べられた...
-
(VBA) 配列の文字列を昇順で並...
-
大量の変数を定義するにはどう...
-
countif/sumifのようなVBA関数
-
Excel2010のinputboxで複数デー...
-
エクセル VBAの処理速度について
-
構造体配列内の文字列検索のよ...
-
Redim とEraseの違いは?
-
VBAで配列引数を値渡しできない...
-
C#でbyte配列から画像を表示さ...
-
VBAでMODE関数をつくる
-
EXCELを使って、アクセスログを...
-
POSTデータの2次元配列
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
配列の中の最大値とそのインデ...
-
エクセルでXY座標に並べられた...
-
Dir関数で読み取り順を操作でき...
-
配列のペースト出力結果の書式...
-
COBOLの基本的な事なので...
-
複数のtextboxの処理を一括で行...
-
構造体配列の特定のメンバーをF...
-
大量の変数を定義するにはどう...
-
CheckBoxの配列化
-
Excelのメモリ(配列)の上限は2G...
-
VB6のメモリ解放に関して
-
ReDim PreserveよりもReDimが遅い
-
Excel2010のinputboxで複数デー...
-
定数配列の書き方
-
コンボボックスのインデックス...
-
EXCELを使って、アクセスログを...
-
レコードセットの中身を配列に...
おすすめ情報