Excel VBA質問箱 IV

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

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


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

【15551】コレクションとインデックスの有効範囲 はっしー 04/6/29(火) 10:42 質問[未読]
【15552】Re:コレクションとインデックスの有効範囲 Asaki 04/6/29(火) 10:50 回答[未読]
【15554】Re:コレクションとインデックスの有効範囲 はっしー 04/6/29(火) 11:20 発言[未読]
【15556】Re:コレクションとインデックスの有効範囲 Asaki 04/6/29(火) 11:40 回答[未読]
【15557】Re:コレクションとインデックスの有効範囲 角田 04/6/29(火) 11:58 回答[未読]
【15560】Re:コレクションとインデックスの有効範囲 Asaki 04/6/29(火) 12:38 発言[未読]
【15561】Re:コレクションとインデックスの有効範囲 はっしー 04/6/29(火) 12:59 お礼[未読]
【15571】Re:コレクションとインデックスの有効範囲 角田 04/6/29(火) 16:37 回答[未読]
【15573】Re:コレクションとインデックスの有効範囲 はっしー 04/6/29(火) 16:58 お礼[未読]

【15551】コレクションとインデックスの有効範囲
質問  はっしー  - 04/6/29(火) 10:42 -

引用なし
パスワード
   いつもお世話になっております m(_ _)m。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=15105;id=excel
で、オブジェクトの配列化についてお尋ねしたのですが、おかげさまでご教示いただいたことを参考に問題の解決をすることができました。

ところで、ご教示いただいたことをあれこれ試している中でに、オブジェクトをコレクション化して、それを初期化するという事をしてみたのですが、初期化中に“インデックスが有効範囲にありません゛というエラーメッセージが出て、実行できなくなってしまいます。

以下そのコードです(変数の宣言は省略させてください)。

Private Sub UserForm_Initialize()

coluriage 'オブジェクトのコレクション化
iniuriage 'コレクション化したオブジェクトの初期化

End Sub

Private Sub coluriage() 

uriageintl3 = 0
  
For uriageintl3 = 10301 To 10616
  lbluriage.Add Controls("lbluriage" & uriageintl3)

  Select Case uriageintl3
    Case Is = 10316
      uriageintl3 = 10400
    Case Is = 10416
      uriageintl3 = 10500
    Case Is = 10516
      uriageintl3 = 10600
  End Select
    
Next uriageintl3

End Sub

Private Sub iniuriage()

uriageintl3 = 0

For uriageintl3 = 10301 To 10616 '☆売上合計ラベルの初期化
  lbluriage(uriageintl3).Caption = "" '☆☆☆ここで止まってしまいます
       
  Select Case uriageintl3
    Case Is = 10316
      uriageintl3 = 10400
    Case Is = 10416
      uriageintl3 = 10500
    Case Is = 10516
      uriageintl3 = 10600
  End Select
    
Next

End Sub


そこでお尋ねしたいのですが、インデックスが有効範囲にないとはつまりどういうことなのでしょうか?。またどのようにすればこのコードを実行することができるのでしょうか?。
どなたかご教示のほどよろしくお願いいたします(m;_ _)m。

【15552】Re:コレクションとインデックスの有効範囲
回答  Asaki  - 04/6/29(火) 10:50 -

引用なし
パスワード
   こんにちは。

>インデックスが有効範囲にありません
とは、指定したものがない場合に出ることが多いです。

>lbluriage(uriageintl3).Caption = "" '☆☆☆ここで止まってしまいます
ここだと、uriageintl3 番目(またはその名前)のラベルがない、という意味ですね。

ひょっとして、
lbluriage("lbluriage" & uriageintl3).Caption = "" 


【15554】Re:コレクションとインデックスの有効範囲
発言  はっしー  - 04/6/29(火) 11:20 -

引用なし
パスワード
   Asaki様、いつもお世話になっております m(_ _)m。

試してみたのですが、今度は“プロシージャの呼び出し、または引数が不正です”というエラーになってしまいました。

なかなか奥が深いようです・・・。

【15556】Re:コレクションとインデックスの有効範囲
回答  Asaki  - 04/6/29(火) 11:40 -

引用なし
パスワード
   とりあえず、coluriage 実行時に、きちんとAddされていることを確かめてみてください。
また、
>変数の宣言は省略させてください
とありますが、lbluriage はどのように宣言されていますか?

【15557】Re:コレクションとインデックスの有効範囲
回答  角田 WEB  - 04/6/29(火) 11:58 -

引用なし
パスワード
   こんにちは。
>ひょっとして、
>lbluriage("lbluriage" & uriageintl3).Caption = "" 
  ↓
 Controls("lbluriage" & uriageintl3).Caption = "" 
ですね。

【15560】Re:コレクションとインデックスの有効範囲
発言  Asaki  - 04/6/29(火) 12:38 -

引用なし
パスワード
   >>lbluriage("lbluriage" & uriageintl3).Caption = "" 
>  ↓
> Controls("lbluriage" & uriageintl3).Caption = "" 

あ〜、そういうことですか。
てっきり、lbluriage というモノで、実際のオブジェクトにアクセスできるようになっているのかと思っていました。
クラスが分かってない証拠です。m(_ _)m

【15561】Re:コレクションとインデックスの有効範囲
お礼  はっしー  - 04/6/29(火) 12:59 -

引用なし
パスワード
   Asaki様、角田様、たびたびありがとうございます。

>>Asaki様
宣言のプロシージャ-で
Private lbluriage As New Collection '売上ラベルのコレクション化
と宣言しております。

>>角田様
はい、私も実はそのやり方で解決いたしました。
それとは別にコレクション化を理解しようというわけで試してみたのですが、以前教えていただいた
http://www.h3.dion.ne.jp/~sakatsu/Breakthrough_P-Ctrl_Arrays.htm
のサイトを参考にコーディングしてみたのですが、うまくいかないのです(´_`。)。

また、いろいろと勉強しながら理解を深めていけたらと思います。
重ねて御礼申し上げます。ありがとうございました。

【15571】Re:コレクションとインデックスの有効範囲
回答  角田 WEB  - 04/6/29(火) 16:37 -

引用なし
パスワード
   こんにちは。
> lbluriage.Add Controls("lbluriage" & uriageintl3)
> lbluriage(uriageintl3).Caption = "" 
ラベル自体の名前の頭と、それのコレクションの名前が
同じだから紛らわしいんだ!

>For uriageintl3 = 10301 To 10616 '☆売上合計ラベルの初期化
>  lbluriage(uriageintl3).Caption = "" '☆☆☆ここで止まってしまいます
コレクションをIndex(数字)で指定する場合は、コレクションに
格納された順に「1〜」の番号で指定します。ですから
 10301 が 1番
 10302 が 2番
です。それで、どう考えても、1万個も登録していないですよね。だから
 ”インデックスが有効範囲にありません”
になります。

Add する時に、第2引数でキー(文字列)指定をすれば、そのキーで指定出来ます。

For uriageintl3 = 10301 To 10616
 lbluriage.Add Controls("lbluriage" & uriageintl3), CStr(uriageintl3)

For uriageintl3 = 10301 To 10616 '☆売上合計ラベルの初期化
  lbluriage(CStr(uriageintl3)).Caption = ""

【15573】Re:コレクションとインデックスの有効範囲
お礼  はっしー  - 04/6/29(火) 16:58 -

引用なし
パスワード
   角田様、たびたび恐れ入ります。

>コレクションをIndex(数字)で指定する場合は、コレクションに
>格納された順に「1〜」の番号で指定します。ですから
> 10301 が 1番
> 10302 が 2番
>です。それで、どう考えても、1万個も登録していないですよね。だから
> ”インデックスが有効範囲にありません”
>になります。

なるほど、いわれてみればまったくその通りです。
1万個も登録しておりません(笑)。
インデックスってそういう意味だったのですね、やっと理解できました。


>Add する時に、第2引数でキー(文字列)指定をすれば、そのキーで指定出来ます。
>
>For uriageintl3 = 10301 To 10616
> lbluriage.Add Controls("lbluriage" & uriageintl3), CStr(uriageintl3)
>
>For uriageintl3 = 10301 To 10616 '☆売上合計ラベルの初期化
>  lbluriage(CStr(uriageintl3)).Caption = ""


加えてこんな高等技術まで教えていただき、感謝感激しております(´▽`*)/ 。
まことにありがとうございました。

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