Excel VBA質問箱 IV

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

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


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

【53817】addItemについて ポポ 08/2/8(金) 10:37 質問[未読]
【53824】Re:addItemについて Jaka 08/2/8(金) 12:09 発言[未読]
【53828】Re:addItemについて ポポ 08/2/8(金) 14:08 発言[未読]
【53830】Re:addItemについて Jaka 08/2/8(金) 14:35 発言[未読]
【53834】Re:addItemについて VBWASURETA 08/2/8(金) 15:42 発言[未読]
【53838】Re:addItemについて ポポ 08/2/8(金) 17:10 お礼[未読]
【53833】Re:addItemについて VBWASURETA 08/2/8(金) 15:38 発言[未読]
【53839】Re:addItemについて ポポ 08/2/8(金) 17:26 質問[未読]
【53840】Re:addItemについて VBWASURETA 08/2/8(金) 18:06 質問[未読]
【53857】Re:addItemについて ポポ 08/2/12(火) 9:40 発言[未読]
【53859】Re:addItemについて VBWASURETA 08/2/12(火) 10:00 回答[未読]
【53862】Re:addItemについて ポポ 08/2/12(火) 10:34 発言[未読]
【53863】Re:addItemについて VBWASURETA 08/2/12(火) 10:42 回答[未読]
【53865】Re:補足 VBWASURETA 08/2/12(火) 11:13 発言[未読]
【53866】Re:補足 ポポ 08/2/12(火) 11:59 お礼[未読]
【53867】Re:補足 VBWASURETA 08/2/12(火) 13:46 発言[未読]
【53869】Re:補足 ポポ 08/2/12(火) 16:10 質問[未読]
【53872】Re:補足 VBWASURETA 08/2/12(火) 18:28 質問[未読]
【53874】修正しましたが・・・ ポポ 08/2/13(水) 9:28 質問[未読]
【53877】Re:修正しましたが・・・ VBWASURETA 08/2/13(水) 13:10 回答[未読]
【53883】Re:修正しましたが・・・ VBWASURETA 08/2/13(水) 17:02 質問[未読]
【53886】Re:修正しましたが・・・ ポポ 08/2/13(水) 18:10 発言[未読]
【53897】Re:修正しましたが・・・ VBWASURETA 08/2/14(木) 9:45 回答[未読]
【53905】Re:修正しましたが・・・ ポポ 08/2/14(木) 11:30 お礼[未読]
【53910】Re:修正しましたが・・・ VBWASURETA 08/2/14(木) 14:34 発言[未読]
【53912】ありがとうございます ポポ 08/2/14(木) 15:49 お礼[未読]
【53858】Re:addItemについて Jaka 08/2/12(火) 9:43 発言[未読]
【53864】Re:addItemについて ポポ 08/2/12(火) 10:45 発言[未読]

【53817】addItemについて
質問  ポポ  - 08/2/8(金) 10:37 -

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

今まで動いていたんですが、読込みエラーになってしまい、作り直しています。
で、以前は問題なかったもので、同じ命令文にしたのですが、エラーになるため、
参考書を参考に作り直しました。でも”型が一致しません”とエラーがでてしまいます。どこがいけないのか、どうすれば対処できるのか教えてください。お願いします。

worksheets("品種")にA1:D1にはコンボボックス(ここでは"区分”)に入る値
それに関連してcells(.row.count,i).End(xlUp).Rowまでリストが作成してあります。
コンボ”区分”で選択した値から関連のあるリストの列をcomboBox1に表示して選択するユーザーフォームを作成しています。

区分1  区分2  区分3    実際にはA1:D1まで4種類あります
リスト1  リスト2-1  リスト3-1
リスト2  リスト2-2  リスト3-2
リスト3       リスト3-3    ←こんな感じのリストがworksheets("品種")にある
リスト4

以前の命令文:
'区分表示
Private Sub UserForm_Initialize()
  With Worksheets("品種")
    Da = Range("A1").CurrentRegion.Value
    For i = 2 To .Range("A1").End(xlToRight).Column
      Me.区分.AddItem Da(1, i)
    Next i
  End With

End Sub

'品種表示
Private Sub 区分_Change()    ↓Comboboxは3つあるので、同じ命令文が
'品種名1             あと二つつきます(ComboBoxの名称は変更) 
  'Me.区分.Clear        
  With Worksheets("品種")
    For i = 1 To .Range("A1").End(xlToRight).Column
      If Me.区分.Value = Da(1, i) Then
        For ii = 2 To Cells(Rows.Count, i).End(xlUp).Row
          Me.ComboBox1.AddItem Da(ii, i)
        Next ii
        Exit For
      End If
    Next i
  End With

End Sub

変更後:
currentRegionは空白のあるリストということでAの列と行を空白にしました。

'区分表示
Private Sub UserForm_Initialize()
  With Worksheets("品種")
    Da = Range("B2").CurrentRegion.Value
    For i = 2 To .Range("B2").End(xlToRight).Column
      Me.区分.AddItem Da(2, i)
    Next i
  End With

End Sub

'品種表示
Private Sub 区分_Change()
'品種名1
  'Me.区分.Clear
  With Worksheets("品種")
    For i = 2 To .Range("B2").End(xlToRight).Column
      If Me.区分.Value = Da(2, i) Then
        For ii = 3 To Cells(Rows.Count, i).End(xlUp).Row
          Me.ComboBox1.AddItem Da(ii, i)
        Next ii
        Exit For
      End If
    Next i
  End With
End Sub

【53824】Re:addItemについて
発言  Jaka  - 08/2/8(金) 12:09 -

引用なし
パスワード
    ぱっとしてしか見てないけど、気づいたとこだけ。

>'品種表示
>Private Sub 区分_Change()    ↓Comboboxは3つあるので、同じ命令文が
>'品種名1             あと二つつきます(ComboBoxの名称は変更) 
>  'Me.区分.Clear        
>  With Worksheets("品種")
>    For i = 1 To .Range("A1").End(xlToRight).Column
>      If Me.区分.Value = Da(1, i) Then
>        For ii = 2 To Cells(Rows.Count, i).End(xlUp).Row
                 ↑
               このCellsってどこのCells??

>          Me.ComboBox1.AddItem Da(ii, i)
>        Next ii
>        Exit For
>      End If
>    Next i
>  End With
>
>End Sub

【53828】Re:addItemについて
発言  ポポ  - 08/2/8(金) 14:08 -

引用なし
パスワード
   ▼Jaka さん:
返信ありがとうございます。
区分で選択した値の下にあるリストの値全部です。例えばRange("A1")の値が区分で
選ばれていたら、その下のcells(2.1)から値のあるcolumnまでです。


> ぱっとしてしか見てないけど、気づいたとこだけ。
>
>>'品種表示
>>Private Sub 区分_Change()    ↓Comboboxは3つあるので、同じ命令文が
>>'品種名1             あと二つつきます(ComboBoxの名称は変更) 
>>  'Me.区分.Clear        
>>  With Worksheets("品種")
>>    For i = 1 To .Range("A1").End(xlToRight).Column
>>      If Me.区分.Value = Da(1, i) Then
>>        For ii = 2 To Cells(Rows.Count, i).End(xlUp).Row
>                 ↑
>               このCellsってどこのCells??
>
>>          Me.ComboBox1.AddItem Da(ii, i)
>>        Next ii
>>        Exit For
>>      End If
>>    Next i
>>  End With
>>
>>End Sub

【53830】Re:addItemについて
発言  Jaka  - 08/2/8(金) 14:35 -

引用なし
パスワード
   ▼ポポ さん:
>区分で選択した値の下にあるリストの値全部です。例えばRange("A1")の値が区分で
>選ばれていたら、その下のcells(2.1)から値のあるcolumnまでです。
え〜と、そういう意味ではなく

>>>    For i = 1 To .Range("A1").End(xlToRight).Column
            ↑
          ちゃんと指定あるのに

>>>      If Me.区分.Value = Da(1, i) Then
>>>        For ii = 2 To Cells(Rows.Count, i).End(xlUp).Row
>>                ↑
>>             このCellsってどこのシートのCells??

【53833】Re:addItemについて
発言  VBWASURETA  - 08/2/8(金) 15:38 -

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

こんにちは

自分が気になったところについてですが。

>    Da = Range("A1").CurrentRegion.Value

>    Da = Range("B2").CurrentRegion.Value

この2箇所こはRange前に「.」って無くても良いのでしょうか?

【53834】Re:addItemについて
発言  VBWASURETA  - 08/2/8(金) 15:42 -

引用なし
パスワード
   ▼ポポ さん、Jaka さん:

こんにちは。
jakaさんが言っているのは多分、前にSheet指定がないと
どのシートを見るかわかりませんよという意味です。

実際指定していないと、ActiveSheet見るわけではないようです。
よって正しい.End(xlUp).Rowが取得できていない可能性が多いにあります。

【53838】Re:addItemについて
お礼  ポポ  - 08/2/8(金) 17:10 -

引用なし
パスワード
   ▼VBWASURETA さん,Jakaさん

あ、そういうことだったんですね。.の有る無しの意味がよくわかっていませんでした。.をつけないとActivesheetをみてくれないんですね。前回も教わりながらやったので理解にかけていました。ありがとうございます。

>▼ポポ さん、Jaka さん:
>
>こんにちは。
>jakaさんが言っているのは多分、前にSheet指定がないと
>どのシートを見るかわかりませんよという意味です。
>
>実際指定していないと、ActiveSheet見るわけではないようです。
>よって正しい.End(xlUp).Rowが取得できていない可能性が多いにあります。

【53839】Re:addItemについて
質問  ポポ  - 08/2/8(金) 17:26 -

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

すみません。つけてやってみました。
でも今度は
'区分表示
Private Sub UserForm_Initialize()
  With Worksheets("品種")
    Da = .Range("B2").CurrentRegion.Value
    For i = 2 To .Range("B2").End(xlToRight).Column
      Me.区分.AddItem Da(2, i)
    Next i
  End With

End Sub

で”インデックスが有効範囲にありません”と出てしまいます。
これだと区分だけでなく、リスト全部を選んでしまうのでしょうか?
>▼ポポ さん:
>
>こんにちは
>
>自分が気になったところについてですが。
>
>>    Da = Range("A1").CurrentRegion.Value
>
>>    Da = Range("B2").CurrentRegion.Value
>
>この2箇所こはRange前に「.」って無くても良いのでしょうか?

【53840】Re:addItemについて
質問  VBWASURETA  - 08/2/8(金) 18:06 -

引用なし
パスワード
   ちょっと以下のところだけ実行してウォッチでDa配列を取ってみました。
それで見るとしたいことがいまいちわからないです。

>Private Sub UserForm_Initialize()
>  With Worksheets("品種")
>    Da = Range("A1").CurrentRegion.Value
>    For i = 2 To .Range("A1").End(xlToRight).Column
>      Me.区分.AddItem Da(1, i)
>    Next i
>  End With
>End Sub

----Da配列取得内容----
Da(1,1) : "区分1"
Da(1,2) : "区分2"
Da(1,3) : "区分3"

Da(2,1) : "リスト1"
Da(2,2) : "リスト2-1"
Da(2,3) : "リスト3-1"

Da(3,1) : "リスト2"
Da(3,2) : "リスト2-2"
Da(3,3) : "リスト3-2"

Da(4,1) : "リスト3"
Da(4,2) : "リスト3-3"
Da(4,3) : Empty 値
-----------------


で、結果としては以下の感じでしたよ?
ん?と思う結果ですよね。
因みにポポ さんが書かれてますサンプルデータでしてます。


----処理結果----
Da(1,2) : "区分2"
Da(1,3) : "区分3"
------------------


で、よくわからないのがi = 2 からなのは何故でしょう?

>    For i = 2 To .Range("A1").End(xlToRight).Column
>      Me.区分.AddItem Da(1, i)
>    Next i

【53857】Re:addItemについて
発言  ポポ  - 08/2/12(火) 9:40 -

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

ちょっと修正したのと混ざってしまいました。
CurrentRegionがアクティブセル領域ということだったので、Range("A1")を
Range("B2")に変更したんです。i=2はその関係です。Rangeは("B2")です。

えっと、コンボボックスで区分を選択して、その区分で選んだもののリストを次のコンボボックスに表示させたいのです。下記の命令文では区分1〜3のみを表示させたいんです。


>ちょっと以下のところだけ実行してウォッチでDa配列を取ってみました。
>それで見るとしたいことがいまいちわからないです。
>
>>Private Sub UserForm_Initialize()
>>  With Worksheets("品種")
>>    Da = Range("A1").CurrentRegion.Value
>>    For i = 2 To .Range("A1").End(xlToRight).Column
>>      Me.区分.AddItem Da(1, i)
>>    Next i
>>  End With
>>End Sub
>
>----Da配列取得内容----
>Da(1,1) : "区分1"
>Da(1,2) : "区分2"
>Da(1,3) : "区分3"
>
>Da(2,1) : "リスト1"
>Da(2,2) : "リスト2-1"
>Da(2,3) : "リスト3-1"
>
>Da(3,1) : "リスト2"
>Da(3,2) : "リスト2-2"
>Da(3,3) : "リスト3-2"
>
>Da(4,1) : "リスト3"
>Da(4,2) : "リスト3-3"
>Da(4,3) : Empty 値
>-----------------
>
>
>で、結果としては以下の感じでしたよ?
>ん?と思う結果ですよね。
>因みにポポ さんが書かれてますサンプルデータでしてます。
>
>
>----処理結果----
>Da(1,2) : "区分2"
>Da(1,3) : "区分3"
>------------------
>
>
>で、よくわからないのがi = 2 からなのは何故でしょう?
>
>>    For i = 2 To .Range("A1").End(xlToRight).Column
>>      Me.区分.AddItem Da(1, i)
>>    Next i

【53858】Re:addItemについて
発言  Jaka  - 08/2/12(火) 9:43 -

引用なし
パスワード
   ▼ポポ さん:
>で”インデックスが有効範囲にありません”と出てしまいます。
>これだと区分だけでなく、リスト全部を選んでしまうのでしょうか?
問題は、
>    Da = .Range("B2").CurrentRegion.Value
>    For i = 2 To .Range("B2").End(xlToRight).Column
の違い。
簡単に書くと、
B2:B5全部になにかしら入っている。
1つ飛ばして
B7:B10全部になにかしら入っている。
C1:C10全部になにかしら入っている。
この状態で、
Range("B2").CurrentRegion.select
Msgbox Range("B2").End(xlToRight).Column
を実行しください。
違いが解ります。
データ状態がどうなっているのか解らないけど、
この辺を把握されてますか?

【53859】Re:addItemについて
回答  VBWASURETA  - 08/2/12(火) 10:00 -

引用なし
パスワード
   ▼ポポ さん:
>▼VBWASURETA さん:
>
>ちょっと修正したのと混ざってしまいました。
>CurrentRegionがアクティブセル領域ということだったので、Range("A1")を
>Range("B2")に変更したんです。i=2はその関係です。Rangeは("B2")です。

こんにちは。

説明が下手ですみません。言いたかった事は

Daという配列はDa(1,1)から取っているのは上記に書いてますよね?

それをi=2にするということは配列Da(1,2)から開始される
ということになりすよね?

ずらしたとしても素数の開始位置が2から開始されると
B列から開始したとしてサンプルデータ列は4列あることになります。
素数はDa(1,3)までしかないのでDa(1,4)はエラーになりますよね?
ということです。

この説明でわかりますか?

【53862】Re:addItemについて
発言  ポポ  - 08/2/12(火) 10:34 -

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

配列Da(1,2)から!!あ!!Cell(1,2)になるわけではないのですね!!
思いっきり間違えていました。

B列から開始したとしてサンプルデータ列は4列あることになります。
???
えっと、4列になってしまうのですか???
ごめんなさい全然わからなくって。。

>
>Daという配列はDa(1,1)から取っているのは上記に書いてますよね?
>
>それをi=2にするということは配列Da(1,2)から開始される
>ということになりすよね?
>
>ずらしたとしても素数の開始位置が2から開始されると
>B列から開始したとしてサンプルデータ列は4列あることになります。
>素数はDa(1,3)までしかないのでDa(1,4)はエラーになりますよね?
>ということです。
>
>この説明でわかりますか?

【53863】Re:addItemについて
回答  VBWASURETA  - 08/2/12(火) 10:42 -

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

4列というのは

.Range("A1").End(xlToRight).Column

がシートの列最後の列数を取ることになります。
End(xlToRight).Column は
A列はないですが列最後を取るので4が入っています。


2      3    4 ←列最後
B列   C列    D列
区分1  区分2  区分3
リスト1  リスト2-1  リスト3-1
リスト2  リスト2-2  リスト3-2
リスト3       リスト3-3 
リスト4


配列とシート最大列の違いがあるので、エラーになりますよ
ってことです。

【53864】Re:addItemについて
発言  ポポ  - 08/2/12(火) 10:45 -

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

一応その違いは把握しているつもりというか、これを書いた後にわかったのですが、エラーがどうしてでてしまうのかがわからないんです。以前は動いていたのに。。。

>▼ポポ さん:
>>で”インデックスが有効範囲にありません”と出てしまいます。
>>これだと区分だけでなく、リスト全部を選んでしまうのでしょうか?
>問題は、
>>    Da = .Range("B2").CurrentRegion.Value
>>    For i = 2 To .Range("B2").End(xlToRight).Column
>の違い。
>簡単に書くと、
>B2:B5全部になにかしら入っている。
>1つ飛ばして
>B7:B10全部になにかしら入っている。
>C1:C10全部になにかしら入っている。
>この状態で、
>Range("B2").CurrentRegion.select
>Msgbox Range("B2").End(xlToRight).Column
>を実行しください。
>違いが解ります。
>データ状態がどうなっているのか解らないけど、
>この辺を把握されてますか?

【53865】Re:補足
発言  VBWASURETA  - 08/2/12(火) 11:13 -

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

因みに

>    Da = .Range("B2").CurrentRegion.Value

のDaはセルオブジェクトではないです。

Da(1 to 4,1 to 3)

という二次元配列になります。

Rangeから連続で存在しているデータをDa配列に入れているようです。
なので、最初の

>    Da = .Range("B1").CurrentRegion.Value

だけで全部データ取得できているようですね。
これも上記のDa取得一覧に書いてますが^^;
ということはDaをグローバル変数にして
最初に取得すれば後はDa配列のセットし直しだけで
できそうですね。

【53866】Re:補足
お礼  ポポ  - 08/2/12(火) 11:59 -

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

すみません。何度も何度もありがとうございます。
やっと理解できました。配列理解しないで使っていたんですね。勉強し直します
m(__)m

ほんとにありがとうございました!!
>▼ポポ さん:
>
>因みに
>
>>    Da = .Range("B2").CurrentRegion.Value
>
>のDaはセルオブジェクトではないです。
>
>Da(1 to 4,1 to 3)
>
>という二次元配列になります。
>
>Rangeから連続で存在しているデータをDa配列に入れているようです。
>なので、最初の
>
>>    Da = .Range("B1").CurrentRegion.Value
>
>だけで全部データ取得できているようですね。
>これも上記のDa取得一覧に書いてますが^^;
>ということはDaをグローバル変数にして
>最初に取得すれば後はDa配列のセットし直しだけで
>できそうですね。

【53867】Re:補足
発言  VBWASURETA  - 08/2/12(火) 13:46 -

引用なし
パスワード
   ▼ポポ さん:
一応サンプルを書いてみます。
わからないところがあれば教えて下さい。


Dim Da As Variant '保持用にSub外に宣言

'最初のコンボリストセット関数
Private Sub UserForm_Initialize1()

  'コンボボックスのリストクリア
  ComboBox1.Clear
  
  With Worksheets(1)
    'Da配列にシートB1〜D5までのデータを2次元配列にセット
    Da = .Range("B1").CurrentRegion.Value

    'Da配列には値がセットされているか判定なければ関数から抜ける
    If (IsEmpty(Da)) Then Exit Sub
  
    'UBound(Da, 2)はDa2二元配列の要素2つ目の最大値にあたるDa(1,この部分の要素最大値)
    'つまりサンプルでは3の値になる。
    For i = 1 To UBound(Da, 2)
      'Da(1, 1 to 3) までをリストにセット
      ComboBox1.AddItem Da(1, i)
    Next i
  End With
End Sub

'次のコンボリストセット関数
Private Sub UserForm_Initialize2()

  'コンボボックスのリストをクリアする
  ComboBox2.Clear
  
  With Worksheets(1)
   
    'Da配列には値がセットされているか判定なければ関数から抜ける
    'UserForm_Initialize1の関数を通らずに先に入った場合はこの関数から抜ける
    If (IsEmpty(Da)) Then Exit Sub
    
    'Da配列にはUserForm_Initialize1で値がセットされて
    '保持されているので取得は不要
    
    'UBound(Da, 2)はDa2二元配列の要素2つ目の最大値にあたるDa(1,この部分の要素最大値)
    'つまりサンプルでは3の値になる。
    For i = 1 To UBound(Da, 2)
      
      'Da(2, 1 to 3) までをリストにセットする
      ComboBox1.AddItem Da(2, i)
    Next i
  End With
End Sub

【53869】Re:補足
質問  ポポ  - 08/2/12(火) 16:10 -

引用なし
パスワード
   ▼VBWASURETA さん:
サンプルくださってありがとうございます。とてもよくわかりました。

一つ質問なのですが、
Private Sub UserForm_Initialize1()
このInitializeを、1と2に分けていますが、これだと動かないんですけど、
私のPCがおかしいのでしょうか?
それとも
Combobox2の方は、Sub Combobox1_Change()に命令文を書けばいいのでしょうか?

>▼ポポ さん:
>一応サンプルを書いてみます。
>わからないところがあれば教えて下さい。
>
>
>Dim Da As Variant '保持用にSub外に宣言
>
>'最初のコンボリストセット関数
>Private Sub UserForm_Initialize1()
>
>  'コンボボックスのリストクリア
>  ComboBox1.Clear
>  
>  With Worksheets(1)
>    'Da配列にシートB1〜D5までのデータを2次元配列にセット
>    Da = .Range("B1").CurrentRegion.Value
>
>    'Da配列には値がセットされているか判定なければ関数から抜ける
>    If (IsEmpty(Da)) Then Exit Sub
>  
>    'UBound(Da, 2)はDa2二元配列の要素2つ目の最大値にあたるDa(1,この部分の要素最大値)
>    'つまりサンプルでは3の値になる。
>    For i = 1 To UBound(Da, 2)
>      'Da(1, 1 to 3) までをリストにセット
>      ComboBox1.AddItem Da(1, i)
>    Next i
>  End With
>End Sub
>
>'次のコンボリストセット関数
>Private Sub UserForm_Initialize2()
>
>  'コンボボックスのリストをクリアする
>  ComboBox2.Clear
>  
>  With Worksheets(1)
>   
>    'Da配列には値がセットされているか判定なければ関数から抜ける
>    'UserForm_Initialize1の関数を通らずに先に入った場合はこの関数から抜ける
>    If (IsEmpty(Da)) Then Exit Sub
>    
>    'Da配列にはUserForm_Initialize1で値がセットされて
>    '保持されているので取得は不要
>    
>    'UBound(Da, 2)はDa2二元配列の要素2つ目の最大値にあたるDa(1,この部分の要素最大値)
>    'つまりサンプルでは3の値になる。
>    For i = 1 To UBound(Da, 2)
>      
>      'Da(2, 1 to 3) までをリストにセットする
>      ComboBox1.AddItem Da(2, i)
>    Next i
>  End With
>End Sub

【53872】Re:補足
質問  VBWASURETA  - 08/2/12(火) 18:28 -

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

>Private Sub UserForm_Initialize1()
>このInitializeを、1と2に分けていますが、これだと動かないんですけど、
>私のPCがおかしいのでしょうか?
>それとも
>Combobox2の方は、Sub Combobox1_Change()に命令文を書けばいいのでしょうか?

この関数名はあくまでサンプルです。リストが複数あるということで
複数の関数に別けています。

初期化時のイベントにいれるのであればInitializeに変えて貰えば
良いかと思います。

後気になったのですけど、この処理をChangeイベントに別けて
入れてますが意味があるのでしょうか?
AddItemメソッドはただリストに値を追加する機能で、
リストを切り替えるようなのではないと思いますが?

【53874】修正しましたが・・・
質問  ポポ  - 08/2/13(水) 9:28 -

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

 そうですよね、changeではないかと思ったんですが、以前教えていただいたときにこのようになっていたのでいいのかと(^^;)

 あとこれに基づき作り直してみました。でもif 区分.Value = Da(1,j) Then
のところのがインデックスの有効範囲内ではありませんのエラーになってしまいます。 ここで区分のComboboxで表示したものに基づき選択した列のリストを表示したいんです。どう表現したらいいのでしょうか?

'変数宣言セクション
Dim j As Integer
Dim i As Long
Dim Da As Variant

'区分表示
Private Sub UserForm_Initialize()
  Me.区分.Clear
  With Worksheets("品種")
  
    Da = .Range("B1").CurrentRegion.Value
    If (IsEmpty(Da)) Then
      Exit Sub
    End If
      For j = 1 To UBound(Da, 2)
        区分.AddItem Da(1, j)
      Next j
  End With


'品種名1
  Me.ComboBox1.Clear
  With Worksheets("品種")
  
    If (IsEmpty(Da)) Then
      Exit Sub
    End If
    If 区分.Value = Da(1, j) Then ←ここです!!
      For j = 1 To UBound(Da, 2)
        For i = 2 To .Cells(.Rows.Count, j).End(xlUp).Row
          ComboBox1.AddItem Da(i, j)
        Next i
      Next j
    End If
  End With
End Sub

【53877】Re:修正しましたが・・・
回答  VBWASURETA  - 08/2/13(水) 13:10 -

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

こんにちは。

おなじような間違えをしやすいようなので
説明します。

まず、何故エラーになるかは

Da(1, j)

です。

jの中身とかMsgboxなり確認されましたか?
試しにif分岐前に

Msgbox j

にしてみてください
恐らくj=4なのでしょうね。

Da(1, 4)

という配列は存在しないからですね。

何故そいう値が入っているかというと
最初の

 For j = 1 To UBound(Da, 2)
   区分.AddItem Da(1, j)
 Next j

この最初のループで3回回ってjに4の値が入ったことで
ループで抜け出ているからです。


恐らく、Da配列がどいう持ち方をしているか
いまいちわからないようですね。

>----Da配列取得内容----
>Da(1,1) : "区分1"
>Da(1,2) : "区分2"
>Da(1,3) : "区分3"
>
>Da(2,1) : "リスト1"
>Da(2,2) : "リスト2-1"
>Da(2,3) : "リスト3-1"
>
>Da(3,1) : "リスト2"
>Da(3,2) : "リスト2-2"
>Da(3,3) : "リスト3-2"
>
>Da(4,1) : "リスト3"
>Da(4,2) : "リスト3-3"
>Da(4,3) : Empty 値
>-----------------

前にも書きましたがこいう持ち方をしています。
ですので、

最初のコンボリストに追加分
>Da(1,1) : "区分1"
>Da(1,2) : "区分2"
>Da(1,3) : "区分3"

2番目のコンボリストに追加分
>Da(2,1) : "リスト1"
>Da(2,2) : "リスト2-1"
>Da(2,3) : "リスト3-1"

3番目のコンボリストに追加分
>Da(3,1) : "リスト2"
>Da(3,2) : "リスト2-2"
>Da(3,3) : "リスト3-2"

4番目のコンボリストに追加分
>Da(4,1) : "リスト3"
>Da(4,2) : "リスト3-3"
>Da(4,3) : Empty 値


と書けばわかり易いでしょうか?


因みに選択されているリストを見るには.ListIndexです。
現在選択されているリスト位置を他のコンボボックスも
変える場合以下のような感じです。

Dim cmbindex As Integer

Private Sub ComboBox1_Change()
  cmbindex = ComboBox1.ListIndex
  ComboBox2.ListIndex = IIf(ComboBox1.ListCount = 0, -1, cmbindex)
End Sub

【53883】Re:修正しましたが・・・
質問  VBWASURETA  - 08/2/13(水) 17:02 -

引用なし
パスワード
   ちょっと訂正です。


Private Sub ComboBox1_Change()
  cmbindex = ComboBox1.ListIndex
  ComboBox2.ListIndex = IIf(ComboBox1.ListCount = 0, -1, cmbindex)
End Sub



Private Sub ComboBox1_Change()
  cmbindex = ComboBox1.ListIndex
  ComboBox2.ListIndex = IIf(ComboBox1.ListCount < cmbindex, -1, cmbindex)
End Sub

に訂正です


後、Da配列の内容書いてますので、
どのようなリストの取り方をしたいのか教えてもらえますか?

ソースを見て何となくですがこんな感じにしたいのかなっと
予想ぐらいでしかわかりません。


○区分のコンボボックス追加リスト
 Da(1, 1)    区分1
 Da(1, 2)    区分2
 Da(1, 3)    区分3

○ComboBox1のコンボボックス追加リスト
 Da(2, 3)    リスト3-1
 Da(3, 3)    リスト3-2
--以降Empty値のため追加しない--
 Da(4, 3)    Empty 値    
 Da(5, 3)    Empty 値

【53886】Re:修正しましたが・・・
発言  ポポ  - 08/2/13(水) 18:10 -

引用なし
パスワード
   ▼VBWASURETA さん:
ありがとうございます。今教えていただいたLisIndexをみていたんですが、表示できなくてパニクッてました。

今訂正されたのはこの後みておきます。
とりあえず私がやりたいのは

区分のコンボボックス
Da(1,1): 区分1
Da(1,2): 区分2
Da(1,3): 区分3

区分のコンボボックスで区分1を選択した場合
Da(2,1):リスト1
Da(3,1):リスト2
Da(4,1):リスト3
(実際はリストが54まであります)
Combobox1にリストを1〜54までを表示

区分のコンボボックスで区分2を選択した場合
Da(2,2):リスト2-1
Da(3,2):リスト2-2
Da(4,2):リスト2-3
(実際はリストが22まであります)
Combobox1にリストを1〜22までを表示

区分のコンボボックスで区分3を選択した場合
Da(2,3):リスト3-1
Da(3,3):リスト3-2
Da(4,3):リスト3-3
(実際はリストが24まであります)
Combobox1にリストを1〜24までを表示

このように区分の選択によって、Combobox1で表示させる内容を変えたいのです。
説明がわかりづらくてスミマセンでしたm(_ _)m

【53897】Re:修正しましたが・・・
回答  VBWASURETA  - 08/2/14(木) 9:45 -

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

それであればこんな感じで良い気がします。

'データ保持配列定義
Dim Da As Variant

'フォーム初期化時に区分コンボボックスへリスト追加
Private Sub UserForm_Initialize()
  Dim i As Integer
  '最初に区分コンボボックスのリストを全て消す
  区分.Clear
  With Worksheets(1)
    'シートの連続データ(B1からD5まで)を配列に入れる
    Da = .Range("B1").CurrentRegion.Value
    
    'Da配列が何も入っていない場合はSubから抜ける
    If (IsEmpty(Da)) Then Exit Sub
    
    'UBound(Da, 2)はDa( 1, ここの素数最大値 )
    For i = 1 To UBound(Da, 2)
      'Da配列に入っているデータをリストに追加
      区分.AddItem Da(1, i)
    Next i
  End With
End Sub

'区分コンボボックスのリスト選択と同時にComboBox1のリスト追加
Private Sub 区分_Change()
  Dim DaIndex As Integer
  Dim i As Integer
  'リストが選択されていないもしくは、配列の中身がない場合はSubから抜ける
  '初期処理に入ってから抜けるようにしても良いかもです
  If (区分.ListIndex = -1 Or IsEmpty(Da)) Then Exit Sub
    
  '最初にComboBox1コンボボックスのリストを全て消す
  ComboBox1.Clear
  
  '選択されたIndexを保持。+1はDa配列の素数とあわせるため
  DaIndex = 区分.ListIndex + 1
  
  'UBound(Da, 1)はDa( ここの素数最大値 ,1 )
  For i = 2 To UBound(Da, 1)
    'Da配列の中身がある場合に入る条件
    If Not (IsEmpty(Da(i, DaIndex)) Or Da(i, DaIndex) = "") Then
      '先ほど保持したIndexはDa配列の2番目の素数として使う
      ComboBox1.AddItem Da(i, DaIndex)
    End If
  Next i
End Sub

【53905】Re:修正しましたが・・・
お礼  ポポ  - 08/2/14(木) 11:30 -

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

 UBound(Da,1)とUBound(Da,2)の1,2がよくわかっていなかったので、調べていて御礼が遅くなりました。(↑納得しました)

完璧でした(^-^)o あまりにも理解しない私に優しく教えてくださって本当に感謝しています。ありがとうございましたm(_ _)m
これからもめげずに頑張ります!!

【53910】Re:修正しましたが・・・
発言  VBWASURETA  - 08/2/14(木) 14:34 -

引用なし
パスワード
   一応説明しておきます。

UBound関数で配列の数を取得が出来ます。
以下のような1元配列の場合は、指定しなくても
取得ができます。

Dim a(10)
Dim Cnt as Integer

Cnt = UBound(a) 'Cntには値:10が入ります。


で最大配列数が取得できますが、
次のような2次元配列となった場合は指定が必要です。

Dim b(0 to 10, 0 to 5)
Dim xCnt as Integer
Dim yCnt as Integer

'配列1つ目の素数最大値を指定する場合
xCnt = UBound(b, 1) 'xCntには値:10

'配列2つ目の素数最大値を指定する場合
yCnt = UBound(b, 2) 'yCntには値:5

3次元配列とかも指定すれば可能です。

【53912】ありがとうございます
お礼  ポポ  - 08/2/14(木) 15:49 -

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

おお!!他で調べるより一番わかりやすかったです。。

全てにおいて思いっきり参考になりました。
ありがとうございましたm(_ _)m

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