Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Anpassung Makro 32 +64-bit

Anpassung Makro 32 +64-bit
02.09.2024 12:41:53
mb12
Hallo liebe Helfer,

ich habe von Josef vor viiielen Jahren ein Makro erhalten, das ich jetzt auf 64-bit angepasst habe. Oben die alte Version, unten die neue.

Funktioniert, aber wie kann ich das Makro kürzen?

Lieben Dank, Margarete


Option Explicit


'Public Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As _
' ChooseColor) As Long
'Public Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
'Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
'Public Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal nXPos As Long, ByVal _
' nYPos As Long) As Long
'Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
'Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) _
' As Long


#If Win64 Then

Public Declare PtrSafe Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As _
ChooseColor) As Long
#Else
Public Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As _
ChooseColor) As Long
#End If

#If Win64 Then

Public Declare PtrSafe Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
#Else
Public Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
#End If

#If Win64 Then

Public Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
#Else
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
#End If

#If Win64 Then

Public Declare PtrSafe Function GetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal nXPos As Long, ByVal _
nYPos As Long) As Long
#Else
Public Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal nXPos As Long, ByVal _
nYPos As Long) As Long
#End If

#If Win64 Then

Public Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
#Else
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
#End If

#If Win64 Then

Public Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) _
As Long
#Else
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) _
As Long
#End If


Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Anpassung Makro 32 +64-bit
02.09.2024 12:47:54
Onur
Das ist eigentlich kein MAKRO, sondern sozusagen eine versionsübergreifende Deklaration, die gewährleistet, dass die Makros sowohl in 32-Bit als auch in 64-Bit-Umgebung laufen.
Wenn du die 32-er-Verssion nicht brauchst, einfach alles dazu löschen.
Also alle diese:
#If Win64 Then

und alles zwischen
#Else

und
#End If
Anzeige
AW: Anpassung Makro 32 +64-bit
02.09.2024 14:20:15
volti
Hallo Margarete,

mit Verlaub, aber wer hat Dir diese Anpassung auf 64 Bit gemacht. Die ist ja völlig falsch.

Unter 64 Bit und auch unter 32 Bit VBA7 ist nicht nur das Schlüsselwort PtrSafe zu verwenden, sondern alle Handle und Pointer sind auf LongPtr umzusetzen.
Die Long-Variante reicht hier in der Regel nicht und könnte von Windows abgeschnitten und damit ungültig werden.
Unter 64 Bit (ohne 32 Bit VBA7) wird sogar der neue Variablentyp Longlong empfohlen.

Da wundert es mich ehrlich gesagt, dass das bei Dir funktionieren soll. Aber nun denn, Du wirst es ja wissen.

Nachfolgend mal eine korrekte Umsetzung, die sowohl für 32 Bit wie auch für 64 Bit (VBA7, also kein altes Excel) VBA6) geeignet ist. Einzig WindowFromPoint ist hier kompliziert, da hier zwischen 64 und 32 Bit unterschieden werden muss. Hier gibt es verschiedene Varianten. Ich zeige hier die offizielle, aber es geht auch anders.

Um alles korrekt zu machen, müsste man aber Deinen Code sehen, denn auch hier müssen die Unterscheidungen entsprechend eingebaut sein.
Für Umsetzungen ist ein API-Viewer ganz gut. Hier mal mein API-Viewer, falls da Bedarf bestehen sollte.
https://www.clever-excel-forum.de/Thread-API-Viewer

BTW: Da wird GetDC verwendet, mir fehlt da jetzt noch ReleaseDC.....

Poste mal alles.

Code:


Option Explicit ' Nur für VBA7 in 32 und 64 Bit geeignet Public Declare PtrSafe Function CHOOSECOLOR Lib "comdlg32.dll" Alias "ChooseColorA" ( _ pChooseColor As CHOOSECOLOR) As Long Type CHOOSECOLOR lStructSize As Long hwndOwner As LongPtr hInstance As LongPtr rgbResult As Long lpCustColors As LongPtr flags As Long lCustData As LongPtr lpfnHook As LongPtr lpTemplateName As String End Type Public Declare PtrSafe Function GetWindowDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtr Public Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Type POINTAPI x As Long y As Long End Type Public Declare PtrSafe Function GetPixel Lib "gdi32" (ByVal hdc As LongPtr, _ ByVal x As Long, ByVal y As Long) As Long Public Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtr #If Win64 Then Public Declare PtrSafe Function WindowFromPoint Lib "user32" ( _ ByVal Point As LongLong) As LongPtr #Else Public Declare PtrSafe Function WindowFromPoint Lib "user32" ( _ ByVal xPoint As Long, ByVal yPoint As Long) As LongPtr #End If

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Anpassung Makro 32 +64-bit
02.09.2024 16:16:26
daniel
Hi
zum Verkürzen und Vereinfachen könnte man die Eingebauten Dialoge von Excel nutzen.
Da gibt es auch einen zur Farbwahl.
dieser färbt zwar eine Zelle, aber man kann ja diese Farbe dann auf andere Objekte übertragen.

Es ist zwar nicht ganz so komfortabel wie das was du hast (Farbänderung wird erst am Schluss sichtbar), aber dafür vom Code her ziemlich einfach und Anfängertauglich, wenn man mal den richtigen Dialog gefunden hat.

du brauchst also im allgemeinen Modul nur diesen Code:
Public Sub showForm()

Dim x
Dim col As Double
Set x = Selection
Application.ScreenUpdating = False
With Tabelle1.Cells(1, 1)
Application.Goto .Cells
If Application.Dialogs(xlDialogPatterns).Show Then
col = .Interior.color
x.Parent.Select
x.Interior.color = col
Else
x.Parent.Select
End If
End With

End Sub

der Rest des allgemeinen Moduls sowie die Userform entfällt komplett

Gruß Daniel
Anzeige
AW: Anpassung Makro 32 +64-bit
03.09.2024 06:26:05
mb12
nochmal vielen Dank Karl-Heinz und Daniel. Ich werde mich mit beiden Versionen beschäftigen - bin mal gespannt :-)

LG, Margarete
AW: Anpassung Makro 32 +64-bit
02.09.2024 14:29:35
volti
Eine Nachfrage hätte ich noch:

Bist Du sicher, dass Du 64-Bit Excel einsetzt? Oder ist nur der Rechner und damit das Betriebssystem auf Windows 64 Bit umgesetzt.

Bei 64 Bit Rechner und 32 Bit Excel greifen nämlich noch die alten Deklarationen. Sind die Declares in den #ELSE-Klauseln rot dargestellt?

Gruß
Karl-Heinz
Anzeige
AW: Anpassung Makro 32 +64-bit
02.09.2024 15:45:07
mb12
@Volti: Bei 64 Bit Rechner und 32 Bit Excel greifen nämlich noch die alten Deklarationen. Sind die Declares in den #ELSE-Klauseln rot dargestellt? ja, so ist es. Ich poste die gesamte Datei. für euch alle....

Habt lieben Dank für eure Mühe :-)

https://www.herber.de/bbs/user/171925.xlsm
Anzeige
AW: Anpassung Makro 32 +64-bit
02.09.2024 17:12:25
volti
Hallo Margarete,

wenn es ausschließlich darum geht, aus dem Userformshowbild aus einem Punkt die Farbe auszuwählen, ist ein Großteil der Deklarationen und des Codes gar nicht notwendig. Falls die nicht notwendigen Codeteile nicht für etwas anderes gedacht waren, so kannst Du diesen Code komplett in das Userformmodul einfügen.
Ich habe noch eine weitere Funktion zum Auflösen des DC eingefügt und alle anderen weggelöscht.

Im Modul1 kann alles weg, evtl. bis auf den Userformaufruf Sub showForm.

Bei mir läufts. Ich habe 64 Bit Excel.

Code:


Option Explicit Private Declare PtrSafe Function GetPixel Lib "gdi32" (ByVal hdc As LongPtr, _ ByVal x As Long, ByVal y As Long) As Long Private Declare PtrSafe Function GetWindowDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtr Private Declare PtrSafe Function ReleaseDC Lib "user32" ( _ ByVal hwnd As LongPtr, ByVal hdc As LongPtr) As Long Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Type POINTAPI x As Long y As Long End Type Dim color As Long Private Sub Image1_Click() On Error Resume Next If color > -1 Then Selection.Interior.color = color End Sub Private Sub Image1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _ ByVal x As Single, ByVal y As Single) If Button = 2 Then Selection.Interior.ColorIndex = xlNone End Sub Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _ ByVal x As Single, ByVal y As Single) Dim oPoint As POINTAPI Dim hwnd As LongPtr, hdc As LongPtr If GetCursorPos(oPoint) <> 0 Then hdc = GetWindowDC(0) ' Device Context holen Call GetCursorPos(oPoint) ' Pixelpunkt holen color = GetPixel(hdc, oPoint.x, oPoint.y) ' ixelfarbe holen ReleaseDC 0, hdc ' Device Context auflösen End If End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then Cancel = Not MsgBox("Dialog schließen?", vbOKOnly + vbYesNo) = vbYes End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz
Anzeige
AW: Anpassung Makro 32 +64-bit
02.09.2024 22:42:05
volti
Apropos Code kürzen.

Ich habe mir das noch mal angesehen und frage mich, warum der Codeschreiber (Josef?) die Farbermittlung in der Mousemove-Sub und mit doppelter Punktermittlung durchführen lässt. Wäre z.B. gut, wenn man bei Mausbewegung die RGB anzeigen wollte.

Aber so, naja, ich denke, dass der u.a. Code hier auch reichen müsste. Also mal länger testen....

Code:


Option Explicit Private Declare PtrSafe Function GetPixel Lib "gdi32" (ByVal hdc As LongPtr, _ ByVal x As Long, ByVal y As Long) As Long Private Declare PtrSafe Function GetWindowDC Lib "user32" (ByVal hWnd As LongPtr) As LongPtr Private Declare PtrSafe Function ReleaseDC Lib "user32" ( _ ByVal hWnd As LongPtr, ByVal hdc As LongPtr) As Long Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Type POINTAPI x As Long y As Long End Type Private Sub Image1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _ ByVal x As Single, ByVal y As Single) Dim tPT As POINTAPI, hdc As LongPtr With Selection.Interior If Button = 2 Then .ColorIndex = xlNone Else hdc = GetWindowDC(0) ' Device Context holen GetCursorPos tPT ' Pixelpunkt holen .color = GetPixel(hdc, tPT.x, tPT.y) ' Pixelfarbe holen ReleaseDC 0, hdc ' Device Context auflösen End If End With End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then Cancel = Not MsgBox("Dialog schließen?", vbQuestion + vbYesNo) = vbYes End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Anpassung Makro 32 +64-bit
02.09.2024 12:49:03
Onur
"und alles zwischen " heisst inklusive Else und End If
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige