dass es durch aus sinnvoll wäre, bei Nutzung eines modernen Rechners (Win 64 Bit) auch die entsprechenden API-Befehle hierfür zu nutzen. Es sei denn, es ist ein Mammutprojekt und man will sich das sparen. Davon gehe ich hier aber nicht aus.
Das ganze schließt die Nutzung der 32-Bit-Excel-Version ja nicht aus. Die LongPtr Verwendung im Excel-Code wird sowohl von 32 Bit wie auch von 64 Bit, (VBA 7) unterstützt. Die einige Jahre von mir verwendete Doppelprogrammierung per Compliiler-#IF mache ich auch nicht mehr. Wer hat schon noch so alte Versionen. Die LongLong-Varianten sieht man eher selten bis gar nicht.
Das Suchen von "Private Declare..." ist u.U. sehr einseitig. Man kann seine Declares auch Public machen oder gar kein Private/Public verwenden. U.U. müssen, wie schon mehrfach angeführt, auch Variablen umgestellt werden.
Gruß KH
Folgende(r) 1 Nutzer sagt Danke an volti für diesen Beitrag:1 Nutzer sagt Danke an volti für diesen Beitrag 28 • Karthagos
Hallo und danke an alle, die sich so ausführlich mit dem Thema beschäftigt haben. Hab wieder mal keine weitere Forum-Benachrichtigung bekommen, deswegen dachte ich, das Thema sei mit dem Beitrag #3 von Knobbi38 bzw. meiner Antwort #4 erledigt. Jetzt habe ich aber doch wieder etwas Hoffnung Ich arbeite seit vielen Jahren mit Excel (glaube ungefähr seit Ende der Achtziger Jahre), also auch schon zu XP-Zeiten. Seitdem hat sich ja, spätestens mit der Umstellung auf die Ribbon-Menüs, einiges getan. Leider bin ich, trotz verschiedener Versuche, an der Makro-Programmierung immer gescheitert, hatte aber viele Jahre eine perfekte externe Hilfe eines Freundes, die mir allerdings seit längerem nicht mehr zur Verfügung steht. Vorweg noch, wenn ich eine Excel-Datei mit der Makro-Endung xlsm aufrufe und damit Excel starte, kommt dieses Fenster: schließt aber nach einiger Zeit ohne Erfolg. Starte ich die gleiche Datei mit „Datei öffnen“ über Excel, wird sie geöffnet, evtl. kommen VBA-Fehlermeldungen.
Ich starte meine gesammelten Makro-Werke über eine gjribbon.xlam als Add-In mit zwei eigenen Ribbons, die sich zwischen die Ribbons Datei und Start setzen. Darin sind die Makros in verschiedenen Rubriken wie Menü, Datei, Zahlenformate, etc. geordnet und haben eigene, von mir erstellte Icons, was mir das schnelle finden der gewünschten Befehle erleichtert. Außerdem habe ich noch eine Icontoolbar.xlam, die in bzw. hinter der Schnellzugriffsleiste aktiv ist. Hier habe ich die Icons aus dem MS Icon-Katalog zugewiesen, der wesentlich umfangreicher ist, als die paar über die Schnellzugriffleiste. Dann habe ich noch eine Suchleiste per Makro, die ich in einigen Dateien verwende und die jetzt auch nicht mehr funktioniert. Habe mal die Anleitung als Word-Datei (AutoFilter-Kriterium eingeben.docx) beigefügt. b.t.w. Word zickt mit den Makros nach der Umstellung auf 64 bit nicht rum, wohl eine andere Architektur? Die entsprechenden xlam's füge ich bei, sind keine Watergate-Geheimnisse Hoffe, ihr seid vom Umfang nicht erschlagen.
Gruß Günther ________________________________________________________________ Windows 11 Pro Version 24H2 • Microsoft Office Professional 2024 - 64 bit
zu den u.a. Declares schon mal folgende Umsetzung und Erläuterungen:
Ich würde die GetKeyState-Funktion nur einmalig Public deklarieren und alle anderen aus Deiner Datei entfernen.
Die SetNumLock-Funktion funktioniert jetzt bei mir, sie wird aber zumindest in dieser Datei gar nicht aufgerufen.
Das andere Thema mit dem Passwort enthält mir nicht bekannte Funktionen. Das dauert noch ein wenig.... Ist aber alles überschaubar
Code:
' Es reicht, wenn diese Funktion GetKeyState einmalig Public deklariert wird ' Alle anderen Declares können entfernt werden, KHV 09.12.2025 Public Declare PtrSafe Function GetKeyState Lib "user32" ( _ ByVal nVirtKey As Long) As Integer
Private Declare PtrSafe Sub keybd_event Lib "user32" ( _ ByVal bVk As Byte, ByVal bScan As Byte, _ ByVal dwFlags As Long, ByVal dwExtraInfo As LongPtr) Private Declare PtrSafe Function GetKeyboardState Lib "user32" ( _ pbKeyState As Byte) As Long Private Declare PtrSafe Function SetKeyboardState Lib "user32" ( _ lppbKeyState As Byte) As Long
Function SetNumLock(bStatus As Boolean) As Boolean Dim R As Variant Dim NumLockOn As Boolean Dim KeyTable(0 To 255) As Byte
R = GetKeyboardState(KeyTable(0)) NumLockOn = (KeyTable(VK_NUMLOCK) <> 0)
If (bStatus And Not NumLockOn) Or _ (Not bStatus And NumLockOn) Then keybd_event VK_NUMLOCK, _ &H45, _ KEYEVENTF_EXTENDEDKEY Or 0, 0 keybd_event VK_NUMLOCK, _ &H45, _ KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0 End If End Function
Sub noaction(control As IRibbonControl)
End Sub
_________ viele Grüße Karl-Heinz
Folgende(r) 1 Nutzer sagt Danke an volti für diesen Beitrag:1 Nutzer sagt Danke an volti für diesen Beitrag 28 • Karthagos
danke für Deine Nachricht. Damit ich nichts falsch mache, ich habe die Makros der gjribbon.xlam mal alle separat gespeichert: wo muss ich jetzt die Änderungen der GetKeyState-Funktion vornehmen bzw. die überflüssigen löschen?
Was meinst Du mit "Thema mit dem Passwort"?
Gruß Günther ________________________________________________________________ Windows 11 Pro Version 24H2 • Microsoft Office Professional 2024 - 64 bit
bitte erläutere noch mal wofür die Funktion Passwort holen, eingesetzt wird.
Wenn lediglich die Nachricht EMSETPASSWORDCHAR an die Inputbox gesendet werden soll, ginge das mit deutlich weniger code. Man muss die Editbox nicht wie dort gemacht umständlich suchen, die ID für einen Direktzugriff ist bekannt.
Und wofür wird GetFuncAdress benötigt?
Rufst Du diese von außen irgendwie auf. Hier im AddIn wird sie zumindest nicht aufgerufen. Vielleicht kann das ja weg.
09.12.2025, 21:06 (Dieser Beitrag wurde zuletzt bearbeitet: 09.12.2025, 21:11 von volti.)
Hallo Günther,
mein Vorschlag für die Passwortabfrage......
Code:
Private Declare PtrSafe Function SetTimer Lib "user32" ( _ ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, _ ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr Private Declare PtrSafe Function KillTimer Lib "user32" ( _ ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Long Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr Private Declare PtrSafe Function SendDlgItemMessageA Lib "user32" ( _ ByVal hDlg As LongPtr, ByVal nIDDlgItem As Long, _ ByVal wMsg As Long, ByVal wParam As LongPtr, _ ByVal lParam As LongPtr) As LongPtr Private Const EM_SETPASSWORDCHAR As Long = &HCC Dim mhTimer As LongPtr
Public Function PasswortHolen(Optional Beschriftung As String = "Geben sie ihr Passwort ein!") As String mhTimer = SetTimer(0, 0, 25, AddressOf Passwortcallback) PasswortHolen = InputBox(Beschriftung, "Passwortabfrage") End Function
Private Sub Passwortcallback() If mhTimer <> 0 Then KillTimer 0, mhTimer: mhTimer = 0 ' Timer löschen SendDlgItemMessageA GetActiveWindow(), 4900, EM_SETPASSWORDCHAR, 42, 0 End Sub
_________ viele Grüße Karl-Heinz
Hallo,
den kompletten, geposteten und korrigierten Code ins Modul Basis.
In allen anderen Modulen den roten code (GetFKeyState) ganz am Anfang weglöschen.
Hallo Karl-Heinz, habe die entsprechenden Änderungen in der gjribbon.xlam vorgenommen und die Datei über >Optionen Add-Ins eingebunden. Es kommen folgende Fehlermeldungen: und dann abwechselnd: und etliche Male, musste ich immer mit OK bestätigen.
Gruß Günther ________________________________________________________________ Windows 11 Pro Version 24H2 • Microsoft Office Professional 2024 - 64 bit
Moin Karl-Heinz, vielen Dank für Deine Mühe und das Resultat. Bewundernswert, wenn man sich in VBA so auskennt wie Du Ich kann zwar noch nicht alles überblicken, aber so wie es aussieht, funktioniert es (mit einigen Stichproben) perfekt. Ich bin Happy . Sollte es wirklich irgendwo noch hängen, darf ich mich bestimmt noch mal melden. Auch wenn die Meinungen über die Nutzung der 64 bit-Version auseinandergehen, ist es toll, wenn man dafür jetzt gerüstet ist.
Nur der Vollständigkeit halber; beim Starten der Datei kamen, anscheinend durch neue MS Einstellungen erst mal folgende Fehlermeldungen: und Hab mich dann erst mal mit der geschützten Ansicht befasst und die Haken entfernt: Und dann noch den Add-Inn-Speicherort zu vertrauenswürdig hinzufügen: War das so richtig?
Kannst Du Dir bitte auch einmal das Makro txtDirektFilter anschauen, das ich in einige Dateien eingebunden habe, um schnell nach einem Suchbegriff zu filtern. Das Makro sieht so aus:
Code:
Private blnSkipChange As Boolean Private Const FILTERFLDNUM As Integer = 1 Private Sub txtDirektFilter_Change() Dim af As AutoFilter Dim rgAf As Range If blnSkipChange Then Exit Sub On Error Resume Next Set af = Me.AutoFilter If af Is Nothing Then Exit Sub Set rgAf = af.Range If Len(CStr(Me.txtDirektFilter.Value)) > 0 Then rgAf.AutoFilter _ Field:=FILTERFLDNUM, _ Criteria1:="*" & _ Me.txtDirektFilter.Value & "*" Else rgAf.AutoFilter Field:=FILTERFLDNUM End If Set rgAf = Nothing Set af = Nothing End Sub Private Sub Worksheet_SelectionChange( _ ByVal Target As Range) Dim af As AutoFilter Dim rgAf As Range On Error Resume Next Set af = Me.AutoFilter If af Is Nothing Then Exit Sub If af.Filters(FILTERFLDNUM) _ .Criteria1 <> "=*" & _ Me.txtDirektFilter.Value & "*" Then blnSkipChange = True Me.txtDirektFilter.Value = "" blnSkipChange = False End If Set af = Nothing End Sub
Die Erklärung ist in beigef. AutoFilter-Kriterium eingeben.docx.
Gruß Günther ________________________________________________________________ Windows 11 Pro Version 24H2 • Microsoft Office Professional 2024 - 64 bit
bei Problemen mit API-Umsetzungen 32/64 Bit kannst Du Dich gerne wieder hier melden.
Die anderen Dinge wie die Fehlermeldungen und der gepostete Filtercode haben damit nichts zu tun. Da müssten Einstellungen am Rechner gemacht werden bzw. der Code sollte auch unter 64 Bit problemlos laufen.
Konnte ich nicht testen...
Viele Grüße aus Hessen Karl-Heinz
Folgende(r) 1 Nutzer sagt Danke an volti für diesen Beitrag:1 Nutzer sagt Danke an volti für diesen Beitrag 28 • Karthagos