Excel (VBA)

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

 
(Windows 11全般 : Excel 2016)
UserForm上のComboBox 選択後も複数列表示させたい。
投稿日時: 23/11/16 22:43:48
投稿者: taichi

UserForm上ので複数列表示のListBoxなら選択後も、複数列表示されたままですが、
ComboBoxではどれか1つの列しか表示できないのでしようか?
UserFormの大きさをできるだけ小さくして使いたいので、ComboBoxを使用しようしたいのです。
無理なら諦めます。

回答
投稿日時: 23/11/17 07:46:17
投稿者: simple

列の最後に、データを連結した項目を持っておき、
・Comboboxの幅を調整して、取得前はそれが隠れる程度にしておき、
・選択後は、そのダミー列を表示する
としたら、どうでしょうか。少し不細工ですか?
 
即効テクニック「コンボボックスのリストを複数列表示する」
https://www.moug.net/tech/exvba/0090021.html
を下敷きにして、こんな風にしてみました。
 

Private Sub UserForm_Initialize()
    Dim myArray() As Variant
    Dim i As Long
    
    ReDim myArray(9, 2)         '■変更
    For i = 1 To 10
        '1列めの項目
        myArray(i - 1, 0) = i
        '2列め項目
        myArray(i - 1, 1) = "データ" & i
        '■追加
        myArray(i - 1, 2) = myArray(i - 1, 0) & vbTab & myArray(i - 1, 1)
        
    Next i
    
    With ComboBox1
        .ColumnCount = 3    '表示列数の設定             ■変更
        .TextColumn = 3     '表示列の設定               ■変更
        .BoundColumn = 2    '値として取得する列の設定   ■変更
        .List() = myArray() 'リスト項目の設定
    End With
End Sub

Private Sub CommandButton1_Click()
    MsgBox "Textプロパティ : " & ComboBox1.Text & vbCrLf & _
           "Valueプロパティ: " & ComboBox1.Value
End Sub

微修正が必要かもしれません。

回答
投稿日時: 23/11/17 16:58:16
投稿者: WinArrow

ComboBoxは、2つの要素から構成されていいます。
  
1つは、選択した「値」を表示するボックス
もう一つは、ドロップダウンリスト
ドロップダウンリストには、複数列格納できます。
  
ドロップダウンリストは、選択する時だけ表示することができる(複数列表示でいる)から、
必要なだけ横幅を指定可能です。
選択後は、ドロップダウンリストは消えたしまいます。
  
選択時だけ、目視でくきればよい・・・という時には有効です。

回答
投稿日時: 23/11/17 18:29:15
投稿者: WinArrow

ご希望は、「選択後も複数列表示」ですよね?
  
私のレスは、無視してください。
 
横方法は制限があるが、縦方向は、いかがでしょうか?
若し、縦方向ならば、ということでしたら、
すぐ下にラベルを配置して、選択時にラベルへ代入することができます。
 

回答
投稿日時: 23/11/18 00:16:04
投稿者: hatena
投稿者のウェブサイトに移動

simpleさんのアイデアを拝借して、少し改良してみました。
 

Private Sub UserForm_Initialize()
    Dim myArray() As Variant
    Dim i As Long
    
    ReDim myArray(9, 2)         '■変更
    For i = 1 To 10
        '1列めの項目
        myArray(i - 1, 0) = i
        '2列め項目
        myArray(i - 1, 1) = "データ" & i
        '■追加
        myArray(i - 1, 2) = myArray(i - 1, 0) & vbTab & myArray(i - 1, 1)
    Next i
    
   With ComboBox1
        .ColumnCount = 3    '表示列数の設定             ■変更
        .TextColumn = 3     '表示列の設定               ■変更
        .BoundColumn = 2    '値として取得する列の設定   ■変更
        .List() = myArray() 'リスト項目の設定
        .ColumnWidths = "60;60;0" '各列幅を設定、3列目は非表示■追加
        .Width = 120              'コンボボックスの幅を設定   ■追加
    End With
End Sub

 
ColumnWidths は表示するデータにあわせて調整
Width はColumnWidthsの合計値
 
3列目の幅を0にすることで非表示になり、リストに横スクロールバーが出なくなります。

回答
投稿日時: 23/11/18 09:11:35
投稿者: WinArrow

話が戻るようで。申し訳ありませんが、
 
複数列表示したい・・=複数列みたい
という、テクニック面から問題解決を図るのではなく、
★複数列表示がなぜ必要なのか?
という観点で考えてみましょう。
 
目的から考えると、良い案がでてくる可能性もあると思います。

回答
投稿日時: 23/11/19 10:51:46
投稿者: simple

hatenaさん、ありがとうございました。おかげさまで幼稚な案が一人前の案になりました。
なかなか回答コメントが無いのが残念です。

投稿日時: 23/11/23 17:46:12
投稿者: taichi

simpleさん、WinArrowさん、hatenaさん ありがとうごじました。
 
返事が遅くなり申し訳ございません。
質問を上げた日にインフルエンザに罹っていたようで、
体調不良で暫く寝るねこんでおりました。今日やっとPCに向かう気になりました。
 
simpleさん→hatenaさん のコードを試してみました。
これで私の希望はかないました。
 
でも提供頂いたコードで何故選択後の2列表できているのか
ハテナ?理屈がいまいち理解できません。
 

回答
投稿日時: 23/11/23 19:14:07
投稿者: simple

@      A-----    B--------------
1       データ1     1(タブ) データ1
となっています。
 
選択前の表示は、幅が"60:60:0"だから
@      A----- 
1       データ1 
の2列だけが表示されます。(3列目は幅0で表示されている)
 
選択後は、.TextColumn = 3
(どの列(1列だけに限定)を表示するかの指定) となっているので、
B--------------
1(タブ) データ1
だけが表示されます。
タブのせいで人間の眼には2列のように見えますけど、1列です。
 
# 正直、説明を求められるとは思っていませんでした。

回答
投稿日時: 23/11/23 21:16:16
投稿者: WinArrow

simpleさんから、詳しい説明がありましたが、
   
追加しておきたいことがあります。
   
Comboboxのプロパティーと、プログラム内で使用について
   
Value : .Boundcolumnで設定した列です。
Text : .TextColumn で設定した列です。
これ以外の列を使用(参照)する場合は、List(Listidex,n)を使用することになります。
   
今回の場合、「TextColumn=3」と指定しているので、
Textには、「1(タブ) データ1」のように入っています。
「データ1」部分を使用(参照)する場合は、
List(Listindex, 1)を使う方法、(推奨)
又は、
「1(タブ) データ1」を分解して取り出す方法
が考えられます。
  
なお、3列目の文字列結合に「Tab」ではなく、特定文字列(スペースでもよい)を使用することも可能です、
表示幅を小さくすることができます、

投稿日時: 23/11/25 09:47:00
投稿者: taichi

simpleさん、WinArrowさん、hatenaさん ありがとうごじました。
解説もありがとうございました。
 
頂いたコードや解説で、同様な表示をするヒントを思いつきました。
ColumnCount = 2
TextColumn = 2
BoundColumn =1
ColumnWidths = "0,60"
で,1列目は列番号の記号、2列めは 別のColum表示していたのを 
列記号+space+列のタイトル(1行目)で表紙させれば目的が果たせました。