Access-News & Downloads
Access-Helpline Newsletter-Tipp
Spotlight: Die umfangreichste Sourcecode-Bibliothek für Access Das Total Visual SourceBook ist das absolute Muss für jeden Entwickler in Access 2003, 2002/XP und 2000. Für Ihre Projekte in Access erhalten Sie komplett ungeschützten, offenen und frei verwendbaren Sourcecode. Alles in allem erhalten Sie:
Alle Prozeduren sind getestet, voll dokumentiert und so entwickelt, dass Sie sie sofort in Ihren Projekten einsetzen können. Sie können die Bibliothek außerdem mit wenig Aufwand um Ihre persönlichen Prozeduren erweitern und so Stück für Stück Ihre individuelle Code-Datenbank aufbauen. Weitere Infos unter: http://www.add-in-world.com/katalog/tvsourcebook2003/ Download-Tipp: Access-Berichte voll automatisch nacheinander ausgeben Die Ausgabe von Access-Berichten kann einige Zeit in Anspruch nehmen, wenn es sich um große Datenmengen handelt oder Berechnungen enthalten sind. Mit dem kostenlosen SmartTools MultiPrint für Access müssen Sie in Zukunft nicht mehr wartend vor dem Rechner sitzen, sondern verlegen den Ausdruck Ihrer Berichte ganz einfach in die Mittagspause oder auf den Feierabend. Nach der automatischen Installation steht Ihnen ein neuer Menüpunkt zur Verfügung, über den Sie MultiPrint jederzeit aufrufen können. Der Assistent zeigt eine Liste aller verfügbaren Berichte an und Sie markieren einfach die gewünschten Einträge. Ein weiterer Mausklick genügt dann und Access gibt voll automatisch einen Bericht nach dem anderen aus:
Techinfo: SQL Server 2005 Express in eigene Anwendungen einbinden Mit dem SQL Server 2005 Express stellt Microsoft eine kostenlose SQL-Engine als Nachfolger für die bekannte MSDE zur Verfügung. Diese SQL-Engine können Sie, ohne Lizenzen erwerben zu müssen, in eigene Back-End-/Front-End-Lösungen einbinden und auch weitergeben. Dabei sind allerdings einiger Einschränkungen und Besonderheiten zu beachten, die die MSDN-Spezialisten in der folgenden Techinfo erläutern: Techinfo zu SQL Server 2005 Express Waren die News & Downloads hilfreich für Sie? Klicken Sie bitte hier!
Universelle Auswahldialoge für Ihre Datenbanken, Teil 2 Versionen: Access 2003, 2002/XP, 2000 und 97 Im ersten Teil dieses Tipps der Woche hatten wir Ihnen zunächst Lösungen für die Anzeige einer Ordner-Auswahl basierend auf den Windows Common Controls und dem Access 2002/2003-Objekt "FileDialogs" vorgestellt. Im zweiten Teil geht es nun um Funktionen zum Thema "Datei öffnen" und "Datei speichern". Solche Funktionen benötigen Sie regelmäßig, um beispielsweise die Anwender einer Datenbank eine zu importierende Datei wählen oder um das Ziel für einen Export festlegen zu lassen. Auch hier sind wieder verschiedene Lösungen auf Basis der Windows Common Controls und dem Access 2002/2003-Objekt "FileDialogs" möglich. Schauen wir zunächst einmal, wie Funktionen wie "OpenFile()" und "SaveFile()" mit Hilfe der Windows Common Controls umgesetzt werden können. Hier stehen die API-Funktionen "GetOpenFilename()" und "GetSaveFilename()" zur Verfügung. Beide Funktionen arbeiten mit einer Datenstruktur "OPENFILENAME", über die vor dem Aufruf verschiedene Eigenschaften wie das Startverzeichnis für die Auswahl, der Text für die Titelleiste oder die Einträge für das Dropdown-Menü "Dateityp" spezifiziert werden. Nach dem Aufruf enthält diese Struktur den gewählten Dateinamen inklusive Laufwerk und Pfad. Um die Initialisierung und Auswertung der Datenstruktur zu vereinfachen, erfolgt der Aufruf über zwei Funktionen "OpenFile()" und "SaveFile", denen als Parameter jeweils das Startverzeichnis für die Auswahl sowie der Text für die Titelleiste übergeben wird. Um diese Funktionen in Ihren Datenbanken zu nutzen, legen Sie ein neues Modul "modDatDlgs" oder ähnlich an und kopieren die folgenden Deklarationen und Funktionen in das Modul: Type OPENFILENAME lStructSize As Long hwndOwner As Long hInstance As Long lpstrFilter As String lpstrCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long lpstrFile As String nMaxFile As Long lpstrFileTitle As String nMaxFileTitle As Long lpstrInitialDir As String lpstrTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer lpstrDefExt As String lCustData As Long lpfnHook As Long lpTemplateName As String End Type Private Const OFN_FILEMUSTEXIST = &H1000 Private Const OFN_HIDEREADONLY = &H4 Private Const OFN_OVERWRITEPROMPT = &H2 Private Const OFN_PATHMUSTEXIST = &H800 Private Declare Function GetOpenFilename _ Lib "comdlg32.dll" _ Alias "GetOpenFileNameA" _ (pOpenfilename As OPENFILENAME) As Long Private Declare Function GetSaveFileName _ Lib "comdlg32.dll" _ Alias "GetSaveFileNameA" _ (pOpenfilename As OPENFILENAME) As Long Dim OFN As OPENFILENAME Function OpenFile(strVerzeichnis As String, _ strTitel As String) As String Dim strFilter As String Dim strDateinameUndPfad As String Dim strDateiname As String Dim lngErgebnis As Long ' Angebotene Dateifilter in der Dropdownliste "Dateityp" strFilter = "Excel-Arbeitsmappen (*.xls)" & Chr$(0) & _ "*.XLS" & Chr$(0) ' Vorgegebenes Verzeichnis If strVerzeichnis = "" Then ' Wenn leer, dann das aktuelle Verzeichnis verwenden strVerzeichnis = CurDir$ & Chr$(0) Else ' "0" an übergebenes Verzeichnis anhängen strVerzeichnis = strVerzeichnis & Chr$(0) End If If strTitel = "" Then ' Wenn kein Titel übergeben, Standardtitel festlegen strTitel = "Datei-Öffnen:" Else ' "0" an übergebenen Titel anhängen strTitel = strTitel & Chr$(0) End If ' Speicherplatz für Dateinamen & Pfad reservieren strDateinameUndPfad = Space$(255) & Chr$(0) ' Speicherplatz für Dateinamen ohne Pfad reservieren strDateiname = Space$(255) & Chr$(0) 'Datenstruktur OFN initialisieren With OFN .lStructSize = Len(OFN) .hwndOwner = Application.hWndAccessApp .lpstrFilter = strFilter .nFilterIndex = 1 .lpstrFile = strDateinameUndPfad .nMaxFile = Len(strDateinameUndPfad) .lpstrFileTitle = strDateiname .nMaxFileTitle = Len(strDateiname) .lpstrInitialDir = strVerzeichnis .lpstrTitle = strTitel .flags = OFN_FILEMUSTEXIST Or _ OFN_PATHMUSTEXIST Or _ OFN_HIDEREADONLY .nFileOffset = 0 .nFileExtension = 0 .lCustData = 0 .lpfnHook = 0 .lpTemplateName = "" End With lngErgebnis = GetOpenFilename(OFN) If lngErgebnis <> 0 Then OpenFile = Left(OFN.lpstrFile, _ InStr(OFN.lpstrFile, Chr$(0)) - 1) Else OpenFile = "" End If End Function Function SaveFile(strVerzeichnis As String, _ strTitel As String) As String Dim strFilter As String Dim strDateinameUndPfad As String Dim strDateiname As String Dim lngErgebnis As Long ' Angebotene Dateifilter in der Dropdownliste "Dateityp" strFilter = "Excel-Arbeitsmappen (*.xls)" & Chr$(0) & _ "*.XLS" & Chr$(0) ' Vorgegebenes Verzeichnis If strVerzeichnis = "" Then ' Wenn leer, dann das aktuelle Verzeichnis verwenden strVerzeichnis = CurDir$ & Chr$(0) Else ' "0" an übergebenes Verzeichnis anhängen strVerzeichnis = strVerzeichnis & Chr$(0) End If If strTitel = "" Then ' Wenn kein Titel übergeben, Standardtitel festlegen strTitel = "Datei speichern:" Else ' "0" an übergebenen Titel anhängen strTitel = strTitel & Chr$(0) End If ' Speicherplatz für Dateinamen & Pfad reservieren strDateinameUndPfad = Space$(255) & Chr$(0) ' Speicherplatz für Dateinamen ohne Pfad reservieren strDateiname = Space$(255) & Chr$(0) 'Datenstruktur OFN initialisieren With OFN .lStructSize = Len(OFN) .hwndOwner = 0& .hwndOwner = Application.hWndAccessApp .lpstrFilter = strFilter .nFilterIndex = 1 .lpstrFile = strDateinameUndPfad .nMaxFile = Len(strDateinameUndPfad) .lpstrFileTitle = strDateiname .nMaxFileTitle = Len(strDateiname) .lpstrInitialDir = strVerzeichnis .lpstrTitle = strTitel .flags = OFN_HIDEREADONLY Or _ OFN_OVERWRITEPROMPT .nFileOffset = 0 .nFileExtension = 0 .lCustData = 0 .lpfnHook = 0 .lpTemplateName = "" End With lngErgebnis = GetSaveFileName(OFN) If lngErgebnis <> 0 Then SaveFile = Left(OFN.lpstrFile, _ InStr(OFN.lpstrFile, Chr$(0)) - 1) Else SaveFile = "" End If End Function Die beiden Funktionen "OpenFile()" und "SaveFile()" zeigen jeweils einen Datei-Auswahl-Dialog an und liefern den vom Anwender ausgewählten Dateinamen inklusive Laufwerk und Pfad. Sie können diese Funktionen zum Beispiel einsetzen, um damit per "DoCmd.TransferSpreadsheet" eine Excel-Tabelle in eine Access-Tabelle zu importieren oder um damit eine Access-Tabelle in eine Excel-Arbeitsmappe zu exportieren. Als Parameter übergeben Sie ein Vorgabe-Verzeichnis, aus dem die betreffenden Dateien zum Öffnen angezeigt bzw. in dem eine Datei gespeichert werden soll. Über den zweiten Parameter spezifizieren Sie einen in der Titelleiste des Dialogs anzuzeigenden Hinweis wie zum Beispiel "Tabelle importieren aus Datei:" oder "Tabelle exportieren in Datei:". Das Ergebnis ist entweder eine leere Zeichenkette (""), wenn der Anwender auf Abbrechen geklickt hat oder der gewählte Dateiname inklusive Laufwerk und Pfad. Wenn Sie andere Dateitypen als "XLS" zur Auswahl anzeigen möchten, passen Sie die Funktionen in der folgenden Zeile, die jeweils identisch ist, an: ' Angebotene Dateifilter in der Dropdownliste "Dateityp" strFilter = "Excel-Arbeitsmappen (*.xls)" & _ Chr$(0) & "*.XLS" & Chr$(0) Die Angabe besteht aus zwei Teilen, die jeweils durch ein Nullbyte "Chr$(0)" zu trennen sind. Der vordere Teil definiert den Text, der in der Liste "Dateityp" angezeigt wird, der hintere Teil definiert die Dateimaske für die Auswahl, wobei Wildcards (*, ?) erlaubt sind. Sie können hier auch mehrere Dateimasken definieren, indem Sie sie durch Semikolon trennen: strFilter = "Word-Dateien (*.doc;*.dot)" & _ Chr$(0) & "*.DOC;*.DOT" & Chr$(0) Mit Office XP hat Microsoft wie bereits erwähnt das Objekt "FileDialogs" eingeführt, das ohne externe API-Funktionen und komplexe Datenstrukturen auskommt und zudem komfortabler zu handhaben ist. Die oben gezeigten Funktionen können jedoch auch problemlos mit Access 2003 und 2002/XP eingesetzt werden! Das FileDialog-Objekt kann generell in allen Office-Anwendungen eingesetzt werden. Es gehört jedoch nicht zum jeweiligen Objektmodell der Office-Anwendung, sondern ist zentral über die Objekt-Bibliothek "Microsoft Office X.x Object Library" verfügbar (X.x= 11.0 für Office 2003 und 10.0 für Office XP). Bevor Sie in Ihren Lösungen mit diesem Objekt arbeiten können, ist also zunächst über das Menü Extras-Verweise eine Referenz auf diese Bibliothek zu setzen. Die auf "FileDialogs" basierenden Funktionen "OpenFile()" und "SaveFile()" sind wie folgt aufgebaut: Function OpenFile(strTitle As String, _ strPath As String, _ strButton As String) As String Dim fDlg As FileDialog Set fDlg = Application.FileDialog(msoFileDialogOpen) With fDlg .Title = strTitle .InitialFileName = strPath .ButtonName = strButton .Show If .SelectedItems.Count = 0 Then Exit Function OpenFile = .SelectedItems(1) End With End Function Function SaveFile(strTitle As String, _ strPath As String, _ strButton As String) As String Dim fDlg As FileDialog Set fDlg = Application.FileDialog(msoFileDialogSaveAs) With fDlg .Title = strTitle .InitialFileName = strPath .ButtonName = strButton .Show If .SelectedItems.Count = 0 Then Exit Function SaveFile = .SelectedItems(1) End With End Function Als Parameter übergeben Sie neben dem Startverzeichnis für die Auswahl und dem Text für die Anzeige in der Titelleiste einen Text für die Beschriftung der Auswahl-Schaltfläche. Statt Öffnen" können Sie zum Beispiel "Importieren" oder "Exportieren" anzeigen lassen. Das Ergebnis beider Funktionen ist eine leere Zeichenkette "", wenn auf Abbrechen geklickt wurde oder der Name der gewählten Datei inklusive Laufwerk und Pfad. 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. Ersatz für 'CurrentDb.Execute' Versionen: Access 2003, 2002/XP, 2000 und 97 FRAGE: Ich verwende häufig Code aus alten Entwicklungen und bekomme zunehmend Probleme unter Access 2003. Wie kann ich zum Beispiel folgende "alte" Routine CurrentDb().Execute "SQL-Anweisung" ersetzen, ohne DAO 3.6-Objekte zu verwenden? Chr. Hofmann ANTWORT: Verwenden Sie stattdessen einfach die folgende Anweisung: DoCmd.RunSQL "SQL-Anweisung", False "DoCmd.RunSQL" ist unabhängig von DAO und ADO einsetzbar. Über den zweiten booleschen Parameter steuern Sie, ob die SQL-Anweisung mit Transactions ausgeführt werden soll oder nicht. Gültigen Dateinamen erzeugen Versionen: Access 2003, 2002/XP, 2000 und 97 FRAGE: Ich habe eine Lösung entwickelt, mit der meine Anwender das Ergebnis der aktuellen formularbasierten Filterung als Datenquelle für den Word-Seriendruck in eine Excel-Tabelle exportieren können. Den Namen der anzulegenden Arbeitsmappe erfrage ich per "InputBox()". Dabei werden häufig Zeichen eingegeben, die nicht Bestandteil eines Dateinamens sein dürfen und beim Export zu Fehlermeldungen führen. Wie lassen sich solche Zeichen ausfiltern? F. Scherer ANTWORT: Geben Sie zunächst die folgende Funktion in einem neuen oder in einem vorhandenen Modul ein: Function FileSysName(strFName As String) As String Dim strInvalid As String, strNew As String Dim I As Long strInvalid = "\/:+*?<>|" & Chr$(34) strNew = strFName For I = 1 To Len(strNew) If InStr(strInvalid, Mid$(strNew, I, 1)) <> 0 Then Mid$(strNew, I, 1) = "_" End If Next I FileSysName = strNew End Function Ändern Sie dann den Aufruf von "InputBox()" beispielsweise wie folgt: strFName = InoutBox("Name für die Exportdatei:") strFName = FileSysName(strFName) Die Funktion prüft jedes einzelne Zeichen der Eingabe auf ungültige, in "strInvalid" spezifizierte Zeichen hin und ersetzt sie ggf. durch einen Unterstrich.
Textfeld ohne Fehlermeldung auslesen Versionen: Access 2003, 2002/XP, 2000 und 97 FRAGE: In meinem Formular verwende ich folgende Anweisungen zur Überprüfung einer Eingabe: strNachname = Me.Nachname If strNachname = "" Then Beep Me.Nachname.Setfocus End If Wenn keine Eingabe erfolgte, führt dies zu einer Fehlermeldung "Ungültige Verwendung von NULL". Wie kann ich diese Meldung vermeiden? R. Zeitler ANTWORT: Das Problem resultiert daraus, dass ein Feld ohne Eingabe "NULL" liefert, "NULL" aber keiner Zeichenkettenvariablen zugewiesen werden kann. Im die Fehlermeldung zu vermeiden, gibt es verschiedene Möglichkeiten. Zunächst können Sie mit "IsNull()" prüfen, ob in das Feld etwas eingegeben wurde: If IsNull(strNachname) Then Beep Me.Nachname.Setfocus End If Diese Abfrage führt aber nicht zum erwünschten Ergebnis, wenn der Anwender den Feldinhalt gelöscht hat. Das Feld ist dann nicht "NULL", sondern leer (""). Um beide Zustände in einem abzufragen, verwenden Sie folgende Konstruktion: If IsNull(strNachname) Then Beep Me.Nachname.Setfocus End If Die Verknüpfung mit einer leeren Zeichenkette '& ""' liefert bei einem leeren Feld 'NULL & ""' und somit eine leere Zeichenkette "", die einer Zeichenkettenvariablen zugewiesen werden kann. Hat das Feld einen Inhalt, spielt dies keine Rolle, da er durch die Verknüpfung mit einer leeren Zeichenkette nicht verändert wird. War die Helpline für Sie hilfreich? Klicken Sie bitte hier!
Excel-Tipps kostenlos per E-Mail SmartTools Excel Weekly ist ein kostenloser E-Mail-Newsletter, der Ihnen jede Woche interessante Tipps rund um Excel 2003, 2002/XP, 2000 und 97 liefert:
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.
|