Horizontale Scrollbar für Word Listbox

Hallo,

ich habe eine UserForm1, die eine Listbox myLbx enthält, der ich eine horizontale Scrollbar hinzufügen möchte. Ich habe verschiedene Sachen, die ich im Internet gefunden habe, ausprobiert, aber es funktioniert nichts wirklich. Gibt es keine einfache Lösung, um eine horizontale Leiste einzufügen?
Wenn ich eine Funktion habe, die funktioniert, wann rufe ich die denn sinnvollerweise auf? Bevor die UserForm geladen wird, die die Listbox enthält?

1000 Dank schon mal, wenn jemand eine Info dazu hat.

Gruß,
Elisabeth

ich habe eine UserForm1, die eine Listbox myLbx enthält, der
ich eine horizontale Scrollbar hinzufügen möchte. Ich habe
verschiedene Sachen, die ich im Internet gefunden habe,
ausprobiert, aber es funktioniert nichts wirklich. Gibt es
keine einfache Lösung, um eine horizontale Leiste einzufügen?
Wenn ich eine Funktion habe, die funktioniert, wann rufe ich
die denn sinnvollerweise auf? Bevor die UserForm geladen wird,
die die Listbox enthält?

Hi Elisabeth,

eine Listbox hat nun mal keine horizontale Scrollbar.

Ich weiß nicht was du schon alles probiert hast.
man könnte de Breite der Listbox abhängig machen von der Breite des breitesten Eintrages.

Man könnte aufwendig eine horizontale Bildlaufleiste mit in die UF einbauen und die mit der Listbox koppeln.
D.h. je nach Scrollung werden die Zeichen 1-30, 5 - 35 usw. der Listbox in ihr angezeigt.

Oder tricksen, wie hier auf dem Bild:

http://www.bilder-space.de/show.php?file=18.12cdObBY…

Beschreibe mal genauer was du planst, wieviele Spalten hat die Listbox? Gibts eine beispielmappe, s. FAQ:2861 ?

Gruß
Reinhard

Hallo Elisabeth,

ist denn dein Google defekt?
nach nicht einmal 3 Sekunden suchen, fand ich folgendes.

Private Sub CreateBar()
 Dim X&, Max&, Akt&, Result&, F As Form
 Set F = Me
 Set F.Font = myLbx.Font
 For X = 0 To myLbx.ListCount - 1
 Akt = F.TextWidth(myLbx.List(X))
 If Akt \> Max Then Max = Akt
 Next
 Max = Max \ Screen.TwipsPerPixelX
 Result = SendMessage(myLbx.hwnd,&H194, \_
 Max, ByVal 0)

 Set cForm = Nothing
End Sub

Du füllst deine liste und danach rufst du einfach die Sub auf. Der horizontale Scrollbalken passt sich dann automatisch deiner Liste an :wink:

MfG Alex

nach nicht einmal 3 Sekunden suchen, fand ich folgendes.
Du füllst deine liste und danach rufst du einfach die Sub auf.
Der horizontale Scrollbalken passt sich dann automatisch
deiner Liste an :wink:

Hallo Alex,

nach 3 sec Überfliegens deines Codes wußte ich, so klappt das nicht in Word-Vba :smile:
Jetzt nicht nur die fehlende API Deklaration.
Welcher horizontale Scrollbalken soll sich denn da anpassen, da gibts doch keinen?
Die Breite der Listbox, okay, von mir aus, aber wenn sie dann breiter wird als die Userform?

Es gibt in Word-Vba .Scrollbars=x und .KeepScrollbars=x, Letzeres habe ich nicht ganz kapiert. Liegt auch daran daß das bei einer Listbox nicht bekannt ist, sind wohl andere Steuerelemente bei denen man mit
.Scrollbars=x ’ X=0,1,2,3, 0 = keine Scrollbars, 1=nur vertical, usw.
das Erscheinen von Scrollbars bestimmen kann.
Dito für KeepScrollbars, was immer da auch genau passiert.

So, die 3 sec sind glaub rum *gg*, ich schau mal ob dein Code irgendwie klappt in Word und die API-Deklaration finde ich ja im Inet.

Gruß
Reinhard

Hallo Reinhard

nach 3 sec Überfliegens deines Codes wußte ich, so klappt das
nicht in Word-Vba :smile:

Unter VB schon! Und da Der Poster nicht geschrieben hatte unter welchem VBA Code sie etwas versucht, nahm ich an das es sich um VB handelt.
Kann man denn den Source net einfach so übernehmen?
Was geht denn da nicht genau oder wo schimpft denn da VBA rum?

Jetzt nicht nur die fehlende API Deklaration.

Ups, stimmt, die muss noch rein.

Declare Function SendMessage Lib "user32.dll" \_
 Alias "SendMessageA" ( \_
 ByVal hWnd As Long, \_
 ByVal Msg As Long, \_
 wParam As Any, \_
 lParam As Any) As Long

Private Sub CreateBar()
'X,Max,Akt,Result werden anhand des & als Long declariert
'F als Form
Dim X&, Max&, Akt&, Result&, F As Form
'Wir weisen F die Form zu auf dem die Listbox liegt
Set F = Me
'Wir setzen die das Font der Form auf die von der Listbox, da
'Unterschiedliche Font = Unterschiedliche Breiten in der Ausgabe haben
Set F.Font = myLbx.Font
'Wir durchlaufen alle Elemente der Listbox
For X = 0 To myLbx.ListCount - 1
'Wir weisen der Variablen Akt die Breite des Textes zu
'Durch TextWidth(DeinText) bekommst du die Breite
'ist möglich auf dem Formular
'deswegen auch oben die Zuweisung
Akt = F.TextWidth(myLbx.List(X))
'Wenn Akt grösser ist als max dann Max = Akt
If Akt > Max Then Max = Akt
Next
'Wir rechnen ein wenig
Max = Max \ Screen.TwipsPerPixelX
'Wir senden ein Commando (SendMessage an die Listbox)
'Sendmessage brauch das Handle des Control
'Sendmessage brauch auch die Nachricht(Kommando)
'&H194 ist das sie einen Horizontalen Scrollbalken darstellen soll
'Sendmessage erwartet auch einen Parameter
'Hier uebergeben wir den Wert ( Value für die Scrollbar
Result = SendMessage(myLbx.hwnd,&H194,Max, ByVal 0)
'Wir löschen die Variable durch Zuweisung von nichts
'Der Zeiger im Stack zeigt auf NICHTS!
Set F = Nothing
End Sub

Siehst du nun wie du und wo der Scrollbalken dargestellt wird?
Kann man das in VBA umsetzen?

MfG Alex

Hallo Alex, hallo Reinhard,

vielen vielen Dank für die Anregungen. Morgen früh hocke ich über meinem Code und werde noch ein bisschen rumprobieren.

Sorry, dass ich im Betreff die Sprache nicht erwähnt habe, das wäre wirklich hilfreich gewesen :wink: Ich gelobe Besserung.

Also nochmal Danke und ich melde mich sicherlich nochmal :wink:

Gruß,
Elisabeth

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Horizontale Scrollbar für Word Listbox in VBA

ich habe eine UserForm1, die eine Listbox myLbx enthält, der
ich eine horizontale Scrollbar hinzufügen möchte. Ich habe
verschiedene Sachen, die ich im Internet gefunden habe,
ausprobiert, aber es funktioniert nichts wirklich. Gibt es
keine einfache Lösung, um eine horizontale Leiste einzufügen?
Wenn ich eine Funktion habe, die funktioniert, wann rufe ich
die denn sinnvollerweise auf? Bevor die UserForm geladen wird,
die die Listbox enthält?

Hi Elisabeth,

Hallo Reinhard!

eine Listbox hat nun mal keine horizontale Scrollbar.

Ich weiß nicht was du schon alles probiert hast.
man könnte de Breite der Listbox abhängig machen von der
Breite des breitesten Eintrages.

Man könnte aufwendig eine horizontale Bildlaufleiste mit in
die UF einbauen und die mit der Listbox koppeln.
D.h. je nach Scrollung werden die Zeichen 1-30, 5 - 35 usw.
der Listbox in ihr angezeigt.

Oder tricksen, wie hier auf dem Bild:

http://www.bilder-space.de/show.php?file=18.12cdObBY…

Stehe gerade auf dem Schlauch, aber was ist denn da getrickst? Sieht doch gut aus!?

Beschreibe mal genauer was du planst, wieviele Spalten hat die
Listbox? Gibts eine beispielmappe, s. FAQ:2861 ?

Ich schreibe morgen mal genauer, was ich habe. Kann schon mal soviel sagen, dass es in der Box nur eine Spalte gibt, also alles relativ harmlos :wink: In der Box stehen Dateinamen, die an dieser Stelle ausgewählt werden können. Da die Namen sich sehr ähneln und nur am Ende unterscheiden, ist es wichtig, dieses Ende auch zu sehen :wink: Es sollte nach Möglichkeit vermieden werden, die Listbox selbst bzw. die ganze Form zu vergrößern. Deshalb eben die Idee mit der horizontalen Scrollbar. Mir war allerdings nicht bewusst, dass das ein so großer Aufwand ist :wink:

Gruß
Reinhard

Viele Grüße,
Elisabeth

nach 3 sec Überfliegens deines Codes wußte ich, so klappt das
nicht in Word-Vba :smile:

Unter VB schon! Und da Der Poster nicht geschrieben hatte
unter welchem VBA Code sie etwas versucht, nahm ich an das es
sich um VB handelt.

Hallo Alex

den Betreff haste aber schon gelesen? *grien*

Kann man denn den Source net einfach so übernehmen?
Was geht denn da nicht genau oder wo schimpft denn da VBA rum?

zumindest an „Form“. Getestet habe ich noch nicht.

Oder tricksen, wie hier auf dem Bild:

http://www.bilder-space.de/show.php?file=18.12cdObBY…

Stehe gerade auf dem Schlauch, aber was ist denn da getrickst?
Sieht doch gut aus!?

Hallo Elisabeth,

naja, das eine ist, das ist gar keine Listbox sondern ein Spreadsheet was in der Userform ist und so gestartet wird:

Private Sub UserForm\_Initialize()
Dim N
For N = 1 To 20
 Listbox1.Cells(N, 1) = "abcdefghijklmnoprstuvwxyz" & N
 Listbox1.Cells(N, 2) = CStr(Right("0000" & N, 5))
 Listbox1.Cells(N, 3) = UCase("abcdefghijklmnoprstuvwxyz") & N
Next N
End Sub

Lass dich vom Namen „Listbox1“ nicht verwirren, es ist ein Spreadsheet, just for fun habe ich mal ausprobiert ob man es nicht in Listbox oder Combobox umbennenen kann.
Erstaunlicherweise ging das, hätte ich gar nicht gedacht.

Denn das bietet ja ungeahnte Möglichkeiten Code zu verschleieren, also vor dem Fremdbenutzen zu schützen.

Da blickt doch, grad bei längerem Code, kein(e) weibliches Oink mehr durch wenn ich konsequent alle Steuerelemente einer UF (userForm) gegenteilig benenne *smile*
Combobox1 benenne ich dann Userform5, Textbox3 dann Combobox27, ich würd irre werden wenn ich den Code entschlüsseln müßte.

Noch habe ich es nicht geschafft den Vorschlag von Alex umzusetzen in Word-Vba.

Wenn das scheitert, bliebe schonmal meine Idee, die Anzeige der Daten in der Listbox enstprechend eines externen Scrollbalkens in der UF horizontal zu scrollen.
Zumindest glaube ich daß dies machbar ist.
Wie wird denn die ListBox mit Daten gefüllt, wo stehen die?
kannst du eine Beispielmappe basteln und mit FAQ:2861 hochladen?

Und, du brauchst dich nicht zu entschuldigen, wenn Alex Word für Word deinen Betreff durchliest geht er nicht mehr von VB aus *grien*

Gruß
Reinhard

Hallo Reinhard,

ich hatte gerade mal langeweile und hab ma nen bissl getestet :wink:

zu folgenden Ergebnis bin ich gekommen.

Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hDC As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As SIZE) As Long

#If Win16 Then '16 Bit
 Private Declare Function SendMessage Lib "user" (ByVal hWnd As \_
 Integer, ByVal wMsg As Integer, ByVal wParam As \_
 Integer, ByVal lParam As Integer) As Long

#ElseIf Win32 Then '32 Bit
 Private Declare Function SendMessage Lib "user32" Alias \_
 "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As \_
 Long, ByVal wParam As Long, ByVal lParam As Long) \_
 As Long
#End If

Private Type SIZE
 Width As Long
 Height As Long
End Type

Const SV = &H194


Private Sub UserForm\_Activate()
Dim i As Integer
 For i = 1 To 100
 ListBox1.AddItem (GetData)
 Next i
 Call SetScroll
End Sub

Private Sub SetScroll()
 Dim X&, Max&, Akt&, Result&
 For X = 0 To ListBox1.ListCount - 1
 Akt = GetWidth(ListBox1.List(X))
 If Akt \> Max Then Max = Akt
 Next
 '.[\_gethWnd] ist eine undokumentierte Methode die das Handle der Listbox liefert :wink:
 Result = SendMessage(Listbox1.[\_GethWnd], SV, Max, ByVal 0)
End Sub

Private Function GetWidth(txt As String) As Long
 Dim nSize As SIZE
 GetTextExtentPoint32 GetDC(ListBox1.[\_GethWnd]), txt, Len(txt), nSize
 GetWidth = nSize.Width
End Function

Private Function GetData() As String
Dim X As Integer
Dim i As Integer
Dim tmp As String
X = CInt(Rnd \* 53)
For i = 1 To X
tmp = tmp & Chr(CInt(Rnd \* 26) + 65)
Next
GetData = tmp
End Function

es läuft alles Fehlerfrei durch. Das Problem hierbei ist aber das mir die API SendMessage eine 0 Zurueckliefert, was darauf deutet das die API nicht erfolgreich ausgefuehrt wurde :frowning:

Hast du noch ne Idee?
Wie ruft man denn API’s unter VBA auf?

Unter VB habe ich das rel. schnell ans laufen gebracht :wink:
Könnte man ansonsten unter VBA auch externe Steuerelemente einbinden?
Wenn ja, dann könnte man ja eben mal fix nen neues OCX schreiben :smile:

MfG Alex

Hallo Alex,

Gut’s 2009 *wünsch*

es läuft alles Fehlerfrei durch. Das Problem hierbei ist aber
das mir die API SendMessage eine 0 Zurueckliefert, was darauf
deutet das die API nicht erfolgreich ausgefuehrt wurde :frowning:

Hast du noch ne Idee?
Wie ruft man denn API’s unter VBA auf?

? So wie in VB.

Unter VB habe ich das rel. schnell ans laufen gebracht :wink:
Könnte man ansonsten unter VBA auch externe Steuerelemente
einbinden?
Wenn ja, dann könnte man ja eben mal fix nen neues OCX
schreiben :smile:

Ja, das kann man. Rainer hat mir mal einen Schieberegler als ocx gebastelt und zugeschickt.
Funktierte sofort perfekt, tja nu, Made in Solingen, äh Raineringen bzw. Alexingen bürgt halt für Qualität :smile:)

PS: Sorry daß ich manchmal nicht auf deine Beiträge antworte, das liegt oft daran daß ich tagelang brauche um sie auch nur ansatzweise zu verstehen und dann habe ich vergessen daß ich da antworten möchte *gg*

Sei dir aber sicher, alle deine Aussagen habe ich gelesen Und ggfs./oft abgespeichert.

Bei realistischer Schätzung habe ich 2011 alle deine Codes und Erläuternegen von 2006-2008 „durchgearbeitet“. Problem wird dann sein, da hast ja wohl 2009-2011 wieder Neues geschrieben :smile:

Und dein Code-Output ist beträchtlich schneller und größer als mein Code-Kapier-Input *lächel*

Gruß
Reinhard