
エクセル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も見ています
-
VBAのリストボックスをマウスでスクロール
PowerPoint(パワーポイント)
-
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
VBAのリストボックスで、横スクロールバーを表示するには?
Visual Basic(VBA)
-
-
4
ExcelのComboboxでマウスのスクロールを有効にしたい
Excel(エクセル)
-
5
スクロールバーでは上下異動できるが、マウスホイールでスクロールしない
Excel(エクセル)
-
6
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
7
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
8
ユーザーフォーム スクロールバー 非表示にしたい
Excel(エクセル)
-
9
リストボックスに縦スクロールバーと選択
Visual Basic(VBA)
-
10
UserForm1.Showでエラーになります。
工学
-
11
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
12
リストビューをスクロールさせるには
Visual Basic(VBA)
-
13
EXCEL2013 VBA ListBox 未選択
Excel(エクセル)
-
14
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
15
ExcelVBAでListViewが使用できない
Visual Basic(VBA)
-
16
【VBA】【ユーザーフォーム_ListBox】オートフィルタで絞りこんだ値だけを取り出したい
Visual Basic(VBA)
-
17
ListView 項目の選択/選択解除について
Visual Basic(VBA)
-
18
VBAでユーザーフォームの表示を確認
Visual Basic(VBA)
-
19
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
20
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PDFを(htmlのように)無限に縦...
-
エクセルVBAでフォームのListbo...
-
Excelでワードアートや図を常に...
-
リストビューをスクロールさせ...
-
リストビューのスクロールバー...
-
マウスオーバー→ホイール回転で...
-
vb2005のwebbrowserで
-
新着情報などをスクロールしな...
-
コマンドボタンを押している間...
-
Visual Basicから Spreadのスク...
-
アコーディオンで開かれたパネ...
-
MSHFlexGridの幅
-
リストボックスをクリックした...
-
大きい表へのスクロールバーの...
-
【VC++6.0】ソースコードの文字...
-
マウスでコロコロしたいんですが…
-
文字が上に上がってくるような...
-
リストビューの水平スクロール...
-
ページ読み込み時に自動でスク...
-
Excelで一部分だけを常に表示さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PDFを(htmlのように)無限に縦...
-
Excelでワードアートや図を常に...
-
エクセルVBAでフォームのListbo...
-
リストビューをスクロールさせ...
-
アコーディオンで開かれたパネ...
-
Visual Basicから Spreadのスク...
-
大きい表へのスクロールバーの...
-
リストビューのスクロールバー...
-
VBE画面の縦のスクロールバ...
-
マウスオーバー→ホイール回転で...
-
上下キーを押すと、ページスク...
-
マウスでコロコロしたいんですが…
-
ページ読み込み時に自動でスク...
-
MFCでのスクロールバーの扱い
-
vb,netでtextboxの文字を右から...
-
リストビューの水平スクロール...
-
ポストバック時のスクロール位...
-
webページで横方向にアンカーを...
-
Webサイト内でスクロールする小...
-
マウスホイールでスクロールで...
おすすめ情報