Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
リストボックス.List(i,j)での列数制限
投稿日時: 24/04/26 22:52:09
投稿者: シュークリーム

リストボックスへの追加で.List(i,j) = では、
なぜかj=9(10列目)までしか追加できません。
仕様なんでしょうかね?
解決策というよりは、他の方もそうなのか知りたい。

回答
投稿日時: 24/04/27 06:02:43
投稿者: simple

ListBoxの設定できる列数に10列までといった制限はありません。確認済みです。
 
"追加"の意味が曖昧で、単なる値の設定ということなのか、
途中で列を拡張したということなのか不明です。
他の方もそうなのか、と言われても、
あなたがどんなことをされたのかもう少し具体的に説明されないと判断できません。
 
・どんなコードで、どのような処理を行っているのか、
・具体的なエラーメッセージは何か
を示されたほうがよいと思います。

投稿日時: 24/04/27 10:19:15
投稿者: シュークリーム

Sub Macro1()
    Dim i As Long
      
    ' 列数を20に設定
    ListBox1.ColumnCount = 20
      
    ' 1行目に空の要素を追加
    ListBox1.AddItem ""
      
    ' ループでリストボックスの最初の行に1から20までの値を設定
    For i = 0 To 19
        ListBox1.List(0, i) = i + 1
    Next i
End Sub
  
上記コードは、質問用として簡略化したものです。
ChatGPTは問題無いと言ってます。
「エラーになるかどうか」「何列目でエラーになるか」が知りたいです。
エラーにならないのであれば、自分のエラーの原因は自分で調査します。
  
実際に自分が作成したコードに上記コードと同様な内容が含まれてます。
上記コード以外の部分に原因が影響あるかもですが、
自分の目的を達成する別の方法(多少複雑にはなるが)はあるので、
代替案は不要です。
  
したがって「どうしても解決したい」ということはありません。
「解決できれば少しコードを簡略化できるのに」というのが目的の質問です。

回答
投稿日時: 24/04/27 11:00:17
投稿者: hatena
投稿者のウェブサイトに移動

提示のコードだと私の環境でも11列目(i=10)でエラーが出ました。
 
AddItemで行を追加するのではなく、19列の配列をListに代入するとエラーなく実行できました。
 

Private Sub CommandButton1_Click()
    Dim i As Long, ary(0, 19)
      
    ' 列数を20に設定
    ListBox1.ColumnCount = 20
      
    ' 1行目に空の要素を追加
    ListBox1.List = ary
      
    ' ループでリストボックスの最初の行に1から20までの値を設定
    For i = 0 To 19
        ListBox1.List(0, i) = i + 1
    Next i
End Sub

回答
投稿日時: 24/04/27 11:19:02
投稿者: hatena
投稿者のウェブサイトに移動

ちなみに、最初の1行目が成功すればあとはAddItemで追加してもエラーなく実行できます。
 
6行20列のリストを作成するコード例

Private Sub CommandButton1_Click()
    Dim i As Long, j As Long, ary(0, 19)
      
    ' 列数を20に設定
    ListBox1.ColumnCount = 20
      
    ' 1行目に空の要素を追加
    ListBox1.List = ary
      
    ' ループでリストボックスの最初の行に1から20までの値を設定
    For i = 0 To 19
        ListBox1.List(0, i) = i + 1
    Next i
    
    For j = 1 To 5
        ListBox1.AddItem ""
        For i = 0 To 19
            ListBox1.List(j, i) = i + 1
        Next i
    Next
End Sub

 
ただ、こうするなら最初から6行20列の配列を用意しておいて代入する方がシンプルですね。
 
Private Sub CommandButton1_Click()
    Dim i As Long, j As Long, ary(5, 19)
      
    ' 列数を20に設定
    ListBox1.ColumnCount = 20
    
    For j = 0 To 5
        For i = 0 To 19
            ary(j, i) = i + 1
        Next i
    Next
    ListBox1.List = ary
End Sub

投稿日時: 24/04/27 11:25:33
投稿者: シュークリーム

hatenaさん、ご回答ありがとうございます。
 
やはり、自分以外の環境でもエラーになるんですね。
 
ListBox1.AddItem "" では1から10列目まで空の要素が入る、、、のかな。
 
hatenaさんのご回答は、
全列に空の要素を入れておくということに
なるんでしょうかね。(表現は良くないかも)
これは自分では思い付かなかった解決策です。
 
自分の解決案よりも、かなりシンプルなコードで目的を達成できそうです。

回答
投稿日時: 24/04/27 13:28:29
投稿者: MMYS

シュークリーム さんの引用:

自分の解決案よりも、かなりシンプルなコードで目的を達成できそうです。

シンプルなコードなら、下記のようにも書けます。セルを使用するのが難点ですが。
 
    With Me.ListBox1
        .ColumnCount = 20
        .RowSource = Range("A1:T1").Address(External:=True)
    End With

 
ただ、セルを使用するなら、ColumnHeadsで「列見出し」が使用できますから見出しを使用したほうが実用的です。見出しは横スクロールしても追随しますし。
 
    For i = 1 To 20
        Cells(1, i).Value = Chr(i + 64)    '見出し行
        Cells(2, i).Value = i
        Cells(3, i).Value = i + 10
        Cells(4, i).Value = i + 20
        Cells(5, i).Value = i + 30
        Cells(6, i).Value = i + 40
    Next
    With Me.ListBox1
        .ColumnCount = 20
        .ColumnHeads = True
        .RowSource = Range("A2:T6").Address(External:=True)
    End With

 
なお、本題のエラーですか、私の所でも提示コードはエラーが出ました。謎です。
 

回答
投稿日時: 24/04/27 13:45:14
投稿者: simple

"追加"というよりも、ListBoxの"初期設定"の話だったんですね。
初期設定なら、.RowSourceプロパティでシートと紐付けるか、
または .Listに一括してセットすることしか思い浮かびませんでした。
複数列の場合にAddItemという発想はありませんでした。
 
解決されたようで何よりです。お疲れさまでした。

回答
投稿日時: 24/04/27 14:07:51
投稿者: simple
回答
投稿日時: 24/04/27 14:29:52
投稿者: hatena
投稿者のウェブサイトに移動

シュークリーム さんの引用:

ListBox1.AddItem "" では1から10列目まで空の要素が入る、、、のかな。

そのような仕様のようですね。
Private Sub CommandButton1_Click()
    Dim i As Long, j As Long, ary()
      
    ' 列数を20に設定
    ListBox1.ColumnCount = 20
    ListBox1.AddItem ""    
    ary = ListBox1.List
    Debug.Print "行数:"; UBound(ary),"行数:"; UBound(ary, 2)
End Sub

上記を実行するとイミディエイトに下記のように出力されます。
行数: 1       行数: 10 

 
シュークリーム さんの引用:
hatenaさんのご回答は、
全列に空の要素を入れておくということに
なるんでしょうかね。(表現は良くないかも)

そういう認識であってます。
ary(0, 19) つまり1行20列の空の配列をListに代入してます。
その後、AddItemすると20列のまま、行数が増えるという仕様ですね。
 

投稿日時: 24/04/27 18:56:01
投稿者: シュークリーム

みなさん、わざわざご回答ありがとうございます。
  
「謎」を共有できて良かったです。
  
どうしても.List(i,j)で10列を超える追加をやりたい初心者(自分含む)は、
多分地球上に3人くらいしかいないので、
仕様であっても、ほとんど問題にならないでしょうね。
  
自分もChatGPTもまだまだ未熟ですね。