Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5096 / 13646 ツリー ←次へ | 前へ→

【52620】OptionBaseステートメント MMG 07/11/21(水) 20:06 質問[未読]
【52621】Re:OptionBaseステートメント かみちゃん 07/11/21(水) 20:20 発言[未読]
【52623】Re:OptionBaseステートメント りん 07/11/21(水) 20:25 発言[未読]
【52625】Re:OptionBaseステートメント neptune 07/11/21(水) 20:38 発言[未読]
【52630】Re:OptionBaseステートメント Yumi 07/11/21(水) 21:49 お礼[未読]
【52641】Re:OptionBaseステートメント MMG 07/11/23(金) 13:54 質問[未読]
【52642】Re:OptionBaseステートメント neptune 07/11/23(金) 14:04 回答[未読]
【52658】Re:OptionBaseステートメント りん 07/11/24(土) 9:52 発言[未読]
【52660】Re:OptionBaseステートメント ichinose 07/11/24(土) 10:09 発言[未読]
【52662】Re:OptionBaseステートメント りん 07/11/24(土) 10:34 発言[未読]

【52620】OptionBaseステートメント
質問  MMG  - 07/11/21(水) 20:06 -

引用なし
パスワード
   OptionBaseステートメントが今一理解できません。
どのような時に有効に使えるのでしょうか?なるほどっと言うようなサンプルを
見ていないので、今一分かりません。
下のコードは、以前このサイトで見たものです。
ヘルプを見てもピンときません。
何か理解するためのヒントいただければ幸いです。どなたかよろしくお願い
いたします。

Option Base 1  

Sub Msgで日から土表示1()

Dim MyWeek, MyDay, msg
Dim i As Integer
MyWeek = Array("日", "月", "火", "水", "木", "金", "土")
 For i = 1 To 7
  MyDay = MyWeek(i)
  msg = msg & vbCrLf & MyDay
  MsgBox msg
 Next i

End Sub

【52621】Re:OptionBaseステートメント
発言  かみちゃん  - 07/11/21(水) 20:20 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>何か理解するためのヒントいただければ幸いです。

以下の記述の違いで何かおわかりになりますでしょうか?
「日」を表示したいときの MsgBox MyWeek(x) の使い方がポイントです。

'◆Module1
Option Base 0 '省略可

Sub Sample0()
 Dim MyWeek
 MyWeek = Array("日", "月", "火", "水", "木", "金", "土")
 MsgBox UBound(MyWeek)
 MsgBox MyWeek(0)
End Sub

'◆Module2
Option Base 1

Sub Sample1()
 Dim MyWeek
 MyWeek = Array("日", "月", "火", "水", "木", "金", "土")
 MsgBox UBound(MyWeek)
 MsgBox MyWeek(1)
End Sub

【52623】Re:OptionBaseステートメント
発言  りん E-MAIL  - 07/11/21(水) 20:25 -

引用なし
パスワード
   MMG さん、こんばんわ。

>何か理解するためのヒントいただければ幸いです。どなたかよろしくお願い
>いたします。

Bookに標準モジュールを二つ追加し、
片方に。
'=========================
Sub main()
  MsgBox test1, vbInformation, "Option Base 0"
  MsgBox test2, vbInformation, "Option Base 1"
End Sub
Function test1() As String
  '同じようにバリアントで宣言し、配列に。
  Dim dt As Variant
  dt = Array(1, 2)
  test1 = LBound(dt) & " to " & UBound(dt)
End Function
'=========================

もう一方に。
'=========================
Option Base 1
Function test2() As String
  '同じようにバリアントで宣言し、配列に。
  Dim dt As Variant
  dt = Array(1, 2)
  test2 = LBound(dt) & " to " & UBound(dt)
End Function
'=========================

これでMainを実行してみてください。
慣れたらどうってことない事ですが、インデックス値は0から始まるよりも1からの方がわかりやすいと思いませんか?

【52625】Re:OptionBaseステートメント
発言  neptune  - 07/11/21(水) 20:38 -

引用なし
パスワード
   ▼MMG さん:
こんにちは

>どのような時に有効に使えるのでしょうか?なるほどっと言うようなサンプルを
>見ていないので、今一分かりません。
配列の要素の添え字が0になったら困る時若しくは都合が悪い時。
cellsオブジェクトがそうですね。collectionも確かそうだったような。。。

但し、OptionBaseステートメントはVB(A)しかないので、もし、他の言語
等に手を出す可能性があるのなら、使わない方がややこしくないかも知れません。

実際問題、私は殆ど必要性は感じません。
dim a(1 to 10)・・・
と同じことですから。

MyWeek = Array("日", "月", "火", "水", "木", "金", "土")
 For i = 1 To 7
  MyDay = MyWeek(i)
  msg = msg & vbCrLf & MyDay
  MsgBox msg
 Next i

'Option Base 1 なしで
MyWeek = Array("日", "月", "火", "水", "木", "金", "土")
 For i = 0 To 6
  MyDay = MyWeek(i)
  msg = msg & vbCrLf & MyDay
  MsgBox msg
 Next i
でも問題はないですし。。。

【52630】Re:OptionBaseステートメント
お礼  Yumi  - 07/11/21(水) 21:49 -

引用なし
パスワード
   ▼かみちゃん さん りん さん neptune さん:

3名様のご返答有難うございました。
質問させていただき、こんなに素晴らしいコメントや回答を頂き、非常に
勉強になりました。感謝いたしています。
これからも、是非よろしくお願いします。
バイブルのような感じです。3名様をはじめichinose様他多くの方の
いつも素晴らしいコメントや回答を見させていただき、非常に励みに
なっています。  m(__)m 失礼します。

【52641】Re:OptionBaseステートメント
質問  MMG  - 07/11/23(金) 13:54 -

引用なし
パスワード
   ▼neptune さん:
質問させていただきます。

>実際問題、私は殆ど必要性は感じません。
>dim a(1 to 10)・・・
>と同じことですから。
>
>MyWeek = Array("日", "月", "火", "水", "木", "金", "土")
> For i = 1 To 7
>  MyDay = MyWeek(i)
>  msg = msg & vbCrLf & MyDay
>  MsgBox msg
> Next i
>も
>'Option Base 1 なしで
>MyWeek = Array("日", "月", "火", "水", "木", "金", "土")
> For i = 0 To 6
>  MyDay = MyWeek(i)
>  msg = msg & vbCrLf & MyDay
>  MsgBox msg
> Next i
>でも問題はないですし。。。


このコードで上の方ですが、エラーが出ました。
MyWeek = Array("", "日", "月", "火", "水", "木", "金", "土")
に変更すると、正しく動きました。
こんな考えで正しいのでしょうか?

【52642】Re:OptionBaseステートメント
回答  neptune  - 07/11/23(金) 14:04 -

引用なし
パスワード
   ▼MMG さん:

>>MyWeek = Array("日", "月", "火", "水", "木", "金", "土")
>> For i = 1 To 7
>>  MyDay = MyWeek(i)
>>  msg = msg & vbCrLf & MyDay
>>  MsgBox msg
>> Next i
>このコードで上の方ですが、エラーが出ました。
>MyWeek = Array("", "日", "月", "火", "水", "木", "金", "土")
>に変更すると、正しく動きました。
>こんな考えで正しいのでしょうか?
元々のサンプルコードが間違えていたんでしょうね。
Helpより
>Array 関数を使用して作成した配列のインデックスの最小値は、常に 0 です。
>ほかの種類の配列とは異なり、Option Base ステートメントに最小値を指定
>しても影響を受けません。

※HNを変えて質問するような行儀の悪いことは止めて下さい。
 特に、スレッドの途中でHNを変えるような行儀の悪いことは嫌いです。

【52658】Re:OptionBaseステートメント
発言  りん E-MAIL  - 07/11/24(土) 9:52 -

引用なし
パスワード
   おはようございます。

>>>MyWeek = Array("日", "月", "火", "水", "木", "金", "土")
>>> For i = 1 To 7
>>このコードで上の方ですが、エラーが出ました。

モジュールの先頭に、

 Option Base 1

を忘れてませんか?

>>MyWeek = Array("", "日", "月", "火", "水", "木", "金", "土")
>>に変更すると、正しく動きました。
>>こんな考えで正しいのでしょうか?
>元々のサンプルコードが間違えていたんでしょうね。
>Helpより
>>Array 関数を使用して作成した配列のインデックスの最小値は、常に 0 です。
>>ほかの種類の配列とは異なり、Option Base ステートメントに最小値を指定
>>しても影響を受けません。
え〜?
'//////////////////
Option Base 1
Sub test()
  Dim dt
  dt = Array(1, 2)
  MsgBox dt(1)
End Sub
'//////////////////
これで試すと、Base 1の時は1を、Base 0の時はちゃんと2を返しますけど・・・

>※HNを変えて質問するような行儀の悪いことは止めて下さい。
> 特に、スレッドの途中でHNを変えるような行儀の悪いことは嫌いです。
MMG さんとYUMIさんは同じ人だったのか。

【52660】Re:OptionBaseステートメント
発言  ichinose  - 07/11/24(土) 10:09 -

引用なし
パスワード
   皆さん、おはようございます。

>
>>>>MyWeek = Array("日", "月", "火", "水", "木", "金", "土")
>>>> For i = 1 To 7
>>>このコードで上の方ですが、エラーが出ました。
>
>モジュールの先頭に、
>
> Option Base 1
>
>を忘れてませんか?
>
>>>MyWeek = Array("", "日", "月", "火", "水", "木", "金", "土")
>>>に変更すると、正しく動きました。
>>>こんな考えで正しいのでしょうか?
>>元々のサンプルコードが間違えていたんでしょうね。
>>Helpより
>>>Array 関数を使用して作成した配列のインデックスの最小値は、常に 0 です。
>>>ほかの種類の配列とは異なり、Option Base ステートメントに最小値を指定
>>>しても影響を受けません。
>え〜?
>'//////////////////
>Option Base 1
>Sub test()
>  Dim dt
>  dt = Array(1, 2)
>  MsgBox dt(1)
>End Sub
>'//////////////////
>これで試すと、Base 1の時は1を、Base 0の時はちゃんと2を返しますけど・・・
Option Base 1
Sub test()
  Dim myarray As Variant
  myarray = VBA.Array(1, 2)
  MsgBox LBound(myarray) & "----" & UBound(myarray)
End Sub

とすると、確かに

>>>Array 関数を使用して作成した配列のインデックスの最小値は、常に 0 です。

となりますけどね!!

【52662】Re:OptionBaseステートメント
発言  りん E-MAIL  - 07/11/24(土) 10:34 -

引用なし
パスワード
   ichinose さん、おはようございます。

>  myarray = VBA.Array(1, 2)
>  MsgBox LBound(myarray) & "----" & UBound(myarray)
>とすると、確かに
>>>>Array 関数を使用して作成した配列のインデックスの最小値は、常に 0 です。
>となりますけどね!!

へー。

Arrayのヘルプのサンプル

Dim A As Variant
A = Array(10,20,30)
B = A(2)

これをそのまま試すと、
「Array 関数を使用して作成した配列のインデックスの最小値は、常に 0 です。ほかの種類の配列とは異なり、Option Base ステートメントに最小値を指定しても影響を受けません。」
この説明が大ウソになってますけどね。

InputBoxとは違って、他にArray関数(Application.Arrayとか)があるわけではないのに、なぜ挙動が違うんでしょうね。不思議。
でも、参考になりました。ありがとう>ichinoseさん

5096 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free