Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Variabel deklarieren. Aber der Chinese geht Reis kochen!

Forumthread: Variabel deklarieren. Aber der Chinese geht Reis kochen!

Variabel deklarieren. Aber der Chinese geht Reis kochen!
09.02.2025 13:16:36
Chatzebuseli
Hallo Leute.
Ich bin da nochmel an die Thematik Listbox einträge einfärben gegangen.
Nun ja die Chinesen haben da ja jetz auch ne KI.
Hab zu der Thematik mit der mal einwenig rummgespielt. Und doch einige interessante SUb's generiert.
Aber ja irgendwann muss die scheibar dann doch Reis kochen gehen....

Darum würde mich hier mal eure meinung dazu Interessiern:




'Das Zeug soll laut dem Computerchinesen unter Option Explicit

' API-Deklarationen für benutzerdefiniertes Zeichnen
Private Declare PtrSafe Function SetTextColor Lib "gdi32" (ByVal hDC As Long, ByVal crColor As Long) As Long
Private Declare PtrSafe Function SetBkColor Lib "gdi32" (ByVal hDC As Long, ByVal crColor As Long) As Long
Private Declare PtrSafe Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Private Declare PtrSafe Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Private Declare PtrSafe Function FillRect Lib "user32" (ByVal hDC As Long, lpRect As RECT, ByVal hBrush As Long) As Long
Private Declare PtrSafe Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

' RECT-Struktur für das Zeichnen
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type


'Und da macht er in der Userform ne eigene Sub was mir einleuchtet.
' DrawItem-Ereignis für die ListBox
Private Sub ListBox1_DrawItem(ByVal Index As Long, ByVal hDC As Long, ByRef Rect As RECT, ByVal State As Long)
Dim TextColor As Long
Dim BackColor As Long
Dim CellValue As Double
Dim i As Integer
Dim strText As String
Dim cellRect As RECT

' Wert in Spalte 5 (Index 4) überprüfen
CellValue = CDbl(ListBox1.List(Index, 4))

' Farben basierend auf dem Wert festlegen
If CellValue 0 Then
TextColor = vbRed ' Rot für negative Werte
BackColor = vbWhite ' Weißer Hintergrund
Else
TextColor = vbGreen ' Grün für positive Werte
BackColor = vbWhite ' Weißer Hintergrund
End If

' Hintergrund zeichnen
Dim hBrush As Long
hBrush = CreateSolidBrush(BackColor)
FillRect hDC, Rect, hBrush
DeleteObject hBrush

' Textfarbe setzen
SetTextColor hDC, TextColor
SetBkColor hDC, BackColor

' Text für jede Spalte zeichnen
For i = 0 To ListBox1.ColumnCount - 1
strText = ListBox1.List(Index, i)
cellRect = Rect
cellRect.Left = cellRect.Left + (i * 100) ' Spaltenbreite anpassen
TextOut hDC, cellRect.Left + 5, cellRect.Top + 2, strText, Len(strText)
Next i
End Sub


Dann will er in in Userform Initialized folgendes:

Private Sub UserForm_Initialize()

ListBox1.Style = fmStyleOwnerDrawFixed
End Sub


Wenn ich das starte kommt bei (fmStyleOwnerDrawFixed) die Meldung Variabel nicht definiert.

Wenn ich nun den Chinesen im PC suche ist der am Reis kochen. Aber wir werden doch wohl so ne dämliche Variabel definieren können. Aber wo als was?

Hat da jemand ne Idee.
Klar ist wenn ihr Reis kochen geht wird es wohl nicht funktionieren. Aber wenn wir es gemeinsam hinkriegen könnte es eine interessantes Gedget werden!

E liebs Griessli

Chatzebuseli
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Variabel deklarieren. Aber der Chinese geht Reis kochen!
09.02.2025 13:35:00
Alwin Weisangler
Hallo Chatzebuseli,

die KI hat Fehler geliefert.
Manche Variablen benötigen LongPtr statt Long so wie hier beispielhaft:


Private Declare PtrSafe Function SetTextColor Lib "gdi32" (ByVal hDC As Long, ByVal crColor As Long) As Long ' falsch
Private Declare PtrSafe Function SetTextColor Lib "gdi32" (ByVal hdc As LongPtr, ByVal crColor As Long) As Long ' korrekt

Ärgere einfach mal die KI damit.

Gruß Uwe
Anzeige
AW: Variabel deklarieren. Aber der Chinese geht Reis kochen!
09.02.2025 13:37:49
Onur
Du bist ja überhaupt nicht rassistisch - oder ???
AW: Variabel deklarieren. Aber der Chinese geht Reis kochen!
09.02.2025 14:16:48
Ulf
Hi,
die Variable hat den Wert 1, aber in 2019 gibt es nur ListStyle.
Private Enum DrawMode

Normal = 0 'All the elements in a control are drawn by the operating system and are of the same size.
OwnerDrawFixed = 1 'All the elements in the control are drawn manually and are of the same size.
OwnerDrawVariable = 2 'All the elements in the control are drawn manually and can differ in size.
End Enum


ListBox1.Style = DrawMode.OwnerDrawFixed

Wo ist das Subclassing der Box geblieben, wer die 42 bestellt und 0815 bekommt
Sieht funktionierend aus für VB.Net
hth
Ulf
Anzeige
AW: Variabel deklarieren. Aber der Chinese geht Reis kochen!
09.02.2025 16:41:55
Chatzebuseli
Lieber Ulf

Ich nehme an du beziehst dich mit 2019 auf das Jahr der Excel version.
Ich habe die 2016 Version

E liebs Griessli
Chatzebuseli
AW: Variabel deklarieren. Aber der Chinese geht Reis kochen!
09.02.2025 17:20:07
Chatzebuseli
Hallo Leute
Also ich Scheitere nun daran das Listbox1.style nicht ünterstützt wird.
Und bei Listbox1.ListStyle läufts zwar, weil er es kennt. Aber die Schriftfarbe ändern... war noch immer nix!
Ich glaube ich bin wieder am Anfang!

Na ja! Wenn noch jemand ne Idee hat......

E liebs Greissli
Chatzebuseli
Anzeige
AW: Variabel deklarieren. Aber der Chinese geht Reis kochen!
09.02.2025 20:27:20
Alwin Weisangler
Hallo Chatzebuseli,

es fehlt in deinen Start des Userforms der parametrische Prozeduraufruf: Call ListBox1_DrawItem( , , , ,)
Trotzdem keine Chance.
Hast du mal drüber nachgedacht dies mit einem Listview Control zu machen.
Wenn dir Listview installationsbedingt nicht zur Verfügung steht gibt es noch die etwas ressourcenfressende Möglichkeit so was wie eine Listbox nach zu programmieren.

Gruß Uwe
Anzeige
AW: Variabel deklarieren. Aber der Chinese geht Reis kochen!
11.02.2025 15:37:17
volti
Hallo zusammen,

ein spannendes Thema hier und deswegen wollte ich es noch mal aufgreifen.

Mir ist es nicht gelungen, Excel dazu zu bewegen diese vom "Chinesen" vorgeschlagene Funktion aufzurufen.
Wahrscheinlich geht das hier in Office auch gar nicht.

Was würde denn überhaupt übergeben?
Ein hDC (Device Context) nur für eine Zeile und der passende Bereich RECT dazu.
Wenn mit Textout irgendwas geschrieben wird, wird standardmäßig der Systemfont verwendet. Oder ist schon die passende Schriftart in den hDC gezogen worden?
Auch müsste nicht nur diese Zeile geschrieben werden, sondern auch alle anderen, denn eine davon ist wahrscheinlich markiert, hat andere Farben.

Eine Methode einer Listbox Dinge beizubringen, die sie normalerweise nicht kann, geht z.B. über das Einhooken in die Userform oder gleich in die Listbox selbst.

Einen Ansatz dazu habe ich mal in der Anlage begonnen. Wer Lust hat, kann ja mal da rein schauen und seinen Kommentar dazu hinterlassen.
Da kann man dann ja jetzt alles Mögliche anstellen: Popup für jede Zeile, Rechtsklick, Doppelklick, Mousemove und und und

PS: Man muss dann aber auch komplett das Managen der Listbox selbst übernehmen. Und dann wird es schnell umfangreich und kompliziert, um alle Eventualitäten abzufangen.
Also: Nur als Anschauungsmaterial ein angefangenes Beispiel, das mit Sicherheit noch einige Mängel aufweist.

https://www.herber.de/bbs/user/175613.xlsb

Aber wer es brauchen kann.... :-)

Gruß
KH
Anzeige
AW: Variabel deklarieren. Aber der Chinese geht Reis kochen!
09.02.2025 13:37:18
Onur
Du bist ja überhaupt nicht rassistisch - oder ???
AW: Variabel deklarieren. Aber der Chinese geht Reis kochen!
09.02.2025 13:38:37
Onur
Sorry, Uwe - falscher Thread-Zweig!
AW: Variabel deklarieren. Aber der Chinese geht Reis kochen!
09.02.2025 16:39:50
Chatzebuseli
Lieber Uwe
Das ist herausgekommen mit deepSeek:

Ja, du hast absolut Recht! Die Deklaration der API-Funktionen in VBA muss an die Bit-Breite (32-Bit oder 64-Bit) von Excel angepasst werden. Seit Excel 2010 gibt es sowohl eine 32-Bit- als auch eine 64-Bit-Version, und die API-Deklarationen müssen entsprechend angepasst werden.
Unterschied zwischen 32-Bit und 64-Bit:

32-Bit: Verwendet Long für Handles (z. B. hDC).

64-Bit: Verwendet LongPtr für Handles, da diese 64-Bit-Werte sind.

Korrekte API-Deklarationen für 64-Bit Excel:

Hier sind die korrekten Deklarationen für 64-Bit Excel:
vba
Copy

#If VBA7 Then
' 64-Bit-Deklarationen
Private Declare PtrSafe Function SetTextColor Lib "gdi32" (ByVal hdc As LongPtr, ByVal crColor As Long) As Long
Private Declare PtrSafe Function SetBkColor Lib "gdi32" (ByVal hdc As LongPtr, ByVal crColor As Long) As Long
Private Declare PtrSafe Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As LongPtr, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Private Declare PtrSafe Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As LongPtr
Private Declare PtrSafe Function FillRect Lib "user32" (ByVal hdc As LongPtr, lpRect As RECT, ByVal hBrush As LongPtr) As Long
Private Declare PtrSafe Function DeleteObject Lib "gdi32" (ByVal hObject As LongPtr) As Long
#Else
' 32-Bit-Deklarationen
Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
#End If

Erklärung:

#If VBA7 Then: Diese Compiler-Direktive überprüft, ob die VBA-Umgebung VBA7 (64-Bit) oder älter (32-Bit) ist.

LongPtr: Ein Datentyp, der in 64-Bit-Umgebungen verwendet wird, um sowohl 32-Bit- als auch 64-Bit-Werte zu unterstützen.

PtrSafe: Gibt an, dass die Deklaration für 64-Bit-Umgebungen sicher ist.

Anpassung des DrawItem-Ereignisses:

Da hdc jetzt als LongPtr deklariert ist, müssen wir auch das DrawItem-Ereignis anpassen:
vba
Copy

Private Sub ListBox1_DrawItem(ByVal Index As Long, ByVal hdc As LongPtr, ByRef Rect As RECT, ByVal State As Long)
Dim TextColor As Long
Dim BackColor As Long
Dim CellValue As Double
Dim i As Integer
Dim strText As String
Dim cellRect As RECT

' Wert in Spalte 5 (Index 4) überprüfen
CellValue = CDbl(ListBox1.List(Index, 4))

' Farben basierend auf dem Wert festlegen
If CellValue 0 Then
TextColor = vbRed ' Rot für negative Werte
BackColor = vbWhite ' Weißer Hintergrund
Else
TextColor = vbGreen ' Grün für positive Werte
BackColor = vbWhite ' Weißer Hintergrund
End If

' Hintergrund zeichnen
Dim hBrush As LongPtr
hBrush = CreateSolidBrush(BackColor)
FillRect hdc, Rect, hBrush
DeleteObject hBrush

' Textfarbe setzen
SetTextColor hdc, TextColor
SetBkColor hdc, BackColor

' Text für jede Spalte zeichnen
For i = 0 To ListBox1.ColumnCount - 1
strText = ListBox1.List(Index, i)
cellRect = Rect
cellRect.Left = cellRect.Left + (i * 100) ' Spaltenbreite anpassen
TextOut hdc, cellRect.Left + 5, cellRect.Top + 2, strText, Len(strText)
Next i
End Sub

Wie überprüfe ich, ob ich 32-Bit oder 64-Bit Excel verwende?

Öffne Excel.

Gehe zu Datei > Konto.

Klicke auf Über Excel.

Dort steht, ob du die 32-Bit- oder 64-Bit-Version verwendest.

Fazit:

Verwende die 64-Bit-Deklarationen, wenn du 64-Bit Excel verwendest.

Die korrekte Deklaration für SetTextColor in 64-Bit Excel lautet:
vba
Copy

Private Declare PtrSafe Function SetTextColor Lib "gdi32" (ByVal hdc As LongPtr, ByVal crColor As Long) As Long

Falls du weitere Fragen hast oder Hilfe bei der Implementierung benötigst, lass es mich wissen! 😊


Nur zur Info

E liebs Griessli
Chatzebuseli
Anzeige
AW: Variabel deklarieren. Aber der Chinese geht Reis kochen!
09.02.2025 14:10:28
Alwin Weisangler
@onur,

alles gut, ich habe mich auch nicht angesprochen gefühlt und habe nur auf Fehler der Variablendeklarationen in den API Funktionen hingewiesen.
KI nutze ich aus Prinzip nicht, weil ich meine grauen Zellen mit so was besser in Schuss gehalten bekomme als mir vorgekautes von irgendwo auch immer aus Bequemlichkeit servieren zu lassen.

Schönes Wochenende noch.

Gruß Uwe
Anzeige
Anzeige
Anzeige