Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1840to1844
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

API-Funktionen

API-Funktionen
16.08.2021 06:20:55
Peter
Guten Morgen,
ich verwende in meiner Excel-Datei API-Funktionen.
Könnt ihr mir bitte dabei helfen, diese Fit zu machen, für 32 und 64 Bit je nachdem welches System vorhanden ist.

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function GetSystemMenu Lib "user32" ( _
ByVal hwnd As LongPtr, ByVal bRevert As Long) As LongPtr
Private Declare PtrSafe Function DeleteMenu Lib "user32" ( _
ByVal hMenu As LongPtr, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Besten Dank
Gruss
Peter

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: API-Funktionen
16.08.2021 08:29:56
volti
Hallo Peter,
meinst Du so etwas hier?
vielleicht hilft Dir auch mein API-Viewer weiter....
API-Viewer
Code:

[Cc][+][-]

#If VBA7 Or Win64 Then Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As LongPtr Private Declare PtrSafe Function DeleteMenu Lib "user32" ( _ ByVal hMenu As LongPtr, _ ByVal nPosition As Long, _ ByVal wFlags As Long) As Long Private Declare PtrSafe Function GetSystemMenu Lib "user32" ( _ ByVal hWnd As LongPtr, _ ByVal bRevert As Long) As LongPtr Private hWnd As LongPtr #Else Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare Function DeleteMenu Lib "user32" ( _ ByVal hMenu As Long, _ ByVal nPosition As Long, _ ByVal wFlags As Long) As Long Private Declare Function GetSystemMenu Lib "user32" ( _ ByVal hwnd As Long, _ ByVal bRevert As Long) As Long Private hWnd As Long #End If

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

Anzeige
AW: API-Funktionen
16.08.2021 10:05:13
Peter
Hallo Karl-Heinz,
vielen Dank für Deine Hilfe. Das sieht sehr vielversprechend aus.
Nochmal zur Absicherung:
Betriebssystem Windows7 und bzw. Windows 10, sowie Office 2013, 2016 und ggf. Office 365.
Ist das so wie Du es angeführt hast sicher verwendbar?
Ich suche nach einer Lösung, weil die Excel-Datei bei mir - Windows 10 und Office 2013 stabil ist,
jedoch bei Windows 7 und Office 2016 nicht ordnungsgemäss speichert und damit beim Wiedereröffnen zur Fehlermeldung führt.
Gruss
Peter
nur mal so dazwischen...
16.08.2021 11:15:42
Oberschlumpf
Hi Peter,
Zitat: Ist das so wie Du es angeführt hast sicher verwendbar?
Gegenfrage: Hast du das Codebeispiel von Karl-Heinz denn mal ausprobiert? Wenn nein, wieso nicht? Dann könntest du deine von mir zitierte Frage doch ganz leicht selbst beantworten.
Ciao
Thorsten
Anzeige
AW: API-Funktionen
16.08.2021 11:27:55
volti
Hallo Peter,
das ist sicher verwendbar.
Die Compilerschalter besagen, dass ab der VBA.Version 7 bzw. bei Win64-Systemen die neuen Declares mit dem Schlüsselwort PtrSafe und den LongPtr-Variablentypen verwendet werden und bei älteren Excelversionen eben noch die alten Declares.
Die Schalter-Angabe "VBA7" dürfte bei 32-Bit-Excel optional sein, da hier noch beide Welten gemanagt werden.
Gruß KH
AW: API-Funktionen
16.08.2021 11:33:21
volti
Noch ein Nachtrag:
Da ich Deinen Code ja nicht kenne:
In Deinem Code sind natürlich auch die jeweiligen Variblentypen und Strukturen compilermäßig zu trennen, sonst kann das zu Problemen führen.
Ein Beispiel für eine globaldeklarierte Handlevariable hWnd hatte ich im Declarebeispiel ja schon gezeigt...
Gruß KH
Anzeige
AW: API-Funktionen
17.08.2021 12:08:50
Peter
Hallo Karl-Heinz,
ich habe leider ein Verständnisproblem.
Deine Info: "Ein Beispiel für eine globaldeklarierte Handlevariable hWnd hatte ich im Declarebeispiel ja schon gezeigt..."
weiss ich nicht wo diese ist.
Ich habe in eine UF nach Option Explicit die Daten eingefügt geht jedoch nicht. Nach Else ist alles rot. Beim Kompilieren wird VBA7 markiert und die Fehlermeldung - Ausserhalb einer Prozedur ungültig.
Kannst Du mir bitte helfen, wie ich genau vorgehen soll.
Gruss
Peter
AW: API-Funktionen
17.08.2021 13:16:59
Peter
Nachtrag:
Ich habe jetzt folgendes eingefügt:

#If Win64 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function DeleteMenu Lib "user32" ( _
ByVal hMenu As LongPtr, _
ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Private Declare PtrSafe Function GetSystemMenu Lib "user32" ( _
ByVal hWnd As LongPtr, _
ByVal bRevert As Long) As LongPtr
Private hWnd As LongPtr
#Else
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function DeleteMenu Lib "user32" ( _
ByVal hMenu As Long, _
ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Private Declare Function GetSystemMenu Lib "user32" ( _
ByVal hwnd As Long, _
ByVal bRevert As Long) As Long
Private hWnd As Long
#End If
Nach Kompilieren keine Fehler mehr.
Frage warum bleibt der Text nach "Else" rot? Hängt das damit zusammen, dass das System 64 Bit und nicht weniger hat?
Gruss
Peter
Anzeige
AW: API-Funktionen Fehleer
17.08.2021 13:33:40
Peter
Ich habe jetzt festgestellt, dass in der Deklaration nach Declare der Wert fehlt.
Aber welcher?
Gruss
Peter
AW: API-Funktionen Fehleer
17.08.2021 14:40:14
Oberschlumpf
Peter, du hast eingefügt, schreibst du, aber WO genau hast du den Code eingefügt?
Ich habe....in ein allgemeines Modul....in einer neu erstellten Excel-Datei...diesen Code eingefügt

Option Explicit
#If Win64 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function DeleteMenu Lib "user32" ( _
ByVal hMenu As LongPtr, _
ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Private Declare PtrSafe Function GetSystemMenu Lib "user32" ( _
ByVal hWnd As LongPtr, _
ByVal bRevert As Long) As LongPtr
Private hWnd As LongPtr
#Else
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function DeleteMenu Lib "user32" ( _
ByVal hMenu As Long, _
ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Private Declare Function GetSystemMenu Lib "user32" ( _
ByVal hWnd As Long, _
ByVal bRevert As Long) As Long
Private hWnd As Long
#End If
Sub test()
MsgBox "test"
End Sub
Nach starten des Makros "test" wird in einer MsgBox-Meldung das Wort "test" ausgegeben.
Es erfolgt in keinster Weise ein Fehler bzgl des Codes.
Bsp-Dateien von - deiner Seite! - sind ja noch immer nicht der große Hit - obwohl! - du + Karl-Heinz schon seit mehreren Beiträgen noch immer nur am "raten" seid.
Nun denn...weiter viel Erfolg
Ciao
Thorsten
Anzeige
AW: API-Funktionen Fehleer
17.08.2021 15:54:23
Peter
Hallo Oberschlumpf,
ich habe den Code in jeder Userform oben nach Option explicit eingefügt.
Gruss
Peter
AW: API-Funktionen Fehleer
17.08.2021 16:05:14
Oberschlumpf
hi Peter
deine Antwort ist leider wieder nicht vollumfänglich aller notwendiger Informationen.
und in welchem Modul?
Ohne Bsp-Datei von dir will zumindest ich nich weiter mitraten.
Peter, denk nicht, dass wir, nee!, denk nich, dass ICH arrogant bin - das bin ich nicht.
Aber es nützt nix, wenn jemand, der eine Frage hat, nur so Beitrag für weiteren Beitrag Stück für Stück nur wenige weitere Infos bekannt gibt.
Und trotz mehrmaliger Bitten (nicht nur in diesem Beitrag) eine Bsp-Datei per Upload nicht zeigt.
Du bist im besten Forum der Welt gelandet - ok, DAS kann ich eigtl - nicht - beurteilen :-)...aber ich bin hier mit dabei seit ca 2001 - und noch immer ganz genau so begeistert wie am 1. Tag!
Aber nix desto trotz: Wer eine qualifizierte Antwort erwartet/erhofft, der muss halt auch eine genau so qualifizierte Frage liefern...
Ciao
Thorsten
Anzeige
AW: API-Funktionen Fehleer
17.08.2021 16:56:43
Peter
Hallo Thorsten,
ich kenne dieses Forum ebenfalls bereits einige Jahre. Habe beste Erfahrungen gemacht.
Kann nur Bestätigen bestens.
Ich füge eine Datei bei, bei der ich die Abschaltung der Schliesskreuze deaktiviert habe und auch das Workbook_Open teilweise deaktiviert habe. Dadurch kannst Du die Datei ansehen. Auch das Passwort für VBA habe ich herausgenommen.
Im Formular "UF_Namen_vergeben" habe ich das mit dem API Code mal probiert.
Es geht mir darum, dass das auszuführende Programm immer wieder abstürzt indem nach Durchführung von einer Aktion offensichtlich
die Daten nicht korrekt abgespeichert werden. Ich suche daher eine Lösung und die Frage ist, ob durch diesen Code zum Verhindern des Verschiebens der UF, diese Problem ggf. ausgelöst werden kann. Es folgt beim Öffnen die Meldung:

"Wir haben ein Problem in Datei... erkannt. Sollen wir soviel wie möglich wiederherstellen?
Wenn Sie der Quelle vertrauen klicken Sie auf ja."
Wird "ja" gedrückt kommt nachstehende Meldung:
Die Datei konnte von Excel geöffnet werden indem der nicht lesbare Inhalt repariert
oder entfernt wurde.
Entfernte Datensätze: Formel von /xl/worksheet/sheet10.xml.Part usw.
Ist es möglich, dass dieser Code diesen Fehler auslösen kann?
Noch eine kurze Erläuterung - bei meinem Rechner - kein Absturz - Windows 10 64 Bit, Office 2013
auf dem anderen Rechner - immer wieder nicht regelmässig Absturz - Windows 7 64 Bit, Office 2016 vorher auch 2013
anbei Datei: https://www.herber.de/bbs/user/147670.xlsm
Gruss
Peter
Anzeige
ich bin raus
17.08.2021 20:02:36
Oberschlumpf
Hi Peter,
ich kann mit deiner Datei keinen Fehler finden.
Ich hab den Code

#If Win64 Then
...usw
#End If
an mehreren Stellen ausprobiert, die DAtei gespeichert, wieder geöffnet - ein Speicher/Ladefehler ist nicht aufgetreten.
Ich weiß nun nix weiter.
Du kannst wieder antworten, aber ich werde nicht mehr darauf reagieren, weil ich nix weiter weiß.
Ciao
Thorsten
AW: ...bitte noch eine Antwort
17.08.2021 20:13:13
Peter
Hallo Thorsten,
noch eine letzte Bitte an Dich.
mit #If Win64 Then
...usw
#End If
hatte ich auch kein Problem, aber mit
#If VBA7 or Win65
...usw
#Else
...
#End if
sehr wohl. Letzte Frage muss in die Zeilen nach Else auch PtrSafe eingefügt werden?
Gruss
Peter
Anzeige
AW: ...bitte noch eine Antwort
17.08.2021 23:14:49
Oberschlumpf
weiß ich nicht
AW: API-Funktionen
17.08.2021 16:06:28
Peter
Hallo Karl-Heinz,
mit Threads " UF verschieben verhindern ohne flackern von Peter vom 07.05.2020 11:21:18" hast Du mir seinerzeit den Tipp gegeben,
das Verschieben der UF zu verhindern.
Jetzt meine Frage, da es möglich sein könnte, dass diese API Störungen verursachen könnten, ob es eine andere Möglichkeit gibt,
das Verschieben zu verhindern.
Gruss
Peter
AW: API-Funktionen
18.08.2021 13:47:02
volti
Hallo Peter,
irgendwie bekomme ich keine Antwortermails mehr, daher sehe ich erst jetzt Deine Beiträge....
Zunächst einmal zu den Declares, wo alles rot ist. Das ist völlig normal und in Ordnung.
Wenn Du einen 64 Bit Rechner hast, werden die Deklarationen für die alten Versionen in rot dargestellt, weil sie nicht laufbar sind.
Durch den Compilerschalter werden sie aber auch nicht berücksichtigt und führen zu keinem Fehler.
Dann schlage ich Dir vor, alles API-Deklarationen in einem Extramodul (API) zu definieren, dann brauchst Du das nicht zig-mal vorhalten.
Und wenn Du Deine API-Aktionen in einer Sub zusammenziehst (UF unverschiebbar machen), brauchst Du auch den ganzen Code nur einmal und kannst ihn aus jeder Userform aufrufen..
#If VBA7 or Win65: Hast Du Dich da verschrieben? Win65 gibt es nicht....
Hier die angepasste Datei, die ich aufgrund des umfangreichen Codes nicht umfänglich testen kann/will. Bezgl. der API-Funktionen ist alles in Ordnung für 32 und 64-Bit-Versionen. Es kommen keine Fehler und es flackert auch nichts.
Angepasste Datei
Und zu Deiner Frage, (die ich nicht ganz verstanden habe): M.E. ist ein Unterbinden der UF-Verschiebung ohne API-Unterstützung nicht möglich.
Code:

[Cc][+][-]

' Aufrufbeispiel aus einer UF (dort gehört der Code auch rein) Private Sub UserForm_Activate() Call UF_Unverschiebbar(Me.Caption) End Sub 'API-Deklarationen (im Modul API) #If VBA7 Then Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As LongPtr Private Declare PtrSafe Function DeleteMenu Lib "user32" ( _ ByVal hMenu As LongPtr, _ ByVal nPosition As Long, _ ByVal wFlags As Long) As Long Private Declare PtrSafe Function GetSystemMenu Lib "user32" ( _ ByVal hWnd As LongPtr, _ ByVal bRevert As Long) As LongPtr #Else Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare Function DeleteMenu Lib "user32" ( _ ByVal hMenu As Long, _ ByVal nPosition As Long, _ ByVal wFlags As Long) As Long Private Declare Function GetSystemMenu Lib "user32" ( _ ByVal hwnd As Long, _ ByVal bRevert As Long) As Long #End If Private Const MF_BYCOMMAND = &H0 Private Const SC_MOVE = &HF010 Sub UF_Unverschiebbar(sCaption As String) #If VBA7 Then Dim hMenu As LongPtr #Else Dim hMenu As Long #End If 'Anfang - Userform unverschiebbar machen hMenu = GetSystemMenu(FindWindow(vbNullString, sCaption), 0) If hMenu <> 0 Then DeleteMenu hMenu, SC_MOVE, MF_BYCOMMAND End If 'Ende - Userform unverschiebbar machen End Sub

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

Anzeige
AW: API-Funktionen
18.08.2021 13:57:09
volti
Hallo Peter,
ja, wir hatten das Thema letztes Jahr schon mal. Hatte ich vergessen. Sorry.
VG KH

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige