Access-News & Downloads
Access-Helpline
Spotlight: Access-Datenbanken optimieren, analysieren und dokumentieren Stellen Sie sicher, dass jede Datenbank fehlerfrei und mit optimaler Geschwindigkeit läuft! Der Total Access Analyzer prüft jedes einzelne Objekt in Ihrer Datenbank und liefert Ihnen in übersichtlicher und komfortabler Form:
Mehr als 300 Berichte, Analysen und grafische Darstellungen helfen Ihnen, nicht nur die vorhandenen Objekte zu dokumentieren, sondern auch alle Zusammenhänge und Beziehungen sofort zu erfassen. Fast nebenbei kommen Sie Fehlern sowie ungenutzten Objekten auf die Spur und erhalten gezielte Tipps zur Optimierung Ihrer Anwendung. Weitere Informationen finden Sie unter: Total Access Analyzer für Access 2003 Total Access Analyzer für Access 2002/XP Total Access Analyzer für Access 2000 Download-Tipp: Verknüpfte Tabellen perfekt im Griff Beim Einsatz von Front-End-/Back-End-Lösungen sind regelmäßig Änderungen an verknüpften Tabellen notwendig. Vor allem bei umfangreichen Lösungen, in denen Tabellen aus mehreren Datenbanken eingebunden sind, ist damit immer die Frage nach dem Speicherort der jeweiligen Datenbank verbunden. Erst ab Access 2002 wird zumindest im Datenbankfenster der Speicherort für eingebundene Tabellen als QuickInfo angezeigt. In Access 97 und 2000 sind mühsame Recherchen über den Tabellenverknüpfungs-Manager oder das Auslesen der Verbindungsinformationen notwendig. Wesentlich einfacher können Sie diese Informationen nun in allen Access-Versionen mit dem SmartTools Link-Lister abrufen: Über ein universell einsetzbares Formular werden Ihnen für die aktuelle Datenbank Namen, Speicherorte, Datum der Einbindung und Anzahl der Datensätze für eingebundene Tabellen angezeigt. Damit finden Sie Ihre Back-End-Datenbanken innerhalb kürzester Zeit, ohne langwierig Ihre Verknüpfungen analysieren oder Ihre Festplatten absuchen zu müssen:
Techinfo: Menü- und Symbolleisten selbst programmieren Für kleinere Anpassungen und Erweiterungen von Menüs und Symbolleisten hat Microsoft in seinen Office-Anwendungen die Funktion "Anpassen" vorgesehen. Für spezialisierte Lösungen müssen Menüs oder Symbolleisten aber oftmals per VBA komplett erstellt oder in Teilen angepasst werden. Aufgrund der Komplexität dieses Themas und der kaum vorhandenen Dokumentation dazu scheuen davor jedoch viele Entwickler zurück. Hier hilft ein umfangreiches White Paper, das Sie unter der folgenden Adresse finden: Techinfo: Menü- und Symbolleisten selbst programmieren Die Autoren vermitteln zunächst Grundlagen zu Menüs und Symbolleisten, dem Objekt-Modell und den zur Verfügung stehenden VBA-Anweisungen. Weitere Abschnitte erläutern die verschiedenen Arten von Steuerelementen, die in Menüs und Symbolleisten eingesetzt werden können. Anhand praktischer, sofort nachvollziehbarer Beispiele lernen Sie schnell, wie Menüs oder Symbolleisten angelegt, gefüllt und angepasst oder Elemente individuell manipuliert werden können. Sie sehen weiterhin, wie zum Beispiel Symbole und Grafiken eingesetzt werden oder auf Menüs und Symbolleisten in der VBA-Entwicklungsumgebung zugegriffen wird. Einige der vorgestellten Routinen lassen sich als nützliche Tools für die zukünftige Entwicklung einsetzen. Darüber hinaus finden Sie viele interessante Links auf weiterführende Informationen und Knowledge Base-Artikel. Waren die News & Downloads hilfreich für Sie? Klicken Sie bitte hier!
Externe Anwendungen starten und kontrollieren, Teil 2 Versionen: Access 2003, 2002/XP, 2000 und 97 Nachdem im ersten Teil dieses Tipps die Klassenbibliothek "clsExecProg" aufgebaut wurde, geht es nun in diesem Teil um den Einsatz in der Praxis und die Funktionsweise. Der Zugriff erfolgt über eine Objektvariable, die, wie im folgenden Beispiel gezeigt, in der jeweiligen VBA-Routine deklariert und initialisiert wird: Private Sub btnStartNotepad_Click() Dim ep As New clsExecProg Wichtig ist, dass Sie hier "New" angeben, damit gleich eine Instanz der Klasse initialisiert wird und sie sofort genutzt werden kann: With ep .ProgName = "notepad.exe" .ProgParas = "c:\autoexec.bat" .WorkDir = "c:\" .WinMode = vbMaximizedFocus .ExecProg If .EPError Then Beep MsgBox "Fehler beim Aufruf...", _ vbOKOnly + vbInformation, "ExecProg:" Exit Sub End If While .IsRunning DoEvents 'Warten... Wend MsgBox "NotePad wurde beendet..." End With End Sub Das Beispiel öffnet die Datei "c:\autoexec.bat" zur Bearbeitung in NotePad, wartet, bis die Bearbeitung abgeschlossen, also NotePad beendet wurde und meldet dann den Abschluss der Ausführung der externen Anwendung. Initialisierung und Aufruf erfolgen am besten innerhalb einer "With...End With"-Konstruktion, um etwas Tipparbeit zu sparen. Im Beispiel werden im ersten Schritt die im folgenden erläuterten Eigenschaften gesetzt, dann die Methode "ExecProg" für die Ausführung aufgerufen und anschließend über "EPError" geschaut, ob es ein Probleme gegeben hat. Wenn ja, erfolgt eine entsprechende Meldung und die Routine wird verlassen. Die "While...Wend"-Schleife läuft, solange die Eigenschaft "IsRunning" den Inhalt "True" hat. Dahinter verbirgt sich eine Funktion, die über API den Status der jeweiligen Anwendung abfragt. Wenn das System zurückmeldet, dass die Anwendung nicht mehr läuft, wird "IsRunning" auf "False" gesetzt und somit die Schleife verlassen. Sie können selbstverständlich auch auf die "While...Wend"-Schleife verzichten. "ExecProg" arbeitet dann wie die "Shell()"-Funktion: Die externe Anwendung wird geöffnet und die VBA-Routine sofort weiter ausgeführt. Im Folgenden die Erläuterung der Eigenschaften, die Sie nutzen können: ProgName: Definiert Laufwerk, Pfad und Dateiname der Anwendung, die gestartet werden soll, also zum Beispiel "D:\Tools\FTPTrans.exe". Sie können Laufwerk und Pfad auch weglassen, es wird dann in folgenden Verzeichnissen gesucht: Aktuelles Verzeichnis, Windows-Verzeichnis, System-Verzeichnis, Verzeichnisse, die in AUTOEXEC über PATH festgelegt wurden. Der Dateiname muss aber immer, und zwar komplett mit Erweiterung, angegeben werden! Wenn Sie nur ein Dokument mit seiner dazugehörigen Anwendung öffnen wollen, geben Sie hier nichts bzw. eine leere Zeichenkette ("") an. Achtung! Bei langen Dateinamen mit Leerzeichen muss die Zuweisung in Hochkommas eingeschlossen werden: .ProgName = Chr$(34) + strPName + Chr$(34) ProgParas: Über diese Eigenschaft legen Sie die Parameter fest, die der Anwendung übergeben werden sollen. Dies kann ein Dateiname und/oder Schalter wie beispielsweise "Z:\Daten\ebcdic.txt" /C /F=ansi" sein. Möchten Sie ein Programm "leer" starten, geben Sie hier einfach nichts bzw. eine leere Zeichenkette ("") an. Sie können hier auch nur einen Dokumentnamen wie zum Beispiel "D:\Daten\Budget.xls" angeben und "ProgName" leer lassen bzw. auf eine leere Zeichenkette setzen. "ExecProg" startet dann automatisch die Anwendung, die unter Windows für den betreffenden Dokumenten-Typ zuständig ist, in diesem Fall also beispielsweise Excel. Achtung! Bei langen Dateinamen mit Leerzeichen muss die Zuweisung in Hochkommas eingeschlossen werden: .ProgParas = Chr$(34) + strFName + Chr$(34) WorkDir: Legen Sie hier das zu verwendende Arbeitsverzeichnis fest. In der Regel handelt es sich dabei um das Verzeichnis, aus dem Sie das Programm oder ein Dokument aufrufen. Wenn Sie hier nichts angeben, wird das jeweils zuletzt aktivierte Verzeichnis auf dem betreffenden Laufwerk verwendet. WinMode: Diese Eigenschaft steuert, in welchem Modus das Fenster des Programms angezeigt wird. Sie können hier die gewohnten "vb..."-Konstanten verwenden, die Sie auch bei "Shell()" benutzen:
Diese Eigenschaft vom Datentyp "Boolean" gibt Auskunft darüber, ob die jeweils letzte Aktion erfolgreich ausgeführt werden konnte oder nicht. Bei einem Fehler steht "EPError" auf "Wahr/True". Sie sollten "EPError" zumindest nach dem Aufruf von "ExecProg" wie im Beispiel gezeigt abfragen. Abschließend zur Funktionsweise der Klassenbibliothek: Dreh- und Angelpunkt der Lösung sind zwei API-Funktionen: "ShellExecuteEx" ist zuständig für den Start einer Anwendung. Die benötigten Informationen werden in einer Datenstruktur "SHELLEXECUTEINFO" übergeben, die von der Methode "ExecProg" anhand der gesetzten Eigenschaften gefüllt wird. "ShellExecuteEx" liefert als Ergebnis unter anderem ein Handle auf den neu gestarteten Prozess. Anhand des Handles kann man nun über "WaitForSingleObject" den Status der Anwendung erfragen. Ist die Rückmeldung größer "0", so läuft die Anwendung noch, andernfalls wurde sie inzwischen beendet. Umgesetzt für die Eigenschaft, die in einem Klassenmodul ja eigentlich eine Funktion ist, sieht das dann so aus: Public Property Get IsRunning() As Boolean Dim lngStatus As Long lngStatus = _ WaitForSingleObject(ep_ProcInfo.hProcess, 10) If lngStatus = -1 Then 'Ungültiger Handle... IsRunning = False ep_Error = True Else IsRunning = (lngStatus <> 0) End If End Property Der zweite Parameter bei "WaitForSingleObject" spezifiziert eine Zeit in Millisekunden, die auf die Beendigung der Anwendung gewartet werden soll. Wenn Sie feststellen, dass die Routine auf Ihrem System zuviel CPU-Zeit beansprucht, setzen Sie den Wert hier einfach ein wenig herunter. Nun zur Methode "ExecProg": Public Sub ExecProg() If ep_ProgName <> "" Then 'Anwendung angegeben... ep_ShellExecInfo.cbSize = Len(ep_ShellExecInfo) ep_ShellExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS + _ SEE_MASK_FLAG_NO_UI ep_ShellExecInfo.lpFile = ep_ProgName ep_ShellExecInfo.lpParameters = ep_ProgParas ep_ShellExecInfo.lpDirectory = ep_WorkDir ep_ShellExecInfo.nShow = ep_WinMode ep_Error = ShellExecuteEx(ep_ShellExecInfo) ep_ProcInfo.hProcess = ep_ShellExecInfo.hProcess ep_Error = (ep_ShellExecInfo.hInstApp < 32) Else 'Nur Datei/Dokument angegeben... ep_ShellExecInfo.cbSize = Len(ep_ShellExecInfo) ep_ShellExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS + _ SEE_MASK_FLAG_NO_UI ep_ShellExecInfo.lpFile = ep_ProgParas ep_ShellExecInfo.lpParameters = vbNullString ep_ShellExecInfo.lpDirectory = ep_WorkDir ep_ShellExecInfo.nShow = ep_WinMode ep_Error = ShellExecuteEx(ep_ShellExecInfo) ep_ProcInfo.hProcess = ep_ShellExecInfo.hProcess ep_Error = (ep_ShellExecInfo.hInstApp < 32) End If End Sub Generell prüft die Routine zunächst, ob ein Programm angegeben wurde. Wenn ja, kommt der erste Teil zum Einsatz. Der zweite Teil ist zuständig für die Initialisierung, wenn nur ein Dokument zu öffnen ist. Der wesentliche Unterschied besteht darin, dass hier das Dokument sozusagen als Anwendung und das Feld für die Anwendungs-Parameter auf "Null" gesetzt wird. Die ersten vier Anweisungen "schaufeln" jeweils die gesetzten Eigenschaften in die oben erwähnte Datenstruktur, die dann als Parameter an "ShellExecuteEx" übergeben wird. War dieser Tipp für Sie hilfreich? Klicken Sie bitte hier!
Haben Sie Fragen zu Access 2003, 2002/XP, 2000 und 97? Dann wenden Sie sich mit einer genauen Problembeschreibung (bitte keine Datenbanken schicken!) an: access-helpline@smarttools.de Unser Redaktionsteam wählt in jeder Ausgabe eine oder mehrere Fragen aus und beantwortet Sie an dieser Stelle im Newsletter. Eingelesene Dateinamen sortieren Versionen: Access 2003, 2002/XP, 2000 und 97 FRAGE: Ich habe aus dem Beitrag "Verzeichnisse und Dateien per VBA auslesen und verarbeiten, Teil 2" die zweite verkürzte Variante in mein Programm übernommen. Prinzipiell funktioniert es alles, bis auf einen kleinen Schönheitsfehler, sehr gut: Die Dateien werden leider ungeordnet angezeigt. J. Schulze ANTWORT: In der Lösung werden die Dateinamen/Pfade von der Funktion "DatAuswAufbauen()" in ein String-Array "arrDatAusw()" eingelesen, das Sie vor der weitere Verarbeitung zum Beispiel mit einem QuickSort alphabetisch sortieren können: Function QuickSortStrings(arrStrings() As String, _ ByVal Low As Integer, _ ByVal High As Integer) As Boolean Dim strCompare As Variant Dim intL As Integer Dim intH As Integer Dim strSwap As Variant Dim fOK As Boolean If High > Low Then strCompare = arrStrings((Low + High) \ 2) intL = Low intH = High Do While intL <= intH If arrStrings(intL) >= strCompare And _ arrStrings(intH) <= strCompare Then strSwap = arrStrings(intL) arrStrings(intL) = arrStrings(intH) arrStrings(intH) = strSwap intL = intL + 1 intH = intH - 1 Else If arrStrings(intL) < strCompare Then intL = intL + 1 End If If arrStrings(intH) > strCompare Then intH = intH - 1 End If End If Loop fOK = QuickSortStrings(arrStrings(), Low, intH) fOK = QuickSortStrings(arrStrings(), intL, High) End If QuickSortStrings = True End Function Den Aufruf bauen Sie in die Funktion "DatAuswAufbauen()" direkt nach Beendigung der "While..Wend"-Schleife wie folgt ein: While strFName <> "" intDatAusw = intDatAusw + 1 ReDim Preserve arrDatAusw(intDatAusw) arrDatAusw(intDatAusw) = strPath & strFName strFName = Dir() Wend QuickSortStrings arrDatAusw, 1, intDatAusw Einsatz von Berichten auf anderen Systemen Versionen: Access 2003, 2002/XP, 2000 und 97 FRAGE: In einigen Datenbanken nutzen wir vorgefertigte Berichte, die speziell formatiert über Formulare geöffnet oder aber auch direkt gedruckt werden. Leider kommt es immer wieder vor, das Access die speziellen Druckeigenschaften für den entsprechenden Bericht vergisst. Dazu gehören die Auswahl von verschiedenen Druckern (Tinten-, Nadel- bzw. Laserdrucker) und vor allem die Seitenränder. Da diese für sehr viele Berichte angepasst sind und nicht dem Standard (24,99) entsprechen, ist es immer wieder ein Problem der verschiedenen Nutzer und äußerst ärgerlich, wenn dann durch diesen Sachverhalt der entsprechende Bericht auf mehreren Blättern und nicht in den vorgesehenen (Papier-)Felder gedruckt wird. Über den lässt sich das nicht dauerhaft korrigieren. Diverse Anfragen ANTWORT: Beim Entwurf von Berichten legt Access die Daten des in der Systemsteuerung als "Standard" definierten Druckers zugrunde. Über dessen Druckertreiber ermittelt Access Informationen wie verfügbare Schriftarten und deren Schriftgrößen, verwendbare Seitenformate oder bedruckbare Ränder und speichert Teile dieser Informationen mit dem Bericht. Wird der Bericht, egal, ob auf Ihrem oder einem anderen System, geöffnet, so prüft Access, ob die mit dem Bericht gespeicherten Einstellungen auf dem jeweiligen System verwendet werden können. Stellt Access dabei gravierende Abweichungen wie beispielsweise andere bedruckbare Bereiche oder das Fehlen eines Seitenformats fest, so wird die betreffende Einstellung kurzerhand an die Gegebenheiten des aktuellen Systems angepasst. Beispiel: Sie haben für einen Bericht einen oberen und unteren Seitenrand von 10 mm eingestellt. Auf dem Zielsystem ist ein Standard-Drucker eingestellt, der nur bis auf 15 mm an den Rand heran drucken kann, also über andere bedruckbare Bereiche verfügt. Hier ändert Access die Seitenränder einfach auf die Standard-Einstellung von zum Beispiel 25 mm. Bei drastischeren Abweichungen, wenn beispielsweise über einen nicht vorhandenen Druckerschacht oder in einer nicht verfügbaren Schrift ausgedruckt werden soll, werden eventuell eine Fehlermeldung und anschließend der Bericht im Entwurfsmodus zur Anpassung angezeigt. Bislang gibt es keine wirklich befriedigende Lösung für dieses Problem. Die Nutzung von Eigenschaften, die auf dem Entwickler-System eingestellt, aber auf dem Ziel-System nicht verfügbar sind, ist nun mal nicht möglich. Access muss irgendwie reagieren, um die unnötige Verschwendung von Papier durch einen Ausdruck mit falschen Einstellungen zu vermeiden. Folgende Hinweise helfen, das Auftreten des Problems zu minimieren:
'AddressOf' nicht verfügbar Versionen: Access 97 FRAGE: Ich versuche eine Lösung in meine Datenbank einzubauen, die mit einer Anweisung "AddressOf" arbeitet. Bei der Ausführung der Routine stoppt Access in dieser Zeile und zeigt einen Laufzeitfehler an. Wieso? S. Schneider ANTWORT: Vermutlich arbeiten Sie mit Access 97. Dort steht der Operator "AddressOf" nicht zur Verfügung. Er wurde erst mit VBA 6.x und somit mit Access bzw. Office 2000 eingeführt. Ken Getz und Michael Kaplan von Trigeminal Software und anerkannte Access-Gurus haben für ein ähnliches Problem in Excel einen Work-around gefunden. Unter der folgenden Adresse können Sie eine Arbeitsmappe mit dieser Lösung herunterladen und diese Lösung nach geringen Anpassungen in Ihre Datenbank einbauen:
War die Helpline für Sie hilfreich? Klicken Sie bitte hier!
Office 2003 und XP-Tipps kostenlos per E-Mail Der SmartTools Office XP Insider ist ein kostenloser E-Mail-Newsletter, der sich ausschließlich mit den neuen Funktionen von Office 2003 und XP beschäftigt:
Um SmartTools Access Weekly abzubestellen, senden Sie einfach das Kommando "unsubscribe" an die Adresse access-weekly-html-request@smarttools.de Bitte beachten Sie, daß das Kommando im Nachrichtentext stehen muß (nicht im Betreff) und Sie keine Mail im HTML-Format senden dürfen. Weitere Informationen zur Verwaltung der Liste erhalten Sie mit dem Kommando "help" an dieselbe Adresse.
|