Makros von Excel 32 bit in 64 bit verwenden
#11
Hallo zusammen,

zu den Tipps hier denke ich,

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:
  • Karthagos
Antworten Top
#12
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  28
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  60 Hoffe, ihr seid vom Umfang nicht erschlagen.


Angehängte Dateien
.xlam   gjribbon.xlam (Größe: 168,39 KB / Downloads: 4)
.xlam   icontoolbar.xlam (Größe: 18,8 KB / Downloads: 4)
.docx   AutoFilter-Kriterium eingeben.docx (Größe: 613,5 KB / Downloads: 4)
Gruß Günther
________________________________________________________________
Windows 11 Pro Version 24H2 • Microsoft Office Professional 2024 - 64 bit
Antworten Top
#13
Hallo Günther,


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 19


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
        
Private Const VK_NUMLOCK = &H90
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2


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:
  • Karthagos
Antworten Top
#14
Hallo Karl-Heinz,

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
Antworten Top
#15
Hallo Günther,

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.

Gruß
KH
Antworten Top
#16
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.

Das sollte helfen.

Gruß
KH
Antworten Top
#17
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
Antworten Top
#18
Hallo Günther,

hier Deine Datei zurück.


.xlam   gjribbon.xlam (Größe: 164,54 KB / Downloads: 3)

Für die Passwortbfrage habe ich meine codereduzierte Version eingebaut und alle überflüssigen Declares entfernt.

Teste es jetzt einfach mal. 

PS: Den Codeteil GetFuncAdress im Modul mdlInputBoxPass habe ich zwar umgesetzt. Ich denke aber, dass Du das nicht (mehr) brauchst. 

Gruß
Karl-Heinz
Antworten Top
#19
Moin Karl-Heinz,
vielen Dank für Deine Mühe und das Resultat. Bewundernswert, wenn man sich in VBA so auskennt wie Du  18
Ich kann zwar noch nicht alles überblicken, aber so wie es aussieht, funktioniert es (mit einigen Stichproben) perfekt.
Ich bin Happy 19 . 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.


Angehängte Dateien
.docx   AutoFilter-Kriterium eingeben.docx (Größe: 613,5 KB / Downloads: 2)
Gruß Günther
________________________________________________________________
Windows 11 Pro Version 24H2 • Microsoft Office Professional 2024 - 64 bit
Antworten Top
#20
Moin Günther,

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:
  • Karthagos
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste