Ich habe Code in einem Projekt, um Daten von einem Blatt in ein Recordset zu lesen. Der VBA-Code ist passwortgeschützt.
Zum Testen habe ich den Code wie folgt vereinfacht:
Immer wenn ich diesen Code von einem Benutzerformular aus ausführen lasse, werde ich nach dem Schließen von Excel nach dem VBAProject-Passwort gefragt. Abhängig von der, ich denke, Anzahl der Module in der Arbeitsmappe, muss ich mindestens zweimal abbrechen Ich habe mir in der letzten Woche den Kopf darüber gebrochen, habe jeden Beitrag im Netz gelesen, den ich finden konnte, aber ich habe noch keine Lösung gefunden.
Wie von Miqi180
angegeben, tritt dieses Problem auf, wenn Verweise auf die Arbeitsmappe nicht ordnungsgemäß gelöscht werden. siehe Microsoft Knowledge Database
Es kann auch auftreten, wenn Office AddIns installiert ist. Es gab / gibt bekannte Probleme:
Ich habe das gleiche Problem in einem Outlook-Projekt, das eine Excel-Datei öffnet, also im Gegensatz zu dem, was andere spekuliert haben, nicht direkt auf die Datenbank (ADO oder DAO) -Technologie bezogen.
Von der Microsoft Knowledge Database :
SYMPTOME
Nach dem Ausführen eines Makros, das eine Referenz für eine Arbeitsmappe übergibt enthält ein passwortgeschütztes VBA-Projekt für eine ActiveX-Dynamic Link Bibliothek (DLL), werden Sie aufgefordert, das VBA-Projektpasswort einzugeben Excel wird beendet.
URSACHE
Dieses Problem tritt auf, wenn das ActiveX-DLL nicht ordnungsgemäß freigegeben wird der Verweis auf die Arbeitsmappe, die den kennwortgeschützten VBA enthält Projekt.
Das Problem tritt normalerweise auf, wenn ein Zirkelverweis zwischen Objekten vorhanden ist und die Kennworteingabeaufforderung angezeigt wird, wenn die Objekte eine Referenz für eine geschützte Arbeitsmappe enthalten, wenn Excel geschlossen wird.
Beispiel: ObjectA speichert einen Verweis auf objectB, und objectB speichert einen Verweis auf objectA. Die beiden Objekte werden nicht zerstört, es sei denn, Sie haben explizit set objectA.ReferenceToB = Nothing
oder objectB.ReferenceToA = Nothing
.
Da ich die Symptome nicht replizieren kann, indem ich den Code auf meinem Computer ausführe, vermute ich, dass Sie Ihren Code für Stackoverflow so geändert haben, dass das Problem behoben wird, z. durch Neudefinieren von öffentlichen Variablen im Rahmen des Verfahrens.
Dies ist ein Problem, das meine eigenen Excel-VBA-Add-Ins für eine kleine Anzahl von Kunden zeitweilig geplagt hat. Ich habe das Problem in meiner Online-Dokumentation dokumentiert: VB Password Prompt .
Während ich an einer bestimmten Situation für einen Kunden gearbeitet habe, habe ich eine Lösung gefunden. Ich weiß nicht, ob es nur für seine Situation funktioniert (nur an meiner Maschine) oder ob es breiter anwendbar ist.
Fügen Sie am Ende des Workbook_BeforeClose-Ereignisses die Zeile "ThisWorkbook.Saved = True" ein:
%Vor%Wenn jemand eine Chance hat, dies zu versuchen, können Sie mir mitteilen, ob es für Sie und / oder Ihre Kunden hilft.
DAO ist keine großartige Plattform zum Lesen von Daten aus Excel-Dateien.
Tatsächlich ist keiner der verfügbaren Microsoft-Datenbanktreiber-Technologien - sie haben alle einige Speicherlecks, und die älteren erstellen eine versteckte Instanz von Excel.exe - so etwas im VBA-Projekt (wie z. B. a fehlende Bibliothek oder ein Ereignis, das nicht kompilierenden Code aufruft) wird die Art von Fehlern, die Excel denken lassen, dass Sie versuchen, auf den Code zuzugreifen, verursachen.
Hier ist ein Code, der ADODB verwendet, eine neuere Datenbanktechnologie, die bei bestimmten Problemen mit DAO funktioniert.
Ich hatte keine Zeit, um all die Dinge auszublenden, die für Ihre Anfrage irrelevant sind - Entschuldigung, es gibt eine Menge davon! - aber in all diesen alternativen Verbindungszeichenfolgen zu bleiben, ist wahrscheinlich ziemlich hilfreich für Sie: Jeder, der diese Art von Problem hat, muss ein wenig herumspielen und herausfinden, welche Technologie durch Versuch und Irrtum funktioniert:
%Vor%
Fall "xlsx"
%Vor%Fall "xlsm"
%Vor%Fall "xlsb"
%Vor%Fall Else Err.Raise 999, APP_NAME & amp; "GetRecordsetFromWorkbook", "#ERROR - Dateiformat nicht bekannt" Ende Wählen Sie
Bei Fehler GoTo ErrSub
%Vor%ExitSub: Bei Fehler Fortsetzen Weiter
%Vor%ErrSub:
%Vor%'# lässt diese unzugängliche Anweisung für das Debugging unverändert: Fortsetzen
Ende Funktion
Entschuldigung, wenn Sie Probleme mit Zeilenumbrüchen rund um die '_' Trennlinien haben.
Sie benötigen außerdem Deklarationen für die Konstante 'APP_NAME':
%Vor%
Und eine VBA-API-Deklaration für die 'Schlaf' Funktion:
%Vor%
Das Ausführen von SQL gegen Microsoft Excel wird am besten als eine schlechte Sache angesehen: Ja, SQL ist bei weitem das beste Werkzeug für große Mengen tabellierter Daten; Aber nein, Microsoft wird diese Speicherlecks nicht bald beheben. Niemand in Redmond interessiert sich für das, was Sie dort tun wollen - nicht, wenn Sie eine Kopie von MS-Access oder SQL Server kaufen und Ihre Daten übertragen könnten.
Allerdings ist es immer noch die schlechteste Lösung, wenn Sie keinen eigenen SQL Server bekommen und eine große Menge an Daten in der Tabelle eines anderen Benutzers haben. Oder Tabellenkalkulationen im Plural.
Also hier ist ein schrecklicher Hack, um Excel mit zu lesen SQL
Die Überschrift zu diesem Artikel lautet:
Ein warnendes Märchen von Dingen, die kein Entwickler jemals sehen oder tun sollte, mit Ablenkungen und Abschweifungen in Versagen der Geschäftslogik, Workarounds und schlechteren Umgebungen, Haushaltsfeen, Geschäftsanalytikern und skrofulösen Pilgern, die wundersame Heilung in der Aufzugshalle.
... und du solltest das als Warnung dafür behandeln, was du vorhast: ein langes und bitteres Code-Streiten, um etwas zu tun, was du wahrscheinlich anders machen hättest.