
エクセルVBAでフォームのListboxをスクロールするには?
ワークシート上に貼り付けたリストボックスがあります。
このリストボックスはOLEObjectではなくフォームのリストボックスです。
For Each lb In .ListBoxes
If lb.ListCount <= 4 Then
lb.ListIndex = 1
Else
lb.ListIndex = 16
ここで16番目が見えるようにスクロールしたいのです。
End If
Next lb
このスクロールさせる方法がわかりません。
ご教示いただければ幸いです。
No.3ベストアンサー
- 回答日時:
>手動スクロールの動きが変ですし
失礼。
'-----------------------------------------------------------------
Sub sbChange()
'ListBoxes(1)の表示行数でMXを設定
Const MX As Long = 11
Dim x As Long
With ActiveSheet
x = n - .ScrollBars(1).Value + 1
If x < 1 Or x > MX Then
.ListBoxes(1).ListIndex = 0
Else
.ListBoxes(1).ListIndex = x
End If
End With
End Sub
'-----------------------------------------------------------------
Sub test()
Dim x
x = InputBox("ListIndex")
With ActiveSheet
.ListBoxes(1).ListIndex = 1
.ScrollBars(1).Value = x
n = x
End With
End Sub
'-----------------------------------------------------------------
Sub LbChange()
With ActiveSheet
n = .ListBoxes(1).ListIndex + .ScrollBars(1).Value - 1
End With
End Sub
'-----------------------------------------------------------------
上記に差し替え&追加してsbChangeのMXを設定し、
LbChangeをListBoxes(1)にマクロ登録すれば少しはマシになります。
ですが、手が込み過ぎておすすめしないのは変わりありません。
また、
>モードレスなUserFormにListBoxを配置して使う方が良いと思います。
ここで書いたListBoxはActiveXコントロール(コントロールツールボックス)のListBoxの事です。
#もちろんExcel.ListBoxはUserFormに置けませんから
#お判りでしょうけど念のため。
#ActiveXコントロールは直接ワークシート上に配置するよりも
#UserFormに配置して使ったほうが不具合少なく、良いかと思ったもので。
end-uさま、おはようございます、merlionXXです。
いつもありがとうございます。
何かものすごい仕掛けですね。
まだよく理解できていませんが、実装するにはちょっと無理があるようです。
( ̄~ ̄;)う~ん、やはりフォームのリストボックスではマクロでスクロールはできないのが仕様なんですね、しようがない。
ワークシート上に10数個のリストボックスを配置し、デフォルトボタンを用意して初期化したら選択肢が4つ以下のリストボックスは1番目、選択肢が47(都道府県)あるものは16番目の東京を表示させようと思ったのです。
ワークシート上にリストボックスを残しておきたいのでユーザーフォームは今回使用できません。
あまりお勧めでないという、シートにOLEオブジェクト(ActiveX)のリストボックスをはるか、デフォルトボタンを押した場合、何も選択されていない状態にしてしまうなど、他の方法を考えてみます。
ありがとうございました。
No.4
- 回答日時:
>選択肢が47(都道府県)あるものは16番目の東京を表示させようと思ったのです。
そういう用途であれば、DropDownsや[入力規則]リストが使われる事が多いのではないでしょうか。
DropDownsのリストをコードでDropDownする事はできませんが、
DropDownLinesを47、Value = 16 にしてDropDownsクリックしてみてください。
DropDownsのWindows相対位置にもよりますが、全リストが展開されます。
普段は折り畳まれて省スペースですし、ユーザー操作的にもそれほど差異は無いように思えます。
#仕様にダメ出しするつもりはありません。
#他の要件もある事でしょうし、あくまで参考意見です。
No.2
- 回答日時:
シート上のExcel.ListBoxでは ListIndex、Value、Selected(x) = True、
いずれもスクロールしません。仕様です。
諦めてください。
なんとかそれっぽく、
Option Explicit
Dim n As Long
'---------------------------------------------------------------------
'#Sub 準備()でシート追加しListBoxを配置。
'#Sub test()を実行してみてください。
Sub 準備()
With Sheets.Add
.Names.Add "List", "=OFFSET($A$1,$B$1-1,,20)"
With .Range("A1")
.Value = "F1"
.AutoFill .Resize(40), xlFillDefault
End With
With .ListBoxes.Add(.Range("C1").Left, 0, 100, 100)
.ListFillRange = "List"
.LinkedCell = "$B$2"
End With
With .ScrollBars.Add(.Range("C1").Left + 87, 0, 13, 102)
.Min = 1
.Max = 20
.SmallChange = 1
.LargeChange = 10
.LinkedCell = "$B$1"
.OnAction = "sbChange"
.ShapeRange.ZOrder msoBringToFront
End With
End With
End Sub
'---------------------------------------------------------------------
Sub sbChange()
Dim x As Long
With ActiveSheet
With .ScrollBars(Application.Caller)
x = .Value - n
n = .Value
End With
With .ListBoxes(1)
x = .ListIndex - x
If x < 0 Then
x = 0
ElseIf x > 20 Then
x = 20
End If
.ListIndex = x
End With
End With
End Sub
'---------------------------------------------------------------------
Sub test()
Dim x
x = InputBox("ListIndex")
With ActiveSheet
.ListBoxes(1).ListIndex = 1
.ScrollBars(1).Value = x
End With
End Sub
'---------------------------------------------------------------------
...こんな感じで実現してみましたが
トリッキーだし、手動スクロールの動きが変ですし、
実用的ではないです orz
複数のListBoxに設定するのも大変そうなので
モードレスなUserFormにListBoxを配置して使う方が良いと思います。
No.1
- 回答日時:
>lb.ListIndex = 16
ではなくて、lb.Value = "16番目のアイテム名" ではいかがですか?
この回答への補足
いま、ためしにフォームではなくOLEObjectのListboxをワークシート上に一つ配置して以下のコードでやってみました。
Sub test03()
ActiveSheet.ListBox1.Value = "P"
End Sub
で、スクロールされて16番目の P が表示されました。
ただ、わたしがやりたいのはOLEObjectのListboxではなくフォームのListboxでのスクロールなのです。
よろしくお願いします。
hana-hana3さま、ありがとうございます。
説明が足りなかったのでもう少し具体的に書きます。
ワークシート上に複数のListboxがあります。
質問でも書いたようにこれはフォームのListboxで、OLEオブジェクトではありません。
Listboxのうち設定されているリストの数が4以下のものは1番目を選択させます。
これらは最初からリストが全部表示されているのでスクロールの必要はありません。
リストの数が5以上のものは16番目を選択させます。
これらはリストが全部表示されていないので16番目を見えるようにスクロールの必要があります。
テスト用にリストの数が5以上のものはA~Tまでリストを設定しました。
したがって16番目は"P"になります。
ご教示の通り、
Sub test01()
Dim lb As ListBox
With ActiveSheet
For Each lb In .ListBoxes
If lb.ListCount <= 4 Then 'Listが4つ以下のものなら
lb.ListIndex = 1 'Listの一番目を選択
Else 'そうでなければ
lb.Value = "P" '16番目のPを表示
End If
Next lb '繰り返し
End With
End Sub
とやってみましたが、lb.Value = "P" のところで実行時エラー13「型が一致しません」となります。
lb.Value = 16
または
lb.ListIndex = 16 とすれば、16番目の"P"が選択されますが、スクロールはされません。
どのように直せばよいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
電子書籍プレゼントキャンペーン!
最大2万円超分当たる!マンガや小説が読める電子書籍サービス『Renta!』で利用できるギフトコードプレゼント実施中!
-
VBAのリストボックスをマウスでスクロール
PowerPoint(パワーポイント)
-
ユーザーフォーム スクロールバー 非表示にしたい
Excel(エクセル)
-
スクロールバーでは上下異動できるが、マウスホイールでスクロールしない
Excel(エクセル)
-
4
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
5
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
6
VBAのリストボックスで、横スクロールバーを表示するには?
Visual Basic(VBA)
-
7
ExcelVBA でリストリストボックスに列見出しをコーディングでつける
Excel(エクセル)
-
8
ListBoxで改行したい
Visual Basic(VBA)
-
9
複数選択のListBoxでClickイベントが拾えません
Visual Basic(VBA)
-
10
リストボックスに縦スクロールバーと選択
Visual Basic(VBA)
-
11
リストボックスの選択解除
Visual Basic(VBA)
-
12
UserForm1.Showでエラーになります。
工学
-
13
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
14
ListView 項目の選択/選択解除について
Visual Basic(VBA)
-
15
VBAでユーザーフォームの表示を確認
Visual Basic(VBA)
-
16
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
17
エクセルVBAのフォームを最前面にする方法を教えてください。
Visual Basic(VBA)
-
18
ExcelのComboboxでマウスのスクロールを有効にしたい
Excel(エクセル)
-
19
EXCEL VBA リストボックスの列を指定してForeColorを変更する方法について
Excel(エクセル)
-
20
VBA リストボックスをダブルクリックしデータを修正したいのですが…。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
PDFを(htmlのように)無限に縦...
-
5
Excelで一部分だけを常に表示さ...
-
6
vb,netでtextboxの文字を右から...
-
7
エクセルでウインドウ枠固定
-
8
グループボックス内のコンボボ...
-
9
ページ訪問時にiframe内を自動...
-
10
上下キーを押すと、ページスク...
-
11
文章の自動スクロール
-
12
リストビューの水平スクロール...
-
13
ExcelVBAで他のアプリをスクロ...
-
14
常に画像の大きさを横幅100%で...
-
15
マウスオーバー→ホイール回転で...
-
16
IEにおけるプルダウン、テキ...
-
17
Visual Basicから Spreadのスク...
-
18
写真を右から左にスクロールさ...
-
19
CScrollView について教えて下さい
-
20
VBA IEの操作 スクロールバーの...
おすすめ情報
公式facebook
公式twitter