
エクセル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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) エクセルシート中の全角英数字を半角に変換したい 4 2022/07/07 13:14
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Excel(エクセル) エクセルで書式設定とフィルタの組み合わせでうまく行かないのですが 4 2022/10/07 10:02
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- エアガン・モデルガン 4.2 lb = 1905.09 g のはずなのが、 (⇩)下記の URL の SPECS の所の 1 2022/10/06 15:43
- Visual Basic(VBA) 形式を選択して貼り付け 以下のコードで「元」シートと「先」シートのA列に同じ値があったら指定範囲をコ 5 2022/11/11 07:30
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAのリストボックスをマウスでスクロール
PowerPoint(パワーポイント)
-
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
ExcelのComboboxでマウスのスクロールを有効にしたい
Excel(エクセル)
-
-
4
VBAのリストボックスで、横スクロールバーを表示するには?
Visual Basic(VBA)
-
5
スクロールバーでは上下異動できるが、マウスホイールでスクロールしない
Excel(エクセル)
-
6
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
7
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
8
リストボックスに縦スクロールバーと選択
Visual Basic(VBA)
-
9
ユーザーフォーム スクロールバー 非表示にしたい
Excel(エクセル)
-
10
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
11
EXCEL2013 VBA ListBox 未選択
Excel(エクセル)
-
12
【VBA】ユーザーフォーム リストボックスのヘッダー設定方法
Visual Basic(VBA)
-
13
リストビューをスクロールさせるには
Visual Basic(VBA)
-
14
ListBoxで改行したい
Visual Basic(VBA)
-
15
UserForm1.Showでエラーになります。
工学
-
16
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
17
ExcelVBA でリストリストボックスに列見出しをコーディングでつける
Excel(エクセル)
-
18
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
19
ユーザーフォームに入力したデータを保持する方法
Visual Basic(VBA)
-
20
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
リストビューをスクロールさせ...
-
Excelでワードアートや図を常に...
-
グループボックス内のコンボボ...
-
マウスオーバー→ホイール回転で...
-
PDFを(htmlのように)無限に縦...
-
Visual Basicから Spreadのスク...
-
resizeするとスマホで何度もリ...
-
クリックすると横にスムーズス...
-
大きい表へのスクロールバーの...
-
vb,netでtextboxの文字を右から...
-
エクセルVBAでフォームのListbo...
-
vb2005のwebbrowserで
-
ページ読み込み時に自動でスク...
-
VBA IEの操作 スクロールバーの...
-
VBE画面の縦のスクロールバ...
-
ExcelでVBEを使って、カレンダ...
-
水平スクロールができない。
-
IFRAMEでscrolling="yes|no"の...
-
このサイトのスクロール逆じゃ...
-
新着情報などをスクロールしな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでワードアートや図を常に...
-
PDFを(htmlのように)無限に縦...
-
エクセルVBAでフォームのListbo...
-
リストビューをスクロールさせ...
-
アコーディオンで開かれたパネ...
-
Visual Basicから Spreadのスク...
-
大きい表へのスクロールバーの...
-
マウスオーバー→ホイール回転で...
-
vb,netでtextboxの文字を右から...
-
ExcelVBAで他のアプリをスクロ...
-
新着情報などをスクロールしな...
-
マウスでコロコロしたいんですが…
-
リストビューのスクロールバー...
-
Excelで一部分だけを常に表示さ...
-
エクセルで行を固定しその下か...
-
マウスホイールでスクロールで...
-
文章の自動スクロール
-
html js 横軸の長いチャート
-
上下キーを押すと、ページスク...
-
C#:ListViewでのスクロールイベ...
おすすめ情報