Adresse per Kombinationsfeld auswählen und übertragen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Aus einer Tabelle "Kunden" soll eine ausgesuchte Kundenadresse in eine Tabelle "Rechnungen" übertragen werden. Ich habe dazu ein Kombinationsfeld erstellt und kann auch den Kundennamen anwählen. Wie aber bekomme ich die Feldinhalte Firma, Strasse Postleitzahl und Ort in das Rechnungsformular?
ANTWORT: Dem Kombinationsfeld muss zunächst eine Abfrage zugrunde liegen, die alle benötigten Felder liefert, also z.B. Anrede, Vorname, Nachname, Strasse, PLZOrt und so weiter. Dazu können Sie unter "Datensatzherkunft" z.B. eine SQL-Abfrage eintragen, die gleich nach Nachname sortiert:
select Anrede, Vorname, Nachname, Strasse,
PLZOrt from Adressen order by Nachname;
Unter "Spaltenanzahl" tragen Sie dann ein, wie viele Felder geliefert werden und unter "Spaltenbreite" geben Sie an, wie breit die einzelnen Felder angezeigt werden sollen, wobei "0cm" ein Feld ausblendet und die Angaben per Semikolon getrennt werden. "2cm;3cm;3cm;0cm;5cm" steht z.B. für fünf Spalten Anrede, Vorname, Nachname, Strasse und PLZOrt, von denen die vierte Spalte "Strasse" ausgeblendet wird.
Wenn eine Auswahl getroffen wurde, wird die Ereignisprozedur "Nach Aktualisierung" aufgerufen. Über "Kombinationsfeld.Column(x)" können Sie dann auf die einzelnen Felder zugreifen und den Inhalt in Textfelder im Formular übertragen. Jedes Feld der Abfrage entspricht einer Spalte im Kombinationsfeld, nummeriert von "0" bis "Anzahl Spalten -1". Die VBA-Routine könnte dann z.B. so aussehen:
'1. Feld aus Abfrage= Anrede
Me.Anrede = Kombinationsfeld.Column(0)
'2. Feld aus Abfrage= Vorname
Me.Vorname = Kombinationsfeld.Column(1)
'3. Feld aus Abfrage= Nachname
Me.Nachname = Kombinationsfeld.Column(2)
'4. Feld aus Abfrage= Strasse
Me.Strasse = Kombinationsfeld.Column(3)
'5. Feld aus Abfrage= PLZ und Ort
Me.PLZOrt = Kombinationsfeld.Column(4)
Anzahl der Nachkommastellen in Abfragen festlegen
Versionen: Access 2007, 2003, 2002/XP und 2000
In einer Abfrage benutzen Sie zum Beispiel die folgende Berechnung:
Einkauf: [Listenpreis]*(100-Rabatt]/100*(100+TZ])/100
Das Feld soll in der Abfrage immer 2 Stellen hinter dem Komma aufweisen. Um das festzulegen, klicken Sie mit der rechten Maustaste in die Spalte, in der obiges Feld definiert wird und wählen Eigenschaften im Kontextmenü an. Im nachfolgenden Dialog können Sie unter anderem die Anzahl Nachkommastellen über die Eigenschaft "Dezimalstellen" explizit festlegen.
Auswahlabfrage nach Jahr filtern
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich möchte in einer Abfrage für die Auswertung von Mitarbeiterumsätzen gezielt die Datensätze eines Jahres ausgeben. Am besten wäre es, wenn dazu vor der Ausführung der Abfrage das gewünschte Jahr zum Beispiel in einem Formular eingegeben werden könnte. Wie ist eine solche Abfrage aufzubauen?
ANTWORT: Sie können zunächst einmal folgenden Ausdruck in der Zeile "Kriterien" des Datumsfeldes verwenden:
Jahr([Datumsfeld]) = 2008
"2008" ersetzen Sie vor Ausführung der Abfrage jeweils durch das gewünschte Jahr. Alternativ können Sie für die Abfrage des Jahres über die Funktion Abfrage-Parameter beispielsweise einen Parameter "Welches Jahr?" vom Datentyp "Integer" anlegen. In der Zeile "Kriterien" des Datumsfeld geben Sie dann folgenden Ausdruck ein:
Jahr([Datumsfeld]) = [Welches Jahr?]
Dadurch wird bei Ausführung der Abfrage zunächst ein Dialog "Parameterwerte eingeben" angezeigt, in dem Sie das gewünschte Jahr wie z.B. "2007" oder "2008" eingeben.
Bestimmten Wochentag als Abfragekriterium verwenden
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In einer Datenbank haben wir die täglichen Arbeitszeiten unserer Leiharbeiter erfasst. Nun haben wir zur Rechnungskontrolle eine Abfrage erstellt. Für diese Abfrage sind jedoch spezielle Berechnungen für Freitage und für das Wochenende durchzuführen. Grundsätzlich wären diese Formeln kein Problem, aber wie gebe ich die Auswahlkriterien Freitag, Samstag und Sonntag ein? Das Datumsfeld ist als "Datum, lang" formatiert, es gelingt uns jedoch nicht, z.B. nach "Freitag*" auswählen zu lassen.
ANTWORT: Um einen bestimmten Tag als Abfragekriterium zugrunde zu legen, verwenden Sie die Funktion "Wochentag()" (VBA: WeekDay). Möchten Sie beispielsweise alle Datensätze selektieren, die auf einen Freitag fallen, sähe das Kriterium zum Beispiel so aus:
Wochentag([Datumsfeld])=6
Sollen nur Datensätze selektiert werden, die auf einen Samstag oder Sonntag fallen, setzen Sie folgendes Kriterium ein:
Wochentag([Datumsfeld])=1 Oder Wochentag([Datumsfeld])=7
Um alle Datensätze zu selektieren, die NICHT auf einen Freitag, Samstag oder Sonntag fallen, wäre folgendes Kriterium zu einzusetzen:
Wochentag([Datumsfeld])<>6 Und Wochentag([Datumsfeld])
<>7 Und Wochentag([Datumsfeld])<>1
Die folgende Tabelle zeigt die Zuordnung der Wochentage und der numerischen Werte:
1= Sonntag
2= Montag
3= Dienstag
4= Mittwoch
5= Donnerstag
6= Freitag
7= Samstag
Datensatz nur einmal selektieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Ich habe folgendes Problem: In einer Tabelle habe ich neben einmal vorkommenden Datensätzen auch solche, die mehrmals vorhanden sind. Wie kann ich eine Abfrage (oder auch eine VBA-Routine) definieren, welche nur jeweils einen Datensatz (also keine Duplikate) in eine neue Tabelle schreibt.
Dazu benötigen Sie kein VBA. Legen Sie eine Tabellenerstellungsabfrage an, die auf der Tabelle mit den doppelten Datensätzen basiert, geben Sie die gewünschte Zieltabelle an und wählen Sie die zu übertragenden Felder aus. Klicken Sie dann mit der rechten Maustaste in den oberen grauen Bereich des Abfrageentwurfs und wählen Sie Eigenschaften im Kontextmenü an. Im dann angezeigten Eigenschaftenfenser stellen Sie die Eigenschaften "Keine Duplikate" und "Eindeutige Datensätze" auf "Ja" ein.
Ergebnis in Abfrage begrenzen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In einer Abfrage für die Rechnungserstellung werden abrechnungsfähige Tage für eine IT-Betreuung wie folgt ausgerechnet:
HonorarTage: [Ende]-[Anfang]+1
"Anfang" und "Ende" sind Datumsfelder, in denen der Zeitraum der Betreuung erfasst ist. Das Ergebnis wird dann in der Rechnung mit einem Tagessatz von beispielsweise 150 Euro multipliziert. Es gibt jedoch eine Vereinbarung mit den Kunden, nach der bei einem Einsatz von mehr als 30 Tagen maximal 30 Tage berechnet werden. Kann ich die Anzahl Tage irgendwie automatisch auf 30 begrenzen, ohne jedes Mal in den betreffenden Fällen das Ende-Datum im Datensatz ändern zu müssen?
ANTWORT: Dazu setzen Sie in der Abfrage eine "Wenn"-Funktion wie folgt ein:
HonorarTage: Wenn([Ende]-[Anfang]+1>30;30;
[Ende]-[Anfang]+1)
Diese Formel prüft zunächst, ob das Ergebnis "[Ende]-[Anfang]+1" größer als 30 ist. Wenn ja, wird als Anzahl Tage das Maximum von 30 gesetzt, andernfalls wird das Ergebnis der Berechnung "[Ende]-[Anfang]+1" als Anzahl Tage gesetzt.
Feldinhalte zum Jahreswechsel löschen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In einer Tabelle sollen die Inhalte einiger Felder immer erhalten bleiben, während die Inhalte bestimmter anderer Felder jeweils zum Jahresende gelöscht werden müssen. Welche Möglichkeit gibt es, diese Feldinhalte mit einem Makro, per VBA oder wie auch immer in einem Durchgang zurückzusetzen?
ANTWORT: Dazu verwenden Sie am besten eine Aktualisierungsabfrage. Wenn z.B. in einer Tabelle "Kunden" ein Feld "Jahresumsatz" zum Jahreswechsel geleert werden soll, fügen Sie im Abfrageentwurf das Feld "Jahresumsatz" hinzu und tragen in der Spalte "Aktualisieren" die Formel "= Null" ein. Mit "Abfrage-Ausführen" werden die Änderungen dann durchgeführt. Vorsichtshalber immer Sicherungskopien der Tabellen anlegen!
Per VBA lässt sich eine solche Aktualisierung wie folgt absetzen:
DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE [Tabellenname] " & _
"SET [Tabelle].Feldname = Null;", False
DoCmd.SetWarnings True
"Tabellenname" und "Feldname" ersetzen Sie dabei durch die Namen gemäß der bei Ihnen verwendeten Tabelle bzw. des betreffenden Feldes. Die Anweisungen schalten zunächst die Sicherheitsabfrage von Access aus und setzen dann eine SQL-Anweisung zur Aktualisierung des Feldes ab. Danach wird die Sicherheitsabfrage von Access wieder eingeschaltet.
Hyperlinks per Aktualisierungsabfrage ändern
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In meiner Datenbank (Access 97) habe ich Fotos per Drag & Drop verlinkt, die in anderen Ordnern liegen. Nun hat sich der Pfad der Foto-Ordner geändert und ich wollte das mit einer Aktualisierungsabfrage ändern. Diese Aktualisierungsabfrage änderte zwar korrekt den Hyperlink-Text, leider jedoch nicht die darunter liegende Verknüpfung. Wie müsste eine entsprechende Aktualisierung aussehen?
ANTWORT: Hyperlinks bestehen aus mehreren Teilen wie Anzeigetext, Adresse, Unteradresse. Mit einer einfachen Aktualisierungsabfrage ändern Sie nur den Anzeigetext, nicht jedoch die Adresse. Die einzelnen Bestandteile des Hyperlinks speichert Access mit dem Nummernzeichen als Trennzeichen. Sie müssen also unter "Aktualisieren" die neue Adresse quasi zweimal angeben, einmal als Anzeigetext, dann durch Nummernzeichen getrennt die Adresse:
= NeueAdresse & "#" & NeueAdresse
Laufende Nummern in Abfragen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Wie kann ich in einer Access-Abfrage fortlaufende Nummern vergeben? Es soll eine Spalte mit den Nummern geben, so dass die erste Zeile in dieser Spalte den Wert "1" hat, die 2. den Wert "2" usw. Das Feld soll sowohl zur Trennung von Teilnehmer- und Wartelisten als auch zur Anzeige in Berichten dienen, also auch in verknüpften Abfragen auswertbar sein.
Dazu verwenden Sie innerhalb der Abfrage ein berechnetes Feld mit einer SQL-Anweisung als Unterabfrage. Die SQL-Anweisung ist dabei je nach Sortierung der Abfrage aufzubauen. Beispiel: Sie möchten eine Liste von Artikel nach Artikelnummer sortiert ausgeben. Die SQL-Anweisung sähe dann so aus:
LFN: (Select Count (*) FROM [Artikel] as X
WHERE [X].[Artikel-Nr] < [Artikel].[Artikel-Nr])+1
Soll die Liste hingegen nach Artikelname sortiert sein, wäre folgende SQL-Abfrage zu verwenden:
LFN: (Select Count (*) FROM [Artikel] as X
WHERE [X].[Artikelname] < [Artikel].[Artikelname])+1
Sortierung nach geraden und ungeraden Hausnummern
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Für eine effiziente Briefverteilung sollen Adressen nach geraden und ungeraden Hausnummern sortiert werden. Tragen Sie dazu in der betreffenden Abfrage für den Etikettendruck in einer leeren Spalte des Abfrageentwurfes in der Zeile "Feld" den folgenden Ausdruck ein:
SortHausNum: Wert([Hausnummer]) Mod 2
"Hausnummer Mod 2" ergibt den ganzzahligen Rest einer Division, in diesem Fall durch "2". Bei einer Hausnummer wie beispielsweise "16" ist das Ergebnis "0", bei einer Hausnummer "57" ist das Ergebnis "1". Das Feld "SortHausNum" hat später also den Inhalt "0" bei geraden und "1" bei ungeraden Hausnummern. Nun lassen Sie die Abfrage erst aufsteigend nach "Strasse" und dann wahlweise auf- oder absteigend nach "SortHausNum" sortieren. Sie erhalten dann je nach Einstellung "Aufsteigend" oder "Absteigend" pro Strasse erst die Adressen mit geraden, dann mit ungeraden Hausnummern oder umgekehrt.
SQL aus Abfragen übernehmen
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: Ich habe Ihr Tool "SQL per Mausklick aus Abfragen in VBA-Prozeduren übernehmen" (http://www.add-in-world.com/katalog/ac-sqlabfrg/) installiert. Ich gehe davon aus, dass man um es zu verwenden, ein neues Formular erstellen und ein ActiveX-Steuerelement hinzufügen muss. Nur leider gibt es unter den Einträgen nichts, was auf Ihr Add-In schließen lässt. Wie heißt Ihr Tool in der Auswahl? Ach ja, ich verwende Access 2002/XP und habe die Installation Ihres Add-Ins gleich zweimal durchgeführt - stets ohne Fehlermeldung.
ANTWORT: Es handelt sich bei diesem Tool nicht um eine ActiveX-Komponente, sondern um ein Access-Add-In, das Sie über das Menü Extras-Add-Ins-SQL aus Abfragen aufrufen. Der darauf folgende Dialog zeigt eine Liste der in der aktuellen Datenbank vorhandenen Abfragen an. Nach Auswahl einer Abfrage wird die dazugehörige SQL-Anweisung aus der Abfrage ausgelesen und in einem Textfeld unter der Liste angezeigt. Über eine Schaltfläche In Zwischenablage Kopieren können Sie dann die SQL-Anweisung in die Zwischenablage übertragen und im VBA-Editor mit Strg+V direkt wieder einfügen. Vor einem Klick auf die Schaltfläche In Zwischenablage Kopieren können Sie Änderungen an der SQL-Anweisung vornehmen und sie so an individuelle Anforderungen anpassen. Zur Vereinfachung verschiedener Aufgaben lässt sich zudem über einem Bereich "Format" steuern, dass die SQL-Anweisung fertig formatiert für eine "DoCmd"- oder "Execute"-Anweisung oder für eine Zuweisung der Form "strSQL=" beziehungsweise "set rs=" in der Zwischenablage abgelegt wird. Eine Option Text erlaubt die Übernahme der SQL-Anweisung "unformatiert", so dass Sie sie beispielsweise für eine Datenbank-Dokumentation in ein Word-Dokument einfügen können.
Status von Ja/Nein-Feldern abfragen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Ich habe eine Datenbank, in der ich den Bearbeitungsstand "Abgeschlossen" in einem Ja/Nein-Feld eintrage. Alle offenen Datensätze erhalte ich mit einer Abfrage "Falsch", alle abgeschlossenen mit "Wahr". Jetzt möchte ich aber alle Datensätze anzeigen. Bei einem Filter in der Tabelle kann ich bei einem Ja/Nein-Feld auch drei Zustände auswählen, wie wird das in einer Abfrage umgesetzt?
Dieser sogenannte "Dreifachstatus" steht in Abfragen nicht zur Verfügung, er ist in diesem Fall auch nicht erforderlich. Das Ja/Nein-Feld hat hier einen Standardwert von "Falsch" und ändert sich erst auf "Wahr", wenn Sie "Ja" für das Feld eingeben oder das ggf. vorhandene Kontrollkästchen aktivieren. Um alle Datensätze unabhängig von diesem Status auszugeben, löschen Sie einfach das Kriterium oder ändern es wie folgt:
[Abgeschlossen] = Ja Oder [Abgeschlossen] = Nein
[Abgeschlossen] = Wahr Oder [Abgeschlossen] = Falsch
bzw.
Ja Oder Nein
Wahr Oder Falsch
Tabelleninformationen komfortabel abrufen
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: Im Datenbankfenster kann man bekanntlich ablesen, wann eine Tabelle erstellt und das letzte Mal geändert wurde. Ich würde diese Informationen gerne für die einfachere Abstimmung von Datenbanken unterschiedlicher Versionen per Abfrage abrufen. Ideal wäre es, wenn zusätzlich die Anzahl der Datensätze in jeder Tabelle mit ausgegeben werden könnte. Geht das irgendwie?
ANTWORT: Wechseln Sie im Datenbankfenster in den Bereich "Abfragen" und klicken Sie auf Neu. Brechen Sie die Tabellenauswahl ab, stellen Sie die Abfrageansicht auf "SQL" um und geben Sie folgende Anweisung ein:
SELECT MSysObjects.Name, MSysObjects.DateCreate,
MSysObjects.DateUpdate, DCount("*",[Name])
AS Records
FROM MSysObjects
WHERE (((Left$([Name],4))<>"MSys")
AND ((MSysObjects.Type)=1))
ORDER BY MSysObjects.Name;
Diese Abfrage selektiert zunächst alle Tabellen (Type= 1) und deren Erstellungs-/Änderungsdaten (DateCreate, DateUpdate) aus der Systemtabelle "MSysObjects", wobei Systemtabellen selbst ausgeklammert werden (Left$([Name],4)<>"MSys"). Gleichzeitig wird für jede Tabelle "DCount("*",[Name]) AS Records) aufgerufen und so ein Feld mit der Anzahl Datensätze pro Tabelle generiert. Sortiert wird das Ganze schließlich nach dem Tabellennamen.
Text in Textfeld untereinander ausgeben
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich habe 2 Textfelder in einer Tabelle, die im Formular als ein Feld dargestellt werden sollen. Eine Möglichkeit ist ja ein ungebundenes Feld mit dem folgenden Inhalt in "Steuerelementeinhalt":
=Me.Text1 & " " & Me.Text2
Das Ergebnis wäre dann:
"Text1 Text2"
Was mache ich aber, wenn im ungebundenen Feld der Text "Text2" unter dem Text "Text1" stehen soll, also folgendes Ergebnis benötigt wird:
Text1
Text2
ANTWORT: Verwenden Sie folgenden Ausdruck:
=Me.Text1 & Chr$(13) & Chr$(10) & Me.Text2
bzw.
=Me.Text1 & Zchn$(13) & Zchn$(10) & Me.Text2
"Chr$()" wird von Access automatisch in "Zchn$()" umgesetzt.
Variable Feldinhalte aufteilen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Feldinhalte kann man ja mit Hilfe einer Aktualisierungsabfrage trennen. Das folgende Beispiel ist noch relativ einfach zu lösen, weil man es hier mit einer festen Anzahl von Zeichen, fünf Ziffern für eine deutsche Postleitzahl, zu tun hat:
Links([PlzUndOrt];5)
Teil([PlzUndOrt];7)
Die Funktion "Links" bzw. "Left" gibt die ersten fünf und die Funktion "Teil" bzw. "Mid" gibt alle Zeichen ab dem siebten Zeichen zurück. Was muss ich aber eingeben, wenn man ein Feld mit Namen in Nachname und Vorname aufteilen will, da die Anzahl Zeichen hier nicht immer die gleiche ist?
ANTWORT: Für solche Aufgaben verwenden Sie eine Kombination aus "Links/Left", "Teil/Mid" und "Instr":
Vorname: Links$([GanzerName];InStr([GanzerName];" ")-1)
Nachname: Teil$([GanzerName];InStr([GanzerName];" ")+1)
Die Abfrage 'InStr([GanzerName];" "' liefert die Position des Leerzeichens zwischen Vor- und Nachname. Mit "Links, Position-1" erhält man dann den Teil vor dem Leerzeichen und mit "Teil, Position+1" den Teil nach dem Leerzeichen. Problematisch wird es allerdings bei Feldinhalten wie "Dr. Michael Mustermann", "Marie Luise Fischer", "Thorsten Krüge Jr.", "Familie Müller" oder "Schmidt, Joachim". Hier ist der Einsatz einer VBA-Routine notwendig, die über einen Recordset die Feldinhalte analysiert und einzelnen Feldern wie "Titel", "Vorname1", "Vorname2", "Nachname" oder "Zusatz" zuordnet. Wir werden eine solche Routine einmal in einer der nächsten Ausgaben vorstellen.
Werte für Felder zwischenspeichern
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: Ich lasse eine Abfrage über ein Formular starten. Dort gebe ich in einem Feld einen Wert oder ein Datum ein, das bei der Abfrage berücksichtigt wird. Nach dem Schließen und erneutem Öffnen der Datenbank ist dieser Wert/Datum nicht mehr vorhanden. Kann man das Feld so einstellen, dass es den eingegebenen Wert solange behält, bis er wieder überschrieben wird und dann den neuen Wert weiter behält bis zur nächsten Eingabe?
ANTWORT: Eine solche Einstellung gibt es für Felder leider nicht. Sie können sich aber zum Beispiel wie folgt helfen:
1. Legen Sie eine Tabelle an, die nur ein Text- oder Datumsfeld "fldParameter" umfasst.
2. Ordnen Sie diese Tabelle dem Formular als Datenbasis zu.
3. Verbinden Sie das im Formular vorhandene Feld über dessen Eigenschaft "Steuerelementeinhalt" mit dem Feld "fldParameter" der Tabelle.
Wenn Sie jetzt etwas im Feld eingeben, wird es in der Tabelle gespeichert. Rufen Sie das Formular das nächste Mal auf, wird der zuletzt eingegebene Wert wieder im Formular angezeigt. Alternativ können Sie die Registry nutzen, um den Feldinhalt zwischenzuspeichern. Ergänzen Sie dazu die Ereignisprozedur "Beim Schließen" des Formulars um folgende Anweisung:
SaveSetting "MeineDatenbank", _
"MeinFormular", _
"LetzterInhalt", _
Me.Feldname
"MeineDatenbank" und "MeinFormular" spezifizieren einen Programm- und einen Anwendungs-Abschnitt in der Registry unter "HKCU\Software\Visual Basic and VBA Program Settings". Mit "LetzterInhalt" wird ein Schlüssel spezifiziert, in dem der Feldinhalt gemäß "Me.Feldname" festgehalten wird. "Feldname" ersetzen Sie durch den Namen des Feldes in Ihrem Formular. Die Ereignisprozedur "Beim Laden" des Formulars erweitern Sie um folgende Anweisung:
Me.Feldname = GetSetting("MeineDatenbank", _
"MeinFormular", _
"LetzterInhalt", "")
Diese Anweisung liest den zuletzt gespeicherten Feldinhalt wieder aus der Registry aus und weist ihn dem Feld im Formular zu. "Feldname" ersetzen Sie wieder durch den Namen des Feldes in Ihrem Formular.
Zahlen als Text exportieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In einer Access-Datenbank sind Daten über Wohnungen gespeichert (Lage, Größe, Kaltmiete, Betriebskosten, usw.). Über eine Abfrage wird die Liste der freien Wohnungen im Internet veröffentlicht (als Datenliste in NetObjects Fusion 9). In NOF kann ich das Format der Felder nicht beeinflussen. Das führt dazu, dass alle Zahlen, auch die in Access als Währung formatierten in der Form #.##0,000000 ausgegeben werden. Bei der Größe der Wohnung konnte ich mir dadurch helfen, dass ich das Feld in Access als Text formatiert habe. Dort wird jetzt richtig "50,46" oder "77,09" ausgegeben. Bei den Feldern mit den Kosten geht das leider nicht, da ich damit auch rechnen muss. Meine Frage: kann ich in einer Abfrage das Ergebnis einer Berechnung wie zum Beispiel "Kaltmiete + Betriebskosten + HeizungWW = Zahlsumme" in einen Text konvertieren? Wenn ja, wie geht das?
ANTWORT: Sie können in einer Abfrage zusätzliche Felder erzeugen lassen und entsprechend formatieren. Geben Sie dazu in einer leeren Spalte des Abfrageentwurfs in der Zeile "Feld" einen Ausdruck wie den folgenden ein:
ZahlSumme: ZString([Kaltmiete] + [Betriebskosten]
+ [HeizungWW])
Access addiert dann die Felder "Kaltmiete", "Betriebskosten" und "HeizungWW" und konvertiert das Ergebnis in eine Zeichenkette.
Zeiten über 24 Stunden summieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In meiner Datenbank enthält jeder Datensatz eine Zeitangabe. Jetzt möchte ich in Berichten eine Addition dieser Zeiten durchführen. Sobald das Ergebnis aber 24 Stunden übersteigt, z.B. "49 Std 35 Min 45 Sek", zeigt mir Access lediglich "01:35:45" an. Ich kann keine Möglichkeit finden, das korrekte Format anzeigen zu lassen. Aus Excel kenne ich die Möglichkeit, die Stunden in eckigen Klammern zu setzen ( [hh]:mm:ss ). In Access funktioniert das leider nicht.
ANTWORT: Zeitberechnungen über 24 Stunden hinaus lassen sich nur durchführen, wenn Sie die einzelnen Zeiten in Sekunden umrechnen, die Ergebnisse summieren und das Ergebnis über eine eigene Funktion im gewünschten Format ausgeben lassen. Geben Sie zunächst in der Abfrage in einer leeren Spalte des Abfrageentwurfs folgenden Ausdruck in der Zeile "Feld" ein:
ZeitInSekunden: (Stunde([Zeitfeld])*60*60) + _
(Minute([Zeitfeld])*60) + _
Sekunde([Zeitfeld])
"Zeitfeld" ersetzen Sie dabei durch den Namen des Feldes, das die Zeitangaben enthält. Dieser Ausdruck generiert ein Feld "ZeitInSekunden", das anschließend die Zeit in Sekunden, also beispielsweise "6337" für "01:45:37" enthält.
Kopieren Sie dann die folgende Funktion "SecondsToTime()" in ein neues oder vorhandenes Modul:
Function SecondsToTime(varSeconds As Variant) _
As String
Dim H As Variant, M As Variant, S As Variant
On Error Resume Next
M = varSeconds \ 60
S = varSeconds Mod 60
H = M \ 60
M = M Mod 60
SecondsToTime = Format$(H, "00") & ":" & _
Format$(M, "00") & ":" & _
Format$(S, "00")
End Function
Diese Funktion wandelt den Sekundenwert wieder zurück in einzelne Werte für Stunden, Minuten und Sekunden und gibt das Ergebnis im gewünschten Format, also zum Beispiel "49:35:45" zurück. Wenn die Gesamtsumme der Stunden den Wert "99" übersteigen kann, fügen Sie in der Formatierung für die Variable "M" noch eine "0" hinzu:
SecondsToTime = Format$(H, "000") & ":" & _
Format$(M, "00") & ":" & _
Format$(S, "00")
Im Bericht fügen Sie nun ein ungebundenes Feld "txtGesamtZeit" oder ähnlich ein und geben für dessen Eigenschaft "Steuerelementeinhalt" folgenden Ausdruck ein:
=SecondsToTime(Me.ZeitInSekunden)
Dadurch wird die auf Basis von Sekunden summierte Zeit wieder im Format "HH:MM:SS" angezeigt, wobei der Stundenanteil nun "24" übersteigen kann.
Bericht erst nach Abfrage ausdrucken
Versionen: Access 2007, 2003, 2002/XP und 2000
In vielen Firmen teilen sich verschiedene Bereiche einen Abteilungs-Drucker, so dass im Papierschacht beispielsweise einmal Blanko- oder einmal Briefpapier für die Korrespondenz eingelegt ist. Dadurch passiert es häufiger, dass die Access-Berichte zunächst auf dem falschen Papier ausgedruckt werden. Hilfreich wäre hier vor dem Ausdruck eines Berichtes eine Abfrage "Richtiges Papier eingelegt?" beantworten zu lassen, wobei der Anwender den Ausdruck auch abbrechen können muss.
Kein Problem: Jeder Bericht verfügt über eine Ereignis-Prozedur "Beim Öffnen" (VBA: Report_Open) in der Sie eine entsprechende Abfrage unterbringen können:
Sub Report_Open (Cancel As Integer)
Dim Taste As Integer
Taste = MsgBox("Richtiges Papier eingelegt?", _
vbYesNo + vbQuestion, _
"Bericht '" & Me.Name & "' drucken:")
If Taste = vbNo Then Cancel = True
End Sub
Diese kleine Routine zeigt beim Öffnen eines Berichtes zunächst eine entsprechende Abfrage an. Klickt der Anwender auf Nein, wird die Prozedur-Variable "Cancel" auf "True" gesetzt und Access somit mitgeteilt, dass der Bericht nicht ausgedruckt werden soll. Ansonsten bleibt die Prozedur-Variable auf dem Standard-Wert (False) und der Bericht wird wie gewohnt ausgedruckt.
Bericht und weitere Dateien als Anhang versenden
Versionen: Access 2007, 2003, 2002/XP und 2000
FRAGE: Ich möchte mit Access einen Bericht per E-Mail verschicken. Zum Beispiel mit folgendem Befehl:
DoCmd.SendObject acReport, stDocName,
acFormatRTF, , , , stSubject, stMessageText
Das klappt hervorragend. Gleichzeitig möchte ich nun an die E-Mail eine Word- und eine PowerPoint-Datei anhängen. Wie gehe ich dazu vor? Als Mail-Programm verwende ich Outlook und Lotus Notes.
ANTWORT: Mit "DoCmd.SendObject" ist das nicht möglich. Sie können aber Outlook per Office Automation fernsteuern, eine Mail anlegen und beliebige Anhänge zuordnen. Wechseln Sie zunächst in die VBA-Entwicklungsumgebung, wählen Sie das Menü Extras-Verweise an und setzen Sie eine Referenz auf "Microsoft Outlook x.0 Object Libary" x.0= 12.0 für Outlook 2007, 11.0 für Outlook 2003, 10.0 für Outlook 2002 oder 9.0 für Outlook 2000).
Außerdem benötigen Sie eine Schaltfläche mit folgender Ereignisprozedur "Beim Klicken":
Private Sub btnSendReports_Click()
Dim objOutl As Outlook.Application
Dim objMail As Outlook.MailItem
DoCmd.OutputTo acOutputReport, _
"Preisliste", acFormatRTF, _
"Z:\Test\Preisliste.rtf"
DoCmd.OutputTo acOutputReport, _
"Katalog", acFormatRTF, _
"Z:\Test\Katalog.rtf"
Set objOutl = CreateObject("Outlook.Application")
Set objMail = objOutl.CreateItem(olMailItem)
With objMail
.Subject = "Betreff..."
.Body = "Nachrichtentext..."
.Attachments.Add "Z:\Test\Preisliste.rtf"
.Attachments.Add "Z:\Test\Katalog.rtf"
.Attachments.Add "Z:\Test\Datei.doc"
.Attachments.Add "Z:\Test\Datei.ppt"
.Display
End With
End Sub
Diese Anweisungen exportieren zunächst zwei Berichte im RTF-Format. Dann wird eine Verbindung zu Outlook aufgebaut und eine neue Nachricht erstellt. Dieser Nachricht ordnen wir dann Betreff und Nachrichtentext sowie vier Dateien - Preisliste, Katalog, Word- und PowerPoint-Datei - als Anhang zu. Abschließend wir die Nachricht angezeigt und kann dann nach Festlegung des Empfängers auf die Reise geschickt werden.
Bericht zweispaltig drucken
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Wie kann ich in einem Access-Bericht zweispaltig drucken? Angenommen, ich habe 40 Ergebniszeilen, dann würde ich gerne die ersten 20 in der 1. Spalte (linke Hälfte des Blattes), die zweiten 20 in der 2. Spalte andrucken (rechte Hälfte des Blattes) - auf Folgeblättern analog.
Um den Spaltendruck für einen Bericht einzuschalten, öffnen Sie den Bericht im Entwurfsmodus, wählen Datei-Seite einrichten an, wechseln auf die Registerkarte "Spalten" und nehmen dort die gewünschten Einstellungen bezüglich Spaltenanzahl, Spaltenabstand usw. vor. Für die von Ihnen gewünschte Anordnung aktivieren Sie im Bereich "Spaltenlayout" die Option Nach unten, dann quer.
Unter Access 2007 wechseln Sie in das Register "Seite einrichten" und klicken in der Gruppe "Seitenlayout" auf das kleine Symbol unten rechts, um den Dialog anzuzeigen. Eine gleichmäßige Aufteilung der Datensätze in die einzelnen Spalten unterstützt Access leider nicht, es wird immer zuerst komplett die linke, dann die rechte Spalte gefüllt, so dass ggf. in der rechten Spalte weniger Datensätze als in der linken Spalte ausgegeben werden.
Bericht-Ausgabe bremst Rechner aus
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich habe einen umfangreichen Bericht mit mehreren Unterberichten, die zum Teil auf eigenen Abfragen basieren. Dass das Öffnen des Berichtes etwas länger dauert, ist mir verständlich. Allerdings geht dabei die CPU-Auslastung gegen 100% und in der Titelleiste von Access wird "(Keine Rückmeldung)" angezeigt. Woran kann das liegen und wie lässt ich das Problem beseitigen?
ANTWORT: Vermutlich setzen Sie im Bericht oder in den Abfragen Felder ein, in denen Formeln wie beispielsweise "=[txtNetto] + [txtMwst]" enthalten sind oder aus denen Sie globale Funktionen aufrufen. Das kann dazu führen, dass während des Öffnens des Berichtes das System fast vollständig ausgelastet wird.
Ursache dafür ist Access, dass während des Aufbaus des Berichtes, der Berechnung von Formeln und der Ausführung von Funktionen keine CPU-Zeit freigibt, damit das Ergebnis schnellstmöglichst zur Verfügung gestellt werden kann. Sie können diese Systembeeinträchtigungen wie folgt abschwächen:
* Öffnen Sie zunächst den Bericht, der Textfelder mit Formeln enthält, im Entwurfsmodus.
* In der Ereignis-Prozedur "Beim Drucken" des Detailbereiches fügen Sie die folgende Anweisung ein:
Private Sub Detail1_Print(Cancel As Integer, _
PrintCount As Integer)
DoEvents
End Sub
Auf diese Weise wird zunächst bei jedem Datensatz und somit auch nach jeder Berechnung einer Formel die Abgabe von CPU-Zeit erzwungen.
Enthält bereits die dem Bericht zugrunde liegende Abfrage Formeln oder Funktionsaufrufe, lässt sich die Abgabe von CPU-Zeit über eine kleine VBA-Routine erzwingen:
* Kopieren Sie zunächst die folgende Funktion in ein beliebiges Modul:
Function CPUZeitFreigeben()
DoEvents
End Function
* In der Abfrage geben Sie dann in einer leeren Spalte die Formel "X: CPUZeitFreigeben()" in der Zeile "Feld" ein. Bei jedem ausgewerteten Datensatz wird nun diese Funktion aufgerufen und dadurch die Freigabe von CPU-Zeit erzwungen.
Berichte direkt aus Access faxen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Einen Bericht als Fax zu verschicken, ist in der Regel nur möglich, wenn Sie als Standarddrucker einen auf dem System installierten Faxdrucker einstellen. Dieser Umstand macht beispielsweise den automatisierten Versand aktueller Kataloge oder Preislisten per VBA so gut wie unmöglich. Wenig bekannt ist die Tatsache, dass der Faxdienst von Windows ein spezielles API (Application Programing Interface) "FaxCOMLib" zur Verfügung stellt, das Sie in VBA einbinden können. Die API-Funktionen der "FaxCOMLib" sind zwar nicht in der Lage, direkt Access-Berichte versenden zu können, wenn Sie aber einen Bericht zuvor im RTF-Format exportieren, lässt sich die daraus resultierende Datei problemlos per VBA automatisiert über "FaxCOMLib" als Fax versenden.
Um die API "FaxCOMLib" nutzen zu können, muss der Faxdienst für Windows Vista, XP oder 2000 eingerichtet und betriebsbereit sein. Ob der Faxdienst auf Ihrem System eingerichtet ist, erkennen Sie daran, dass in der Systemsteuerung im Kontrollfeld "Drucker" bzw. "Drucker und Faxgeräte" ein Gerät "Fax", vorhanden ist. Fehlt diese Voraussetzung, können Sie den Faxdienst nachträglich über das Windows-Setup einrichten. Voraussetzung dazu ist ein TAPI-fähiges Faxmodem oder eine faxfähige ISDN-Karte mit TAPI-Unterstützung:
* Windows Vista: Öffnen Sie in der Systemsteuerung das Kontrollfeld "Programme und Funktionen", klicken Sie links auf Windows-Funktionen ein-/ausschalten, aktivieren Sie das Kontrollkästchen vor "Windows-Fax und -Scan" und klicken Sie dann auf Ok.
* Windows XP: Öffnen Sie in der Systemsteuerung das Kontrollfeld "Software", wählen Sie "Windows-Komponenten hinzufügen/entfernen" aus, aktivieren Sie das Kontrollkästchen vor der Option "Faxdienste" und klicken Sie dann auf Weiter.
* Windows 2000: Hier ist der Faxdienst standardmäßig eingerichtet. Wird das Kontrollfeld "Fax" nicht in der Systemsteuerung angezeigt, öffnen Sie zunächst über Start-Programme-Zubehör eine DOS-Eingabeaufforderung, suchen Sie die Datei "fax.cpk" im Verzeichnis "System32" und benennen Sie sie bei Vorhandensein in "fax.cpl" um. Diese Umbenennung erfolgt teilweise nach Erkennung faxfähiger Geräte nicht automatisch und muss dann manuell erfolgen. Beim nächsten Öffnen der Systemsteuerung steht das Kontrollfeld wie dokumentiert zur Verfügung. Ist im Kontrollfeld "Drucker" kein Gerät "Fax" vorhanden, öffnen Sie in der Systemsteuerung das Kontrollfeld "Fax", wechseln Sie auf die Registerkarte "Weitere Optionen" und klicken Sie dort auf das Symbol Faxdrucker hinzufügen.
Für die Nutzung der Fax-API des Windows-Faxdienstes per VBA ist zunächst eine Referenz darauf zu setzen:
1. Wechseln Sie mit Alt+F11 in die VBA-Entwicklungsumgebung beziehungsweise öffnen Sie ein beliebiges Modul im Entwurfsmodus.
2. Wählen Sie das Menü Extras-Verweise an.
3. Lokalisieren Sie den Eintrag "FaxCom 1.0 Type Library" und aktivieren Sie das Kontrollkästchen vor dem Eintrag.
4. Übernehmen Sie die Einbindung mit einem Klick auf Ok.
5. Geben Sie nun für einen ersten Test in einem vorhandenen oder in einem neuen Modul die folgende Prozedur ein:
Sub FaxTest()
Dim objFaxServer As FAXCOMLib.FaxServer
Dim objFaxDoc As FAXCOMLib.FaxDoc
Dim strReport As String
Dim strFName As String
strReport = "Katalog"
strFName = "C:\Katalog.rtf"
DoCmd.OutputTo acOutputReport, _
strReport, _
acFormatRTF, _
strFName
Set objFaxServer = CreateObject("FaxServer.FaxServer")
With objFaxServer
.Connect "."
End With
Set objFaxDoc = objFaxServer.CreateDocument(strFName)
With objFaxDoc
.FaxNumber = "1234567"
.RecipientName = "Testempfänger"
.DisplayName = "Testdokument"
.Send
End With
objFaxServer.Disconnect
Set objFaxDoc = Nothing
Set objFaxServer = Nothing
End Sub
Über die Variablen "strReport" und "strFName" wird zunächst definiert, welcher Bericht gesendet und unter welchem Dateinamen er exportiert werden soll. Passen Sie diese Zuweisungen entsprechend an. Mit der Anweisung "DoCmd.OutputTo" erfolgt dann ein Export des jeweiligen Berichtes im RTF-Format in die gewünschte externe Datei. Über das Objekt "Faxserver" bauen wir anschließend eine Verbindung zum Faxdienst auf. Als Parameter ist dabei der Name des Rechners, auf dem der Faxdienst installiert ist, anzugeben. Der Punkt "." spezifiziert hier den lokalen Rechnern, einen Rechner im Netzwerk geben Sie in der Form "\\Servername" oder "Servername" an.
Der Faxserver stellt eine Funktion "CreateDocument" zur Verfügung, die ein Dokument in das Fax-Format konvertiert. Das Ergebnis ist ein Objekt "FaxDoc", das eine Funktion "Send" für das Versenden zur Verfügung stellt. Über die Eigenschaften "Faxnumber", "RecipientName und "DisplayName" legen Sie die Faxnummer, den Namen des Empfängers und eine Bezeichnung für die Anzeige im Faxjournal fest. Nach Aufruf von "Send" wird das über "CreateDocument" konvertierte Dokument an den Faxserver übergeben und von diesem versendet. Mit "Disconnect" unterbrechen wir dann abschließend die Verbindung zum Faxserver wieder.
Berichte können nicht gedruckt werden
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: Es kommt bei mir immer wieder vor, dass eine Datenbank blockiert wird, weil ein Bericht nicht gedruckt werden kann. Es erscheint dann folgende Fehlermeldung:
"Nicht genügend Speicherplatz, um diese Operation
durchzuführen. Schließen Sie Anwendungen, die Sie nicht
benötigen, und versuchen Sie es noch einmal."
Der Fehler wird auch dann angezeigt, wenn keine anderen Anwendungen laufen und nur die Access-Datenbank geöffnet ist. Der Rechner hat 1 GB Hauptspeicher, daran kann es also auch nicht liegen. Was kann die Ursache für diese Fehlermeldung sein?
S. Minrath
ANTWORT: Die besagte Meldung deutet auf Grafiken im Bericht und daraus resultierend auf einen Speichermangel im GDI-Bereich hin - Access benutzt zur Aufbereitung von Berichten GDI-Funktionen, die zum Teil veraltet und auf 64 Kb beschränkt sind. Prüfen Sie also, ob die Anzahl Grafiken sich eventuell verkleinern lässt. Weiterhin kann diese Meldung durch die Verwendung spezieller Schriftarten im Bericht ausgelöst werden. Es sollte darauf geachtet werden, dass nur Windows Standard-Schriften wie Arial oder Times New Roman eingestellt sind.
Berichte ohne Daten
Berichte, die mit Bedingungen geöffnet werden, sind besonders praktisch. Damit kann der gleiche Bericht für mehrere Kategorien, Zeiträume, usw. verwendet werden. Es kann aber vorkommen, dass die Bedingungen keine Ergebnisse liefern, dann ist der Bericht leer oder enthält Fehlermeldungen.
In Access erfügen die Berichte über ein Ereignis "No Data", das immer dann eintritt, wenn die Datenquelle des Berichts leer ist. Diesem Ereignis kann eine Prozedur zugewiesen werden, die den Anwender auf den leeren Bericht aufmerksam macht:
Private Sub Report_NoData(Cancel As Integer)
Msgbox "Zu diesen Bedingungen wurden keine _
Datensätze gefunden, 16, "Leerer Bericht..."
DoCmd.CancelEvent
End Sub
CancelEvent wird benötigt, damit nach der Meldung der Bericht nicht trotzdem noch geöffnet wird.
An alle Access 2.0-Benutzer, sollte es die überhaupt noch geben:
Das Ereignis "No Data" gabs in Access 2.0 leider noch nicht. Um leere Bericht zu erkennen, muss beim Öffenn des Berichts die Anzahl Datensätze der Datenquelle abgefragt werden.
Private Sub Report_Open(Cancel As Integer)
If DCount ("*", Me.Recordsource) = 0 Then
Msgbox "Zu diesen Bedingungen wurden keine _
Datensätze gefunden, 16, "Leerer Bericht..."
End if
End Sub
Datensatzanzahl des Berichtes ausgeben
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Für viele Anwendungen muss die Gesamtanzahl der Datensätze eines Berichtes auf jeder Seite in der Fußzeile zu ausgegeben werden. Die entsprechende Erweiterung eines Berichtes nehmen Sie wie folgt vor:
* Wechseln Sie in den VBA-Editor und geben Sie im allgemeinen Teil des Bericht-Moduls die folgende Funktion ein:
Function NumRecs()
Dim db As DAO.Database, rs As DAO.Recordset
Dim strRS As String
strRS = Me.RecordSource
Set db = CurrentDb()
Set rs = db.OpenRecordset(strRS, dbOpenSnapshot)
NumRecs = rs.RecordCount
rs.Close
Set rs = Nothing
End Function
* Legen Sie dann im Seitenfuß ein ungebundenes Textfeld an und setzen Sie dessen Eigenschaft "Steuerelementeinhalt" auf die Formel "=NumRecs()".
* Lassen Sie den Beicht testweise in der Seitenansicht anzeigen, um das Ergebnis zu prüfen.
Die Funktion initialisiert mit der Datenbasis des Berichtes einen Recordset und kann so über dessen Eigenschaft "RecordCount" die Anzahl der Datensätze als Ergebnis liefern. Ab Access 2000 müssen Sie übrigens gegebenenfalls über Extras-Verweise eine Referenz auf die "Microsoft DAO 3.6 Object Library" setzen!
Erledigte Aufgaben im Bericht 'abhaken'
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich verwalte Projekte mit Access. Zu jedem Projekt gibt es eine Aufgabenliste. Eine Aufgabe besteht aus einem Text und einem Kontrollkästchen "Erledigt". Über einen Bericht kann die Aufgabenliste ausgedruckt werden. Dabei möchte ich hinter den erledigten Aufgaben ein auffälliges, grünes Häkchen ausgeben, damit man sofort sieht, was erledigt ist und was nicht. Das normale Kontrollkästchen lässt sich weder in der Größe noch in der Farbe ändern. Wie lässt sich die Ausgabe eines entsprechenden Zeichens am einfachsten und möglichst ohne VBA bewerkstelligen?
ANTWORT: Verwenden Sie für die Ausgabe des "Erledigt"-Status statt des normalen Kontrollkästchens ein Textfeld, dessen Bezeichnungsfeld Sie löschen und dessen Eigenschaft "Steuerelementeinhalt" Sie auf den Namen des "Erledigt"-Feldes setzen. Stellen Sie die Schriftart auf "WingDings", die Schriftgröße auf 14 oder 16 Punkt und die Farbe auf Grün ein. Geben Sie in der Eigenschaft "Format" des Textfeldes folgende Maske ein:
;\ü
"ü" entspricht dem Häkchen des WingDings-Zeichensatzes. Das Erledigt-Feld liefert "0" für "Nicht erledigt" und "-1" für "Erledigt". Über die Formatmaske legen Sie durch Semikolon getrennt fest, wie positive und negative Werte ausgegeben werden sollen. Das Semikolon alleine bedeutet hier, dass positive Werte, also die "0" für "Nicht erledigt" unterdrückt werden sollen und "\ü" bedeutet, dass bei negativen Werten wie "-1" für "Erledigt" das angegebene Zeichen, also das Häkchen, ausgegeben wird.
Etiketten optimal bedrucken
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Wenn Sie einen Laser- oder Tintenstrahl-Drucker zum Bedrucken von Etiketten per Bericht verwenden, kennen Sie das Problem: Der Bogen enthält 12 Etiketten in 3*4 Spalten/Zeilen, Sie drucken sieben Etiketten, so dass zwei komplette Zeilen und ein Etikett der dritten Zeile bedruckt sind. Es verbleiben somit fünf unbedruckte Etiketten, zwei in der dritten Zeile und eine komplette vierte Zeile. Rufen Sie den Bericht nun das nächste Mal auf, möchte Access mit dem Ausdruck wieder oben links beginnen. Sofern Sie gerade zufällig fünf Etiketten benötigen, können Sie den Bogen umgekehrt in den Drucker einlegen, andernfalls müssen Sie bei mehr als fünf zu druckenden Etiketten einen neuen Bogen nehmen oder bei weniger als fünf Etiketten in Kauf nehmen, dass einige Etiketten nicht mehr bedruckt werden können. Über kurz oder lang stapeln sich so neben dem Drucker unvollständig bedruckte Bögen, die Sie bei jedem Etikettendruck auf Verwendbarkeit prüfen müssen.
Ein ähnliches Problem ergibt sich, wenn Sie mehrere Kopien von Etiketten drucken möchten: Access druckt nicht die Etiketten pro Datensatz hintereinander auf dem Bogen aus, sondern gibt den Bericht zwei-, drei-, vier-, fünf-, sechs Mal hintereinander aus. Wenn Sie also beispielsweise Preisetiketten bedrucken und sechs Kartons bekleben wollen, müssen Sie das zweite, dritte, vierte, fünfte, sechste Etikett mühsam aus dem Stapel bedruckter Bögen heraussuchen.
Beide Probleme können Sie mit Hilfe einiger wenig bekannter Anweisungen für die Steuerung des Bericht-Layouts lösen:
* Öffnen Sie den Bericht, mit dem Sie die Etiketten bedrucken, im Entwurfsmodus.
* Wechseln Sie mit Alt+F11 in die VBA-Entwicklungsumgebung bzw. wählen Sie Ansicht-Code an.
* Kopieren Sie die folgenden Deklarationen und Funktionen in das Berichtsmodul:
'Dieser Bericht
Dim R As Report
'Basisdaten
Dim LabelsToSkip As Long
Dim NumCopies As Long
'Zähler
Dim cntBlanks As Long
Dim cntCopies As Long
Function GetInfos() As Boolean
Dim X$
On Error Resume Next
GetInfos = False
X$ = InputBox$("Anzahl zu überspringender " & _
"Etiketten:", , "0")
If X$ = "" Then Exit Function
LabelsToSkip = Val(X$)
If LabelsToSkip < 0 Then LabelsToSkip = 0
X$ = InputBox$("Anzahl zu druckender " & _
"Kopien:", , "1")
If X$ = "" Then Exit Function
NumCopies = Val(X$)
If NumCopies < 1 Then NumCopies = 1
GetInfos = True
End Function
Function ResetVars()
cntBlanks = 0
cntCopies = 0
End Function
Function SetLayout()
On Error Resume Next
If cntBlanks < LabelsToSkip Then
R.NextRecord = False
R.PrintSection = False
cntBlanks = cntBlanks + 1
Else
If cntCopies < (NumCopies - 1) Then
R.NextRecord = False
cntCopies = cntCopies + 1
Else
cntCopies = 0
End If
End If
End Function
* Speichern Sie die Änderungen und verlassen Sie die VBA-Entwicklungsumgebung wieder.
* Stellen Sie die Eigenschaft "Beim Öffnen" des Berichtes auf "[Ereignisprozedur]" ein, klicken Sie auf die Schaltfläche mit den drei Punkten und kopieren Sie die folgenden Anweisungen in die Ereignisprozedur:
Cancel = Not GetInfos()
Set R = Reports(Me.Name)
* Kopieren Sie die folgenden Anweisungen in die Ereignisprozedur "Beim Schließen" des Berichtes:
Set R = Nothing
* Geben Sie den folgenden Ausdruck in der Eigenschaft "Beim Drucken" des Detailbereiches ein:
=SetLayout()
* Wählen Sie das Menü Ansicht-Berichtskopf/-fuß an, um diese Bereiche einzublenden und setzen Sie deren Höhe über das Eigenschaftenfenster (F4 oder Doppelklick auf die Balken Berichtskopf/Berichtsfuß) auf "0 cm". In Access 2007 blenden Sie diese Bereiche über das Register "Berichtentwurfstools/Anordnen" in der Gruppe "Ein/Ausblenden" über das Symbol Berichtskopf/-fuß oben rechts ein.
* Geben Sie den folgenden Ausdruck in der Eigenschaft "Beim Drucken" des Berichtskopfes ein:
=ResetVars()
* Speichern Sie die Änderungen und lassen Sie den Bericht einmal testweise anzeigen.
Es werden nun zwei Dialoge angezeigt, in denen Sie die Anzahl zu überspringender und die Anzahl zu druckender Kopien eingeben. Anschließend beginnt der Ausdruck beispielsweise bei fünf zu überspringenden Etiketten mit dem zweiten Etikett der dritten Zeile. Ist mehr als eine Kopie zu drucken, werden die einzelnen Etiketten hintereinander und nicht mehr einzeln auf jeweils neue Seiten gedruckt.
Basis der Lösung sind die Eigenschaften "NextRecord" und "PrintSection" des Berichtes, die innerhalb einer Ereignisprozedur wie "Beim Drucken" gesetzt werden können. Der Standardwert ist für jeden Datensatz "True". Wird nun für jede Eigenschaft "False" gesetzt, unterdrückt man damit den Wechsel zum nächsten Datensatz sowie den Ausdruck des Bereiches und kann somit leere Etiketten einfach überspringen. Ähnlich beim Drucken von Kopien: Wird hier "NextRecord = False" gesetzt und die Vorgabe "PrintSection = True" belassen, so druckt Access den aktuellen Datensatz und damit ein Etikett mehrmals hintereinander aus.
Hoch- UND Querformat im Bericht ausgeben?
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich nutze einen Bericht mit 8 Unterberichten. Ein Unterbericht davon ist auf das Format "DIN A4 Querformat" eingestellt, alle anderen auf "DIN A4 Hochformat". Beim Ausdruck werden alle Berichte im Hochformat ausgedruckt. Der Bericht im Querformat wird einfach abgeschnitten. Ich habe schon die verschiedensten Felder unter Eigenschaften geändert, leider ohne Erfolg. Können Sie mir weiterhelfen?
ANTWORT: Da sind auch wir machtlos: Access unterstützt keine dynamische Anpassung des Seiten-Formats, es verwendet immer das Format, das für den Hauptbericht bzw. im Drucken-Dialog eingestellt ist. Es wird leider nicht anderes übrigbleiben, als alle Berichte auf ein einheitliches Format zu ändern bzw. den einen querformatigen Bericht auf Hochformat umzustellen.
Nur aktuellen Datensatz drucken
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich möchte eine Datenbank, die ich mit Lotus erstellt habe und die 34.000 Datensätze enthält, in Access weiterbearbeiten. Zu den Datensätzen habe ich ca. 1600 Fotos. Die Daten bekomme ich problemlos in Access importiert. Die Bilder muss ich durch Einfügen in die Datenbank zuordnen. Ich habe auch schon einige Bilder in die Datenbank übernommen und habe nun versucht, diese Bilder versehen mit Zusatzinformationen zu drucken. Ich muss mir immer erst den Datensatz im Formular anzeigen lassen, dessen Nummer merken, den Bericht öffnen, die Datensatznummer am unteren Rand eingeben und erst dann kann ich die Seite ausgeben. Geht es nicht auch einfacher?
ANTWORT: Sie können den Bericht per Schaltfläche öffnen und dabei per Parameter spezifizieren, welcher einzelne Datensatz gedruckt werden soll:
* Legen Sie im Formularfuß eine Schaltfläche mit der Beschriftung Datensatz Drucken an und benennen Sie sie "btnPrint".
* Stellen Sie die Eigenschaft "Beim Klicken" auf "[Ereignisprozedur] ein und klicken Sie auf die Schaltfläche "...", um den VBA-Editor zu öffnen.
* Geben Sie die folgende Anweisung ein:
DoCmd.OpenReport "Berichtsname", _
acViewPreview,,_
"[ID]= " & Me.ID
Statt "Berichtsname" geben Sie den Namen Ihres Berichtes an und statt "ID" den Namen des Feldes, das als Primärschlüssel dient. Wenn es sich dabei um ein Feld vom Datentyp "Text" handelt, muss die ID in Hochkommas angegeben werden:
DoCmd.OpenReport "Berichtsname", _
acViewPreview,,_
"[ID]= '" & Me.ID & "'"
* Speichern Sie die Änderungen und lassen Sie das Formular anzeigen.
Wenn Sie nun in einem Datensatz auf die Schaltfläche Datensatz drucken klicken, wird wie gewünscht nur dieser eine Datensatz über den Bericht ausgegeben.
PDF-Dateien anzeigen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich möchte aus Access direkt PDFs aufrufen. Wie kann ich das Dokument öffnen? Mit "Shell" klappt es nicht:
Private Sub Befehl54_Click()
Dim stAppName As String
On Error GoTo Err_Befehl54_Click
stAppName = "C:\Programme\Adobe\Acrobat " & _
"8.0\Acrobat\Acrobat.exe " & _
"H:\Daten\Access\Datei.pdf"
Call Shell(stAppName, 1)
Exit_Befehl54_Click:
Exit Sub
Err_Befehl54_Click:
MsgBox Err.Description
Resume Exit_Befehl54_Click
End Sub
Bei mir wird eine Fehlermeldung angezeigt. Können Sie mir einen Tipp geben?
ANTWORT: Verwenden Sie statt "Shell()" die API-Funktion "ShellExecute()", die Sie in einem Modul wie folgt deklarieren:
Public Declare Function ShellExecute _
Lib "shell32.dll" _
Alias "ShellExecuteA" ( _
ByVal hWnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Kopieren Sie dann die folgende Prozedur in das Modul:
Sub OpenPDF(strPDF As String)
On Error Resume Next
Call ShellExecute(0&, _
vbNullString, _
strPDF, _
vbNullString, _
vbNullString, _
3)
DoEvents
End Sub
Der Aufruf für die Anzeige einer PDF-Datei sieht dann beispielsweise wie folgt aus:
OpenPDF "Z:\Test\Alphabetische Artikelliste.pdf"
Sie übergeben also nur Pfad/Dateiname der PDF-Datei. Die dazugehörige Anwendung, in Ihrem Fall den Adobe Acrobat Reader, ermittelt "ShellExecute()" über das Betriebssystem automatisch. Diese Technik hat den Vorteil, dass sie auch auf einem System funktioniert, auf dem zum Beispiel FoxIt oder ein anderes Tool als PDF-Reader installiert ist.
PDF-Dokument aus Datenbank heraus anzeigen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich habe mehrere Datenbanken programmiert, um unsere Projekte und Aufträge zu verwalten. Bisher hatte ich die Ausgangsrechnung als Word-Dokument über einen Hyperlink eingebunden, um bei abgeschlossenen Aufträgen die Ausgangsrechnung direkt von der Datenbank aus aufrufen und einsehen zu können. Unsere neue Buchhaltungs-Software auf Windows-Basis gibt nur noch ein PDF-Dokument als Kopie der Ausgangsrechnung aus, das ich zwar über einen Hyperlink eingebunden habe, aber das sich nicht automatisch öffnen lässt. Gibt es dafür eine Lösung?
ANTWORT: Der sicherste Weg, jedes Format zu öffnen, ist der Einsatz der API-Funktion "ShellExecute()":
* Kopieren Sie die folgende Deklaration und die Prozedur "ShowDocument" in ein beliebiges Modul:
Public Declare Function ShellExecute _
Lib "shell32.dll" _
Alias "ShellExecuteA" ( _
ByVal hWnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Sub ShowDocument(strDoc As String)
On Error Resume Next
Call ShellExecute(0&, _
vbNullString, _
strDoc, _
vbNullString, _
vbNullString, _
vbNormalFocus)
DoEvents
End Sub
* Verwenden Sie statt des Hyperlinks für die Anzeige eine Schaltfläche mit folgendem Aufruf:
strFName = Me.txtPfadNamePDF
ShowDocument strFName
"txtPfadNamePDF" ersetzen Sie dabei durch den Namen des Feldes, in dem Pfad-/Dateiname des PDF-Dokumentes gespeichert ist.
PDF-Dokumente direkt ausdrucken
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In einer Datenbank verwalte ich Pfade/Dateinamen von PDF-Dokumenten. Ich möchte dem Anwender erlauben, über eine Schaltfläche Drucken direkt ein PDF-Dokument auszudrucken.
ANTWORT: Dazu nutzen Sie die API-Funktion "ShellExecuteEx()". Kopieren Sie die folgenden Deklarationen und die Prozedur "PrintPDF" in ein neues oder vorhandenes Modul:
Private Type SHELLEXECUTEINFO
cbSize As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As Long
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hProcess As Long
End Type
Private Declare Function ShellExecuteEx _
Lib "shell32.dll" _
Alias "ShellExecuteExA" _
(lpExecInfo As SHELLEXECUTEINFO) As Boolean
Sub PrintPDF(strFName As String)
Dim se As SHELLEXECUTEINFO
On Error Resume Next
With se
.cbSize = Len(se)
.lpFile = strFName
.lpParameters = vbNullString
.lpDirectory = vbNullString
.nShow = vbMinimizedNoFocus
.lpVerb = "print"
End With
ShellExecuteEx se
End Sub
Die API-Funktion "ShellExecuteEx()" ist eigentlich dazu gedacht, Anwendungen wie Access, Word oder Excel zur Bearbeitung eines Dokumentes aufzurufen, sie kann aber auch dazu genutzt werden, bestimmte Operationen mit Dateien durchzuführen. Dazu wird "ShellExecuteEx()" mit einer Datenstruktur als Parameter aufgerufen, in der Ausführungsparameter und gewünschte Operation festgelegt werden. "lpFile" spezifiziert beispielsweise die Datei, "lpVerb" die auszuführende Operation, in diesem Fall also "print".
In Ihrer Schaltfläche reicht dann folgende Anweisung:
PrintPDF Me.PDFDatei
"PDFDatei" ersetzen Sie dabei durch das Feld, das in Ihrem Formular Pfad/Dateinamen der PDF-Dokumente speichert.
PDF-Dokumente per Hyperlink anzeigen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Wir haben in einem Formular einen Hyperlink-Textfeld in dem man auf Anhänge in verschiedenen Formaten (*.doc, *.xls, *.pdf, *.bmp usw.) verweisen kann. Nach dem Anklicken des Feldes und einer Sicherheitsabfrage öffnet sich das Dokument im der zugeordneten Anwendung. Seit einiger Zeit lassen sich PDF-Dokumente nicht mehr öffnen. Nach der Sicherheitsabfrage öffnet sich ganz kurz ein Adobe-Fenster, schließt sich aber sofort wieder - ohne Anzeige?
Vermutlich setzen Sie den Adobe Acrobat Reader 7.00 ein. Hier gibt es einen bekannten Bug beim Öffnen von Dokumenten, wenn der Aufruf programmatisch erfolgt. Ein Update auf mindestens Version 7.01 beseitigt das Problem.
Pfad und Dateiname in Formular/Bericht ausgeben
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich möchte in einem Bericht in der Fußzeile ausgeben, aus welcher Datenbank der Bericht stammt. Ist das möglich und wenn ja, wie? Gäbe es auch die Möglichkeit, diese Information in einem Formular anzuzeigen?
ANTWORT: Verwenden Sie dazu in einem Bericht oder in einem Formular ein ungebundenes Textfeld und geben Sie folgenden Ausdruck in der Eigenschaft "Steuerelementeinhalt" ein:
=[CurrentDb].[Name]
Dadurch wird der komplette Pfad und der Dateiname im Format "X:\Pfad\Dateiname.mdb|.accdb" bzw. "\\Server\Freigabe\Pfad\Dateiname.mdb|.accdb" im Textfeld ausgegeben. Wenn Ihnen der Dateiname reicht, kopieren Sie folgende Funktion in ein Modul:
Function FilenameOnly(strFName As String) As String
Dim L As Integer, strNew As String
FilenameOnly = ""
strNew = strFName
If InStr(strNew, "\") <> 0 Then
L = Len(strNew)
While Mid$(strNew, L, 1) <> "\" And L > 0
L = L - 1
Wend
If L = 1 Then Exit Function
strNew = Mid$(strNew, L + 1)
End If
FilenameOnly = strNew
End Function
Ändern Sie dann die Formel wie folgt:
=FilenameOnly([CurrentDb].[Name])
Problem bei Ausgabe von Berichten als Snapshot
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Ich erstelle mit Hilfe einer SQL-Abfrage (QueryDef/Button in einem Formular) einen Bericht. Diesen möchte ich nach dem Ausdrucken als Snapshot in einem anderen Verzeichnis speichern. Ich verwende dazu folgenden Code:
DoCmd.OutputTo acReport, "Name des Berichts", _
"SnapshotFormat(*.snp)", "Pfad", True, ""
Obwohl der Bericht nur eine Größe von 10 KB hat, bekomme ich eine Fehlermeldung bezüglich zu wenig Speicher. Können Sie hier mit einem Tipp weiterhelfen? Vielen Dank"
Die Angabe des zu verwendenden Formats ist fehlerhaft, es fehlen wichtige Leerzeichen, damit das Format korrekt erkannt wird. Wenn Sie die Anweisung zum Beispiel wie folgt aufbauen, klappt die Ausgabe problemlos:
DoCmd.OutputTo acOutputReport, _
"Name des Berichts", _
"Snapshot Format (*.snp)", _
"Pfad", True
Sortierung in Tabellen und Berichten ändern
Versionen: Access 2007, 2003, 2002/XP und 2000
FRAGE: Ich habe festgestellt, dass bei mir in einer Tabelle anders sortiert wird als in einem Bericht. In einer Tabelle wird zum Beispiel " 'SmartTools' " (mit je einem Hochkomma vorn und hinten) korrekt unter "S" sortiert, während das Wort im Bericht ganz vorne noch vor "A" einsortiert wird. Frage: Warum ist das so und kann man das jeweils in Tabelle und/oder Bericht ändern?
ANTWORT: In Tabellen ergibt sich die Sortierung nach dem Primärschlüssel sowie eventuell eingerichteten Indizes und erfolgt über eine Routine, die Sonderzeichen wie das Hochkomma ausblendet. In Berichten erfolgt die Sortierung entweder gemäß den Einstellungen unter "Gruppieren und Sortieren" oder sie ergibt sich aus der dem Bericht zugrunde liegenden Abfrage bzw. Tabelle. Die Sortierreihenfolge können Sie für neue Datenbanken über Extras-Optionen, Registerkarte "Allgemein", Option Sortierreihefolge bei neuer DB einstellen. Für den deutschsprachigen Bereich empfiehlt sich hier die Einstellung "Deutsches Telefonbuch". Eine nachträgliche Änderung für die aktuelle Datenbank erreichen Sie, indem Sie nach den Änderungen das Menü Extras-Datenbank-Dienstprogramme-Datenbank Komprimieren Und Reparieren anwählen. In Access 2007 finden Sie diese Funktion unter der Office-Schaltfläche, Eintrag Verwalten.
Text aus Kombinationsfeld im Bericht verwenden
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich möchte den Text eines Kombinationsfeldes in einem Text- oder Bezeichnungsfeld im Berichtskopf anzeigen. Leider wird der Wert dort nicht übernommen. Interessanterweise kann der auf die gleiche Weise ermittelte Wert aber in einer MsgBox (zu Testzwecken vom Formular aus) aufgerufen werden. Der Ausdruck, den ich verwende, lautet:
Dim varVariable As Variant
varVariable =
Forms("frmFormularname").cboKombinationsfeld.Column(1,
Forms("frmFormularname").cboKombinationsfeld.ListIndex)
MsgBox varVariable
Wenn ich "cboKombinationsfeld.Value" verwende, funktioniert die Übernahme in den Bericht, aber eben nur in Form des von mir ausgeblendeten Primärschlüssels der Tabelle die als Datenherkunft für das Kombinationsfeld dient.
Woran liegt das? Welche Möglichkeiten habe ich sonst noch, den im Kombinationsfeld angezeigten Wert im Bericht erscheinen zu lassen?
ANTWORT: Leider teilen Sie nicht mit, wie genau Sie momentan den Wert in den Berichtskopf zu übernehmen versuchen bzw. welche Fehlermeldung angezeigt wird. Das Problem sollte aber gelöst sein, wenn Sie "cboKombinationsfeld.Text" adressieren - dadurch wird direkt der im Textfeld des Kombinationsfeldes angezeigte Text ausgelesen und kann dann in einem Text- oder Bezeichnungsfeld verwendet werden.
Berichte im JPG-Format ausgeben
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich suche nach einer Möglichkeit, Snapshot-Dateien (Access) in JPG-Dateien umzuwandeln. Access verfügt ja standardmäßig über keine entsprechende Funktion.
ANTWORT: Eine Möglichkeit, Snapshots direkt in JPG zu konvertieren, ist uns nicht bekannt. Es gibt allerdings als Open Source-Projekt den kostenlosen PDFCreator:
http://sourceforge.net/projects/pdfcreator
Nach Installation dieses Druckertreibers können Sie den PDFCreator als Drucker in Access einstellen und einen Bericht darüber "ausdrucken". Im Verlauf des Druckvorgangs wird ein "Speichern unter"-Dialog angezeigt, in dem Sie als Format außer PDF auch ein Bild-Format einstellen können. Darunter befindet sich neben TIF, PNG, PCX, BMP und GIF auch JPG.
BMP-Bilder direkt mit Paint öffnen
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: In meiner Datenbank speichere ich den Pfad von Bildern in einem Textfeld. Die Bilder lasse ich im Formular in einem Bild-Steuerelement anzeigen. Wie kann ich erreichen, dass beim Doppelklick auf das Bild Paint gestartet und das Bild dort sofort geöffnet wird? Ein Versuch mit "Shell strDateiname" führt leider nur zu einer Fehlermeldung?
ANTWORT: Der Dateiname alleine reicht leider nicht. Shell() erwartet immer den Programmnamen UND die zu öffnende Datei als Parameter in EINER Zeichenkette:
Shell "mspaint.exe " & Chr$(34) & strDateiname & Chr$(34)
Der Programmname kann bei Programmen, die sich im PATH befinden, direkt angegeben werden, ansonsten ist der komplette Pfad wie z.B. "C:\Windows\System32\mspaint.exe" anzugeben. Zwischen Programmname und Dateiname muss ein Leerzeichen vorhanden sein! Die Klammerung des Dateinamens in Chr$(34)= Anführungszeichen ("Dateiname") erfolgt, um Problemen mit langen Dateinamen bzw. Leer- und Sonderzeichen im Dateinamen vorzubeugen.
Grafiken direkt in Paint öffnen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
In einer Datenbank speichern Sie den Pfad von Bildern in einem Textfeld. Die Bilder werden im Formular in einem Bild-Steuerelement angezeigt. Beim Doppelklick auf das Bild soll nun Paint gestartet und das Bild dort sofort geöffnet werden. "Shell strDateiname" führt dabei zu einer Fehlermeldung, weil der Dateiname alleine nicht ausreicht. Shell() erwartet immer den Programmnamen und die zu öffnenden Datei als Parameter in einer Zeichenkette:
Shell "mspaint.exe " & Chr$(34) & strDateiname & Chr$(34)
Der Programmname kann bei Programmen, die sich im PATH befinden, direkt angegeben werden, ansonsten ist der komplette Pfad wie zum Beispiel C:\WINDOWS\SYSTEM32\MSPAINT.EXE anzugeben. Zwischen Programmname und Dateiname muss ein Leerzeichen vorhanden sein! Die Klammerung des Dateinamens in Chr$(34)= Anführungszeichen ("Dateiname") erfolgt, um Problemen mit langen Dateinamen bzw. Leer- und Sonderzeichen im Dateinamen vorzubeugen.
Grafiken platzsparend speichern
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Wir nutzen eine große Datenbank, bei der wir zu bestimmten Tabellen Fotos oder Bilder einfügen müssen. Ich habe nun schon die Tabellen mit den Bildern geteilt, in eine externe Datenbank verlegt und diese dann verknüpft. Mit jedem Bild, das eingefügt wird, vergrößert sich die Datenbank unverhältnismäßig. Die Tabelle besteht nur aus einer Zuordnungsnummer und zwei OLE-Objekten. Mit ca. 130 Bildern hat die Datenbank nach dem komprimieren bereits eine Größe von ca. 940.000 Kilobyte. Wie kann ich diese Datenbank in Ihrer Speichergröße verkleinern, damit der Datentransfer wieder schneller wird?
ANTWORT: An diesem Verhalten lässt sich leider ohne eine Änderung des Datenbankdesigns nichts ändern. Für jedes OLE-Objekt speichert Access eine unkomprimierte Bitmap-Grafik für die Darstellung im Formular. Je nach Größe des Ursprungsbildes kann diese Bitmap durchaus einige Megabyte groß sein. Lösen lässt sich das Problem nur, indem Sie in der Datenbank lediglich Pfad und Dateiname des Bildes speichern und bei jedem Datensatzwechsel das aktuelle Bild über die Ereignisprozedur "Beim Anzeigen" in ein Bild-Steuerelement des Formulars laden. Das folgende Beispiel geht davon aus, dass ein Feld "Bild" Pfad und Dateiname des Bildes speichert und im Formular ein Bild-Steuerelement "bldBild" vorhanden ist:
Private Sub Form_Current()
Dim strPICFName
On Error Resume Next
DoCmd.Hourglass True
If Not IsNull(Me.[Bild]) Then
strPICFName = Me.[Bild]
If Dir$(strPICFName) <> "" Then
Me.[bldBild].Picture = strPICFName
Else
Me.[bldBild].Picture = ""
DoEvents
Beep
MsgBox "Bilddatei nicht gefunden!"
End If
Else
Me.[bldBild].Picture = ""
End If
DoCmd.Hourglass False
End Sub
Die Routine prüft zunächst, ob ein Bild zugeordnet und wenn ja, ob dieses physisch vorhanden ist. Trifft das zu, wird es im Bild-Steuerelement angezeigt. Andernfalls wird der Inhalt des Bild-Steuerelementes gelöscht und bei zwar vorhandenem Pfad/Dateinamen aber fehlender Bilddatei ein entsprechender Hinweis angezeigt.
Hintergrund-Bild im Access-Fenster nutzen?
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: Wenn in Access kein Fenster geöffnet ist, wird der dunkelgraue Anwendungshintergrund sichtbar. Kann man in diesen "Hintergrundbereich" ein Bild importieren oder laden?
ANTWORT: Nein, das ist leider nicht möglich. Sie können lediglich in der Systemsteuerung im Kontrollfeld "Anzeige" auf der Registerkarte "Darstellung" über die Schaltfläche Erweitert mit der Einstellung "Hintergrund der Anwendung" eine andere Farbe zuordnen.
JPG/GIF in OLE-Steuerelement anzeigen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
In meiner Mitgliederdatenbank möchte ich im Mitgliederformular Passbilder einfügen. Im ungebundenen Objektfeld werden aber nur die Bildinhalte von BMP-Bildern angezeigt. In der Hilfe zu Access steht zwar, dass man auch JPG- oder GIF-Bilder einfügen kann, aber dann wird zum Beispiel nur ein JPG-Symbol und der Name der Datei angezeigt. Beim Doppelklick auf das Bild wird das Bild in dem Programm, dem das Bildformat in Windows zugewiesen wurde, geöffnet und angezeigt. Lassen sich auch diese Bildformate im ungebundenen Objektfeld als Bild und nicht nur mit Symbol und Dateiname einfügen und anzeigen?
Verwenden zur Speicherung des Pfades/Dateinamens der Bilder ein normales Textfeld (zum Beispiel "Bild") und im Formular ein Bild-Steuerelement "picBild". Dann können Sie in der Ereignisprozedur "Beim Anzeigen" des Formulars folgende Anweisungen verwenden und auch JPG- oder GIF-Bilder anzeigen:
If Not IsNull(Me.[Bild]) Then
strBild = Me.[Bild]
If Dir$(strBild) <> "" Then
Me.[picBild].Picture = strBild
Else
Me.[picBild].Picture = ""
DoEvents
Beep
MsgBox "Bilddatei nicht gefunden!"
End If
Else
Me.[picBild].Picture = ""
End If
OLE-Objekte als Bild, nicht als Symbol anzeigen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich habe in ein Access-Formular datensatzabhängige Bilder eingefügt. Beim Wechsel auf einen anderen Computer sehe ich die bereits eingegebenen Bilder; bei Verknüpfung mit einem neuen Bild erscheint im Formular jedoch nur das Icon und seine Bezeichnung. Zurück auf dem ersten Computer wird auch dieses Icon nicht mehr angezeigt.
ANTWORT: Wenn anstelle des Bildes nur ein Symbol mit Beschriftung angezeigt wird, war bei der Auswahl des Bildes im Dialog "Objekt einfügen" die Option Als Symbol darstellen aktiviert. Um diese Option wieder auszuschalten, klicken Sie mit der rechten Maustaste auf das OLE-Feld und wählen Anwendungsname-Objekt-Konvertieren im Kontextmenü an. "Anwendungsname" steht dabei für die Anwendung, die für die Bearbeitung des Objektes zuständig ist, also zum Beispiel für "Photo Shop" oder "Microsoft Photo Editor". Im dann folgenden Dialog deaktivieren Sie die Option Als Symbol darstellen und klicken auf Ok. Statt des Symbols wird nun wie erwartet das Bild angezeigt. Sollte des wider Erwarten nicht der Fall sein, muss das Objekt komplett neu eingebunden werden, wobei darauf zu achten wäre, dass die Option Als Symbol darstellen nicht aktiviert ist.
Dass das Symbol auf einem Rechner angezeigt wird und auf einem anderen Rechner nicht, liegt daran, dass für den Objekttyp verschiedene Anwendungen zuständig sind: Auf Rechner 1 ist zum Beispiel Photo Shop zuständig, das auf dem 2. Rechner jedoch nicht installiert ist - Access kann dadurch die Verknüpfung zur Anwendung nicht auflösen und somit auch kein Symbol anzeigen.
Alter richtig berechnen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Wenn Sie das Alter einer Person, die beispielsweise am 19.07.43 Geburtstag hat, mit der Formel "(Jahr(Jetzt())-Jahr([Geburtstag]))" berechnen, ist diese Person beispielsweise schon ab Januar 2007 64 Jahre alt. Nutzen Sie daher zur Berechnung des Alters lieber die folgende Formel:
DatDiff("jjjj"; [Geburtstag]; Datum()) + (Format(Datum(); "mmtt") < Format([Geburtstag]; "mmtt"))
"Geburtstag" ist dabei durch den Namen des Feldes zu ersetzen, in dem das Geburtsdatum gespeichert wird. Diese Formel berechnet zunächst per "DatDiff("jjjj"; [Geburtstag]; Datum())" die Differenz zwischen dem aktuellen Jahr und dem Geburtsjahr. Sind Monat und Tag des Geburtstages kleiner als Monat und Tag, muss ein Jahr abgezogen werden. Dazu addiert die Formel das Ergebnis des Ausdruckes "Format(Datum(); "mmtt") < Format([Geburtstag]; "mmtt")" zum vorherigen Ergebnis. Dieser Ausdruck prüft, ob Monat und Tag des Geburtstages kleiner als Monat und Tag des aktuellen Datums sind. Ist das der Fall, ist das Ergebnis "-1", andernfalls "0". Durch die Addition von beispielsweise "62 plus -1" ergibt sich dann das korrekte Alter von 61 Jahren.
Alter in Jahren in Tabelle übernehmen
Versionen: Access 2003, 2002/XP, 2000 und 97
Ich habe eine Frage bezüglich der Einbindung eines Feldes "Alter in Jahren" in eine existierende Access 2000 bzw. 2003-Adress-Datenbank und wäre Ihnen sehr dankbar, wenn Sie mir einen Rat geben könnten: Excel stellt die praktische Prozedur "=DATEDIF(E6;TODAY();"y") & " Jahre" zur Berechnung des Alters auf Basis des Geburtsdatums und des laufenden Systemdatums zur Verfügung. Wie kann ich diese Funktion auch für MS Access nutzen?
Erweitern Sie zunächst die Tabelle um ein Feld "AlterInJahren" oder ähnlich und stellen Sie dessen Datentyp auf "Zahl" und dessen Eigenschaft "Feldgröße" auf "Byte" ein. Erstellen Sie dann eine Aktualisierungsabfrage, in die Sie das Feld "AlterInJahren" aufnehmen. Im Feld "Aktualisieren" des Abfrageentwurfes geben Sie die folgende Formel ein:
=DatDiff("jjjj";[Geburtstag];Datum())+(Format(Datum();
"mmtt")<Format([Geburtstag];"mmtt"))
"Geburtstag" ersetzen Sie dabei durch den Namen des Feldes, in dem das Geburtstagsdatum gespeichert ist. Diese Formel berechnet zunächst per 'DatDiff("jjjj"; [Geburtstag]; Datum())' die Differenz zwischen dem aktuellen Jahr und dem Geburtsjahr. Ist Monat und Tag des Geburtstages kleiner als Monat und Tag, muss ein Jahr abgezogen werden. Dazu addiert die Formel das Ergebnis des Ausdruckes "Format(Datum(); "mmtt") < Format([Geburtstag]; "mmtt")" zum vorherigen Ergebnis. Dieser Ausdruck prüft, ob Monat und Tag des Geburtstages kleiner als Monat und Tag des aktuellen Datums sind. Wenn ja, ist das Ergebnis "-1", andernfalls "0". Durch die Addition von beispielsweise "54 plus -1" ergibt sich dann das korrekte Alter von 53 Jahren.
Datumsangaben konvertieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Eines meiner Programme speichert Datumsangaben in einer Access-Datenbank in Textfeldern im Format "jjjjmmdd" ab.
1. Kennen Sie ein Tool oder gibt es in Access eine Möglichkeit, diese Eingaben in das "normale" Format "tt.mm.jjjj" umzuwandeln?
2. Falls nicht, wie kann ich trotzdem einen Bericht zum Beispiel nach Monat oder Jahr gruppieren?
ANTWORT: Für die Formatkonvertierung nutzen Sie eine Aktualisierungsabfrage:
* Erweitern Sie die Tabelle um ein Feld "DatumTTMMJJJJ" oder ähnlich vom Datentyp "Datum/Zeit".
* Erstellen Sie eine Aktualisierungsabfrage und geben Sie für das neue Feld "DatumTTMMJJJJ" in der Zeile "Aktualisieren" folgenden Ausdruck ein:
DatSeriell(Links$([DatumJJJJMMTT];4);
TeilStr$([DatumJJJJMMTT];5;2);
Rechts$([DatumJJJJMMTT];2))
Den Feldnamen "DatumJJJJMMTT" ersetzen Sie durch den Namen des Feldes, das von Ihrem Programm gefüllt wird. Der gesamte Ausdruck muss in einer Zeile eingegeben werden!
* Lassen Sie die Aktualisierungsabfrage ausführen
"DatSeriell" setzt eine Angabe "Jahr, Monat, Tag" in ein normales Datumsfeld mit Format "TT.JMM.JJJJ" um. Die einzelnen Angaben für Jahr, Monat, Tag werden dazu mit Zeichenkettenfunktionen ausgelesen: "Links$(x, 4)" ermittelt das Jahr, "TeilStr$(x, 5, 2)" den zweistelligen Monat ab Position 5 und "Rechts$(x, 2)" die letzten beiden Zahlen als Tag.
Um in einem Bericht mit dem unkonvertierten Feld zum Beispiel nach Jahr zu gruppieren, geben Sie im Dialog "Sortieren und Gruppieren" unter "Feld/Ausdruck" folgenden Ausdruck ein:
=Links$([DatumJJJJMMTT];4)
Den Feldnamen "DatumJJJJMMTT" ersetzen Sie durch den Namen des Feldes, das von Ihrem Programm gefüllt wird.
Um nach Monat zu gruppieren, verwenden Sie analog dazu folgenden Ausdruck:
=TeilStr$([DatumJJJJMMTT];5;2)
Im Gruppenkopf legen Sie in beiden Fällen ungebundene Textfelder mit der Beschriftung "Jahr:" bzw. "Monat:" an und geben den gleichen Ausdruck wie zum Gruppieren auch in der Eigenschaft "Steuerelementeinhalt" ein.
Geburtstagslisten optimal aufbauen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
In Ihren Adressverwaltungen gibt es in der Regel ein Feld "Geburtstag", in dem Sie den Geburtstag beispielsweise eines Kunden, des persönlichen Ansprechpartners eines Lieferanten oder den Ihrer Vereinsmitglieder festhalten. Auf dieser Basis soll nun eine Geburtstagsliste erstellt werden, die beispielsweise sortiert nach Monat oder Woche eine Übersicht verschafft, wer Geburtstag hat. Im Idealfall gibt die Liste noch an, wie alt das jeweilige Geburtstagskind wird. Der grundsätzliche Aufbau eines entsprechenden Berichtes ist einfach: Sie erstellen eine Auswahlabfrage mit Feldern wie "Name", "Geburtstag" und "Telefon" oder "E-Mail-Adresse" und legen diese Abfrage einem Bericht zugrunde, in dessen Detailbereich die ausgewählten Felder eingefügt werden. Wenn Sie diesen Bericht allerdings nach "Geburtstag" sortieren lassen, ist das Ergebnis wenig befriedigend: Da das jeweilige Geburtsjahr in die Sortierung einbezogen wird, erhalten Sie eine nach Alter sortierte Liste. Um hier zunächst eine Gruppierung nach Monat und darin eine Sortierung nach Tag vorzunehmen, gehen Sie wie folgt vor:
* Öffnen Sie die Abfrage im Entwurfsmodus.
* Tippen Sie in einer leeren Spalte des Abfrageentwurfes die folgende Formel ein:
M: Monat([Geburtstag])
"Geburtstag" ersetzen Sie dabei durch den Namen des Feldes, in dem Sie die Geburtstage festhalten. Auf diese Weise wird der Abfrage ein neue Feld "M" hinzugefügt, das den jeweiligen Monat des Geburtstags enthält, also einen Wert von "1" bis "12" haben kann.
* Tippen Sie in einer leeren Spalte des Abfrageentwurfes die folgende Formel ein:
T: Tag([Geburtstag])
"Geburtstag" ersetzen Sie dabei wieder durch den Namen des Feldes, in dem Sie die Geburtstage festhalten. Hierdurch wird der Abfrage ein neue Feld "T" hinzugefügt, das den jeweiligen Tag des Geburtstags enthält, also einen Wert von "1" bis "31" haben kann.
* Speichern Sie die Änderungen und verlassen Sie den Abfrageentwurf.
* Öffnen Sie nun den Bericht für die Geburtstagsliste im Entwurfsmodus.
* Öffnen Sie den Dialog "Sortieren und Gruppieren" per Klick auf das entsprechende Symbol oder über das Menü Ansicht.
* Stellen Sie unter "Feld/Ausdruck" das Feld "M" sowie unter "Sortierung" den Eintrag "Aufsteigend" ein. Bei Access 2007 klicken Sie unter der Entwurfsansicht im Aufgabenbereich "Gruppieren, Sortieren und Summe" auf Gruppe hinzufügen und wählen dann das Feld "M" aus. Ein Gruppenkopf wird hier automatisch hinzugefügt.
* Markieren Sie bei der Eigenschaft "Gruppenkopf" den Eintrag "Ja".
* Stellen Sie in der Zeile darunter unter "Feld/Ausdruck" das Feld "T" sowie unter "Sortierung" den Eintrag "Aufsteigend" ein. Bei Access 2007 klicken Sie unter der Entwurfsansicht im Aufgabenbereich "Gruppieren, Sortieren und Summe" auf Sortierung hinzufügen und wählen dann das Feld "T" aus.
* Schließen Sie den Dialog bzw. den Aufgabenbereich mit einem Klick auf das Schließen-Symbol oben rechts.
* Legen Sie im neu hinzugefügten Gruppenkopf "M - Kopfbereich" ein ungebundenes Textfeld an, ändern Sie die Beschriftung auf "Monat:", legen Sie für das Textfeld eine etwas größere Schrift und die Auszeichnung "Fett" fest und geben Sie die folgende Formel in der Eigenschaft "Steuerelementeinhalt" ein:
=Wählen([M];"Januar";"Februar";"März";"April";
"Mai";"Juni";"Juli";"August";"September";
"Oktober";"November";"Dezember")
Diese Formel sorgt dafür, dass statt der Zahl des jeweiligen Monats (1, 2, 3...) dessen Name (Januar, Februar, März...) im Klartext ausgegeben wird. Je nach Inhalt von "M" (1 bis 12) wird dazu der 1., 2., 3. bis 12. Monatsname gemäß Parameterliste verwendet.
* Legen Sie unter diesem Textfeld noch eine Linie an, damit die einzelnen Monate übersichtliche getrennt ausgegeben werden.
* Falls Sie ein Feld "Geburtstag" im Detailbereich verwenden, löschen Sie dieses Feld und legen Sie stattdessen ein ungebundenes Textfeld "txtGeburtstag" oder ähnlich mit folgender Formel in "Steuerelementeinhalt" an:
=[T] & "." & [M]
Dieses Feld gibt nun den jeweiligen Geburtstag ohne Geburtsjahr aus, da das in der Geburtstagsliste nicht relevant ist - Ziel ist eine Übersicht, wer in den einzelnen Monaten an welchem Tag Geburtstag hat. Benötigen Sie das Geburtsjahr für irgendwelche Zwecke, belassen Sie das Feld "Geburtstag" im Detailbereich und verzichten auf dieses ungebundene Textfeld oder ergänzen Sie die Formel wie folgt:
=[T] & "." & [M] & "." & Jahr([Geburtstag])
* Speichern Sie die Änderungen und lassen Sie den Bericht anzeigen.
Das Ergebnis ist nun eine übersichtliche Liste folgenden Aufbaus:
Monat: Januar
-------------
Michael Schmidt 12.1.
Susanne Müller 23.1.
Monat: Februar
---------------
Johannes Meier 17.2.
Monika Krüger 19.2.
Soll nun die Liste noch um eine Altersangabe ergänzt werden, müssen Sie zunächst einen kleinen Stolperstein aus dem Weg räumen: Wenn Sie das Alter einer Person, die beispielsweise am 19.07.1973 Geburtstag hat, einfach mit der Formel "(Jahr(Jetzt())-Jahr([Geburtstag]))" berechnen, ist diese Person schon ab Januar des jeweiligen Jahres 34 Jahre alt. Es muss also Monat und Tag entsprechend berücksichtigt werden. Das erfolgt mit Hilfe einer entsprechend aufgebauten Formel:
* Öffnen Sie die der Geburtstagsliste zugrunde liegende Abfrage im Entwurfsmodus.
* Tippen Sie folgende Formel in einer leeren Spalte des Abfrageentwurfes ein:
Alter: DatDiff("jjjj"; [Geburtstag];
Datum()) + (Format(Datum();
"mmtt") < Format([Geburtstag]; "mmtt"))
"Geburtstag" ist dabei durch den Namen des Feldes zu ersetzen, in dem das Geburtsdatum gespeichert wird. Diese Formel berechnet zunächst per "DatDiff("jjjj"; [Geburtstag]; Datum())" die Differenz zwischen dem aktuellen Jahr und dem Geburtsjahr. Ist Monat und Tag des Geburtstages kleiner als Monat und Tag, muss ein Jahr abgezogen werden. Dazu addiert die Formel das Ergebnis des Ausdrucks "Format(Datum(); "mmtt") < Format([Geburtstag]; "mmtt")" zum vorherigen Ergebnis. Dieser Ausdruck prüft, ob Monat und Tag des Geburtstages kleiner als Monat und Tag des aktuellen Datums sind. Wenn ja, ist das Ergebnis "-1", andernfalls "0". Durch die Addition von beispielsweise "34 plus -1" ergibt sich dann das korrekte Alter von 33 Jahren.
* Speichern Sie die Änderungen und verlasen Sie den Abfrageentwurf.
* Öffnen Sie den dazugehörenden Bericht und ergänzen Sie die Formel für das ungebundene Textfeld "txtGeburtstag" wie folgt:
=[T] & "." & [M] & " (" & [Alter] & ")"
Diese Formel sorgt dafür, dass hinter dem Geburtstagsdatum das aktuelle Alter in Klammern ausgegeben wird.
Kurzformen von Tagesnamen verwenden
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich benötige in meiner Datenbank für Analysedaten neben dem Datum auch den Wochentag in Kurzfassung (Mo, Di, Mi und so weiter) In Excel kann ich mit
=TEXT(B1;"TTT")
zum Datum in B1 den entsprechenden Tag ausgeben lassen. Gibt es in Access solch eine Möglichkeit auch? Oder gibt es eventuell auch andere Lösungen?
W. Hess
ANTWORT: In Access verwenden Sie dazu die Funktion "Format$()":
strTagKurz = Format$([Feldname],"ddd")
Der erste Parameter "Feldname" definiert das Feld, in dem das betreffende Datum gespeichert ist. Der zweite Parameter ist eine Maske, die festlegt, in welchem Format das Ergebnis geliefert werden soll. "ddd" steht hierbei für die Kurzform der Tagesnamen, also "Mo", "Di", "Mi" und so weiter. In Abfragen verwenden Sie die folgende Variante in einer leeren Spalte des Abfrageentwurfs, um ein Feld "TK" zu generieren:
TK: Format$([Bestelldatum];"ttt")
Adressdaten aus Kombinationsfeld in Formularfelder übernehmen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In einem Formular soll ein Kombinationsfeld eingesetzt werden, das Kundenadressen anzeigt. Nach einer Auswahl sollen Name und Adresse in die Felder des Formulars eingetragen und somit in der zugrundeliegenden Tabelle gespeichert werden. Wie lässt sich das realisieren?
ANTWORT: Dazu verwenden Sie ein mehrspaltiges Kombinationsfeld (z.B. Spaltenanzahl = 5), das mit einer SQL-Anweisung in der Eigenschaft "Datensatzherkunft" ähnlich der folgenden gefüllt wird:
SELECT VorNachName, Firma, Strasse, PLZ, Ort FROM Adressen;
In der Ereignisprozedur "Nach Aktualisierung" des Kombinationsfeldes können Sie dann die einzelnen Spalten auslesen und den Feldern im Formular zum Beispiel wie folgt zuordnen:
Me.txtVorNachName = Me.KombiFeld.Columns(0)
Me.txtFirma = Me.KombiFeld.Columns(1)
Me.txtStrasse = Me.KombiFeld.Columns(2)
Me.txtPLZ = Me.KombiFeld.Columns(3)
Me.txtOrt = Me.KombiFeld.Columns(4)
Über die Eigenschaft "Columns" greifen Sie auf die einzelnen Spalten des Kombinationsfeldes zu, wobei der Index "0" die 1. Spalte, "1" die 2. Spalte, "2" die 3. Spalte u.s.w. adressiert.
Aktuelles Feld auffällig hervorheben
Versionen: Access 2007, 2003, 2002/XP und 2000
Wenn Sie bei der Bearbeitung eines Datensatzes beispielsweise durch ein Telefonat oder einen Kollegen gestört werden, fällt es anschließend insbesondere in umfangreichen Formularen nicht leicht, das zuletzt bearbeitete Feld zu finden. Mit Hilfe der bedingten Formatierung können Sie dafür sorgen, dass das aktuelle Feld auffällig formatiert dargestellt wird und sich so schnell finden lässt:
1. Öffnen Sie das betreffende Formular im Entwurfsmodus.
2. Markieren Sie mit gedrückter Umschalt-Taste alle gewünschten Textfelder, Listen und Kombinationsfelder.
3. Wählen Sie in Access 2003, 2002/XP und 2000 das Menü Format-Bedingte Formatierung an. In Access 2007 klicken Sie auf der Multifunktionsleiste "Entwurf" auf das Symbol Bedingt.
4. Stellen Sie "Bedingung 1" auf den Eintrag "Feld hat Fokus" ein.
5. Legen Sie im Bereich daneben die gewünschte Formatierung fest, also beispielsweise eine rote, fette Schrift auf weißem Hintergrund und übernehmen Sie die Änderungen mit Ok.
In Zukunft können Sie nun auf einen Blick erkennen, welches das aktuelle Eingabefeld ist - und das sogar in einem Endlosformular, denn auch dort gelten die Einstellungen der bedingten Formatierung!
Alle Schaltflächen im Formular deaktivieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In einem Formular gibt es verschiedene Schaltflächen, die ich in "Form_Load" zunächst mit
btnA.Enabled = False
btnB.Enabled = False
btnC.Enabled = False
etc. sperre und später je nach angemeldetem Benutzer "CurrentUser()" und abhängig von aktuellen Eingaben und Einstellungen mit ".Enabled = True" wieder freischalten. Um das Ganze etwas zu vereinfachen, möchte ich eine Schleife für die Deaktivierung einsetzen. Wie muss diese Schleife aufgebaut sein?
ANTWORT: Verwenden Sie die Auflistung "Controls", in der alle Steuerelemente des Formulars festgehalten sind:
Dim Ctl As Control
For Each Ctl in Me.Controls
If TypeOf Ctl Is CommandButton Then
Ctl.Enabled = False
End If
Next Ctl
Alternativ können Sie im Formularentwurf alle Schaltflächen mit gedrückter Umschalt-Taste markieren und im Eigenschaftenfenster für diese Mehrfachauswahl die Eigenschaft "Aktiviert" auf "Nein" einstellen. Damit wären dann alle Schaltflächen beim Öffnen des Formulars deaktiviert und Sie können die oben gezeigte Schleife einsparen.
Datenerfassung über Popup-Formulare
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Damit das Hauptformular übersichtlich bleibt, habe ich eine Befehlsschaltfläche angelegt, mit dem ein Unterformular mit Detaildaten aufgerufen wird. Die Anzeige der Daten funktioniert zwar einwandfrei, aber es lassen sich keine neuen Datensätze hinzufügen. Wenn dasselbe Unterformular im Hauptformular eingebettet ist, funktioniert auch das Hinzufügen von neuen Datensätzen. Was ist zu tun?
Ein als Unterformular ausgelegtes Formular können Sie nur bedingt als Popup-Formular für die Datenerfassung verwenden, da in diesem Fall die Eigenschaften "Verknüpfen von" und "Verknüpfen zu" nicht definiert sind. Für die Nutzung eines Formulars als Popup-Formular für eine Datenerfassung müssen zunächst dessen Eigenschaften "Bearbeiten zulassen", "Löschen zulassen" und "Anfügen zulassen" auf "Ja" eingestellt sein. Sowohl Haupt- als auch Popup-Formular müssen ein gemeinsames Schlüsselfeld wie zum Beispiel "KursNum" haben. Beim Aufruf des Formulars ist dafür Sorge zu tragen, dass darüber eine Verknüpfung zum aktuellen Hauptdatensatz erfolgen kann:
DoCmd.OpenForm "Formular", , , "KursNum" = Me.KursNum
Die Verknüpfung erfolgt hier über den letzten Parameter.
Datensätze auffällig hervorheben
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Nehmen wir an, dass Sie in einem Formular alle Artikel, die zukünftig nicht mehr verkauft werden, mit einem aktivierten Kontrollkästchen Auslaufartikel kenntlich machen. Diese kleine Einstellung wird allerdings häufig übersehen, so dass sich die folgende Methode zur deutlichen Hervorhebung anbietet:
* Öffnen Sie das gewünschte Formular im Entwurfsmodus.
* Markieren Sie alle Felder mit gedrückter Umschalt-Taste.
* Wählen Sie das Menü Format-Bedingte Formatierung an. Beim Einsatz von Access 2007 wechseln Sie auf die Multifunktionsleiste "Entwurf" und klicken auf Bedingt.
* Stellen Sie Bedingung 1 auf "Ausdruck ist" ein und geben Sie die folgende Formel ein:
[Auslaufartikel]=-1
Ersetzen Sie für Ihre Datenbank "Auslaufartikel" durch den Namen des Kontrollkästchen in Ihrem Formular an.
* Wählen Sie darunter als Textfarbe beispielsweise "Rot" und aktivieren Sie die Auszeichnung "Fett".
* Bestätigen Sie mit Ok, um die Änderungen zu übernehmen.
In Zukunft werden nun alle Feldinhalte auffallend rot und fett dargestellt, wenn das Kontrollkästchen Auslaufartikel aktiviert ist.
Datum der letzten Änderung festhalten
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich möchte in einem Formular die Information angezeigt bekommen, wann der Datensatz zuletzt bearbeitet wurde. Meine bisherigen Experimente mit einer Formel "= Jetzt()" haben dazu geführt, dass auch bei einer Anzeige des Datensatzes ohne Änderung das aktuelle Systemdatum festgehalten wird. Wo liegt mein Fehler bzw. wie genau lässt sich eine solche Funktion realisieren?
ANTWORT: Erweitern Sie zunächst die Tabelle, die dem Formular als Datenbasis dient, um ein Feld "ZuletztBearbeitet" oder ähnlich vom Datentyp "Datum/Zeit". Stellen Sie die Eigenschaft "Standardwert" auf "Jetzt()" ein. Damit wird dem Feld beim Anlegen eines neuen Datensatzes das aktuelle Datum als Informationen "Zuletzt bearbeitet" zugewiesen. Stellen Sie dann im Formular für die Eigenschaft "Vor Aktualisierung" den Eintrag "[Ereignisprozedur]" ein, klicken Sie auf die Schaltfläche mit den drei Punkten und geben Sie folgende Anweisungen im VBA-Editor ein:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Me.ZuletztBearbeitet = Now
End Sub
Wenn künftig am Datensatz eine Änderung erfolgt ist - und nur dann! -, speichert Access automatisch das Datum dieser Änderung im Feld "ZuletztGeändert". Die reine Anzeige des Datensatzes ändert dieses Datum also nicht.
Datumsangaben als Kriterium
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In der Artikelverwaltung gibt es ein Feld, in das ein Datum, ab dem der Artikel nicht mehr lieferbar ist, eingetragen wird. In einer Abfrage möchte ich nur die Artikel als Ergebnis erhalten, die in den kommenden 30 Tagen ausgelaufen sind. Leidere Funktioniert die Formel "< Jetzt() + 30" als Kriterium nicht. können Sie mir dazu einen Tipp geben?
ANTWORT: "Jetzt()" kann nicht verwendet werden, da die Funktion Datum UND Uhrzeit, also beispielsweise "12.03.2008 15:37:34" liefert, Ihr Feld hingegen nur das Datum, beispielsweise "12.03.2008", enthält - es kann also keine Übereinstimmung festgestellt werden. Sie müssen statt "Jetzt()" die Funktion "Datum()" verwenden, die nur das reine Datum, zum Beispiel "12.02.2008" liefert und sich somit bei einem Vergleich mit dem Feld "12.03.2008" eine Übereinstimmung ergibt. Außerdem müssen Datumskriterien immer in Nummernzeichen geklammert werden, also z.B. so
= "#" & Datum()+30 & "#"
Einzelnes Bezeichnungsfeld anlegen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Es gelingt mir nicht, ein Bezeichnungsfeld in meinem Formular anzulegen. Offensichtlich ist das nur zusammen mit einem Textfeld möglich. Ich benötige aber nur ein einzelnes Bezeichnungsfeld, um mir anzeigen zu lassen, ob eine bestimmte Datenbank vorhanden ist und wo.
ANTWORT: Zunächst ein paar generelle Anmerkungen zu Bezeichnungsfeldern: Wenn Sie ein Bezeichnungsfeld anlegen, aktiviert Access es und Sie müssen eine Bezeichnung eingeben. Tun Sie dies nicht, indem Sie zum Beispiel die Esc-Taste drücken, löscht Access das aus seiner Sicht leere Bezeichnungsfeld kurzerhand wieder. Wenn Sie also den Inhalt eines Bezeichnungsfeldes später per VBA-Code setzen möchten, geben Sie zunächst als Bezeichnung z.B. einfach ein "X" oder den Namen des Bezeichnungsfeldes wie zum Beispiel "lblDatenbank" ein. In einer VBA-Routine setzen Sie den Inhalt dann beispielsweise wie folgt:
Me.lblDatenbank.Caption = CurrentDB.Name
Diese Anweisung schreibt zum Beispiel Pfad und Dateinamen der aktuellen Datenbank in das Bezeichnungsfeld "lblDatenbank". Ihr anderes Problem lässt sich nicht allgemeingültig beantworten. Wenn Sie eine Datenbank auf dem kompletten System über mehrere Laufwerke hinweg suchen möchten, bedarf es einer komplexen, rekursiven Suchroutine, die wir hier aus Platzgründen in den Helplines nicht vorstellen können. Haben Sie Ihre Datenbanken in einem bestimmten Verzeichnis oder in einer fest definierten Anzahl von Verzeichnissen gespeichert, käme folgende, in der Ereignisprozedur "Beim Laden" (Form_Load) des Formulars untergebrachte Lösung in Betracht:
Dim I&, Found As Boolean
Dim MDBFolders As Variant
Dim cstrMDBName = "Adressen.mdb"
MDBFolders = Array("D:\Daten\Access\", "Z:\Test\")
Found = False
For I = 0 To UBound(MDBFolders)
If Dir$(MDBFolders(I) & cstrMDBName)<> "" Then
Me.lblDatenbank.Caption = MDBFolders(I) & cstrMDBName
Found = True
Exit For
End If
Next I
If Not Found Then
Me.lblDatenbank.Caption = cstrMDBName & _
" nicht gefunden!"
End If
Diese Anweisungen suchen in den in "MDBFolders" per "Array()" spezifizierten Verzeichnissen nach der über die Konstante "cstrMDBName" festgelegten Datenbank. Wenn sie dort vorhanden ist, werden Pfad und Dateiname ins Bezeichnungsfeld geschrieben, ein Kennzeichen "Found" gesetzt und die Schleife verlassen. Anhand des Kennzeichens "Found" kann dann im Falle des Nichtvorhandeneins der Datenbank ein entsprechender Hinweis angezeigt werden.
Esc-Taste in Memofeldern deaktivieren
Versionen: Access 2007, 2003, 2002/XP und 2000
Oftmals setzen Sie Formulare ein, in denen über Memofelder sehr umfangreiche Informationen erfasst werden. Wenn nun ein Mitarbeiter in einem Memofeld versehentlich die Esc-Taste drückt, verwirft Access die komplette Eingabe ohne weitere Rückfrage. Eine kleine VBA-Routine schafft Abhilfe:
* Öffnen Sie das betreffende Formular im Entwurfsmodus.
* Markieren Sie das Memofeld und rufen Sie den Eigenschaften-Dialog auf.
* Stellen Sie die Eigenschaft "Bei Taste Ab" auf "Ereignisprozedur" und klicken Sie auf die Schaltfläche mit den drei Punkten, um den VBA-Editor zu öffnen.
* Geben Sie im VBA-Editor folgende Anweisungen ein:
If KeyCode = 27 Then
Beep
KeyCode = 0
End If
* Schließen Sie den VBA-Editor und lassen Sie das Formular anzeigen.
Wenn nun in einem Memofeld Esc gedrückt wird, ertönt lediglich ein akustischer Hinweis, die Eingabe bleibt aber erhalten. Wichtig dabei: Normalerweise verwenden Sie Esc auch, um Änderungen an einem Datensatz zurückzunehmen - das funktioniert natürlich nicht mehr, wenn sich der Cursor im Memofeld befindet. Aktivieren Sie dann einfach ein anderes Feld und drücken Sie dort erneut Esc.
Farbe für Registerkarten ändern
Versionen: Access 2007 und 2003
FRAGE: Wir arbeiten mit Access 2003 und nutzen in Formularen zur besseren Übersicht häufig das Registersteuerelement. Als Hintergrundart wird für das Registersteuerelement meist die Einstellung "Transparent" gewählt. Dennoch wird das Registersteuerelement nicht mit der Hintergrundfarbe des Formulars, sondern ganzflächig "weiß" bzw. "hellgrau" dargestellt (sowohl in der Formular- als auch in der Entwurfsansicht). Ein sehr unschöner Effekt, der beseitigt werden soll.
ANTWORT: Mit der Einstellung "Transparent" können Sie lediglich einstellen, dass das Register quasi "durchsichtig" ist und man auf den Detailbereich hindurchschauen kann. Dieser Effekt ist allerdings nur zu erzielen, wenn unter Extras-Optionen auf der Registerkarte "Formulare/Berichte" (Access 2003) bzw. in den Access-Optionen, Bereich "Aktuelle Datenbank", Abschnitt "Anwendungsoptionen" (Access 2007), die Option Mit einem Design versehene Windows-Steuerelemente auf Formularen verwenden deaktiviert ist.
Die Standardeinstellung ist "Aktiviert" und muss für jede Datenbank einzeln geändert werden. Leider lässt sich dies im Gegensatz zu anderen Optionen nicht mit "SetOption" oder auf anderem Wege automatisieren. Die Hintergrundfarbe selbst lässt sich nicht ändern, es wird immer die Farbe verwendet, die in der Systemsteuerung für die Anzeige von 3D-Objekten eingestellt oder durch ein Farbschema vorgegeben ist. Das Problem lässt sich nur lösen, indem die Hintergrundfarbe des Detailbereichs auf den Wert "-2147483633" eingestellt wird - Access verwendet dann auch dafür die Farbe gemäß Systemsteuerung, so dass Detailbereich und Registersteuerelement immer und unabhängig von Systemeinstellungen die gleiche Farbe haben.
Feld in Unterformular aktualisieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ein Hauptformular "Außendienst" enthält ein ungebundenes Feld "Monat", ein Unterformular "Monatsumsatz" enthält ein Tabellenfeld "Monat". Wie lässt sich eine Verbindung herstellen, so dass das Feld im Unterformular die Eingabe aus dem Hauptformular übernimmt? Kann ich das Feld "Monat" so formatieren, das es automatisch die aktuelle Monatszahl übernimmt?
ANTWORT: Zunächst einmal sollten Sie die Felder nicht "Monat", sondern z.B. "AktuellerMonat" oder ähnlich nennen - "Monat" ist ein reserviertes Schlüsselwort von Access (Funktion "Datum()"), dessen Verwendung als Objektname zu unvorhersehbaren Ergebnissen und Problemen führen kann.
Zu Ihrem Problem: Verwenden Sie die Ereignisprozedur "Nach Aktualisierung" des Feldes "AktuellerMonat" im Hauptformular, um dort folgende Anweisung zu hinterlegen:
Forms("Hauptformular").Controls("Unterformular"). _
Controls("UFoDatum")= Me.AktuellerMonat
"Hauptformular" ersetzen Sie durch den Namen des Hauptformulars, "Unterformular" durch den Namen des Unterformular-Steuerelementes und "UfoDatum" durch den Namen des Datumsfeldes im Unterformular.
Um im Feld "AktuellerMonat" jeweils den aktuellen Monat vorzugeben, geben Sie folgenden Ausdruck in "Steuerelementeinhalt" ein:
=Monat(Jetzt())
Feldausgabe wahlweise mit oder ohne Zeilenumbruch
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich möchte gerne ein ungebundenes, vergrößerbares Textfeld "[Text1]" erstellen, das die Werte von zwei Textfeldern "[Text2]" und "[Text3]" anzeigt und dazwischen einen Zeilenumbruch durchführt. In der Eigenschaft "Steuerelementeinhalt" steht momentan:
= [Text2] & Zchn(?) & [Text3]
Wie heißt das Zeichen für den Zeilenumbruch? Am besten wäre, wenn der Zeilenumbruch auch nur dann eingefügt wird, wenn "[Text3]" nicht leer bzw. nicht NULL ist.
ANTWORT: Ändern Sie den Ausdruck in der Eigenschaft "Steuerelementeinhalt" wie folgt:
= Wenn([Text3] & "" = "";[Text2];[Text2] &
Zchn(13) & Zchn(10) & [Text3])
Dieser Ausdruck sorgt dafür, dass nur "[Text2]" ausgegeben wird, wenn "[Text3]" weder leer noch NULL ist, andernfalls wird "[Text2]" gefolgt von einem Zeilenumbruch und dann "[Text3]" ausgegeben.
Feldinhalte zusammenfassen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Wie kann man in einem Formular die Inhalte von Feld 1 + Feld 2 + Feld 3 in ein Feld 4 übertragen?
ANTWORT: Nutzen Sie dazu die Ereignisprozedur "Nach Aktualisierung" des Formulars und geben Sie folgende Anweisung ein:
Me.FeldZiel = Me.Feld1 & " " & _
Me.Feld2 & " " & _
Me.Feld3
"FeldZiel" ist das Feld, in das die zusammengefassten Inhalte abgelegt und "Feld1" bis "Feld3" sind die Felder, deren Inhalte zusammengefasst werden sollen.
Formatierbare Memofelder in Access 2007 nutzen
Versionen: Access 2007
Bislang konnten Sie formatierbare Texte in Ihren Datenbanken nur nutzen, wenn Sie das RTF-Steuerelement aus der Access bzw. Office Developer Edition oder aus Visual Studio oder spezielle ActiveX-Komponenten wie Total Access Memo verwendet haben. Mit Access 2007 stehen nun bereits standardmäßig formatierbare Memofelder zur Verfügung, die Sie zur Umsetzung spezieller Features wie einer Serienbrief-Funktion in neuen Datenbanken einsetzen können.
Dabei gibt es allerdings einige wichtige Grundlagen zu beachten: Formatierbare Memofelder stehen nur im neuen Datenbank-Format zur Verfügung, Sie müssen also vorhandene Datenbanken zunächst in das ACCDB-Format konvertieren. Wenn Sie in Ihren vorhandenen Datenbanken RTF-Steuerelemente oder ActiveX-Komponenten zur Realisierung formatierbarer Texte einsetzen, ist zu beachten, dass diese Inhalte nicht automatisch konvertiert werden können. Sie müssen also entsprechenden Anpassungsaufwand für eine VBA-gestützte Konvertierung oder gar eine manuelle Übernahme per Kopieren und Einfügen mit anschließender Neuformatierung einplanen.
Darüber hinaus müssen Sie berücksichtigen, dass die neuen formatierbaren Memofelder nicht alle bisher genutzten Möglichkeiten unterstützen. So können Sie beispielsweise keine Bilder, Grafiken oder Diagramme einbinden! Ist das in Ihrer Lösung notwendig, verwenden Sie weiterhin die bisher genutzten RTF-Steuerelemente oder ActiveX-Komponenten, sie funktionieren auch nach einer Konvertierung in das ACCDB-Format bis auf eine Einschränkung: In RTF-Steuerelementen kann aufgrund eines Bugs keine Rechtschreibhilfe mehr aufgerufen werden. Außerdem ist zu beachten, dass auch bei den neuen formatierbaren Memofeldern eine Beschränkung auf maximal rund 64.000 Zeichen vorhanden ist.
Schließlich ist noch eine kleine Ungereimtheit beim Einsatz formatierbarer Memofelder in Unterformularen zu berücksichtigen: Wenn ein solches Feld aktiviert und Text darin markiert wird, zeigt Access normalerweise eine kleine Symbolleiste mit Formatierungsfunktionen an. Befindet sich das formatierbare Memofeld in einem Unterformular, wird diese Symbolleiste nicht mehr eingeblendet und auch die Formatierungsgruppen "Schriftart" und "Rich-Text" in der Multifunktionsleiste werden nicht aktiviert - formatierbare Memofelder sind also in Unterformularen mehr oder weniger nutzlos.
Um formatierbare Memofelder nutzen zu können, müssen außer dem neuen Format "ACCDB" folgende Voraussetzungen erfüllt sein:
* Für das Memofeld muss im Tabellenentwurf die Eigenschaft "Textformat" auf "Rich-Text" eingestellt werden.
* Existiert bereits ein Formular (oder Bericht), ist dort im Formular-/Berichtsentwurf für das korrespondierende Feld ebenfalls "Textformat" auf "Rich-Text" einzustellen.
Anschließend können Steuerelemente sofort mit den formatierbaren Memofeldern arbeiten. Bei Aktivierung eines solchen Feldes und dem Markieren von Text darin wird eine kleine Symbolleiste über oder neben dem Feld eingeblendet und in der Multifunktionsleiste stehen die Formatierungsgruppen "Schriftart" und "Rich-Text" zur Verfügung. Die Symbolleiste ist zunächst nur schemenhaft zu sehen und wird erst bei Mauskontakt vollständig angezeigt. Verlässt der Mauszeiger die Symbolleiste und das Memofeld, blendet Access die Symbolleiste vollständig aus. Sie wird nicht immer zuverlässig reaktiviert, wenn Sie den Mauszeiger zurück ins Memofeld bewegen - in diesen Fällen ist es notwendig, den Text einmal neu zu markieren.
Zur Formatierung des Textes können Sie Schriftart, Schriftgröße und Schriftfarbe sowie eine Auszeichnung "Fett", "Kursiv" oder "Unterstrichen" für den markierten Bereich einstellen. Weiterhin können Sie den markierten Text wie mit einem Marker in einer auffälligen Farbe (leuchtendes Gelb, Grün, Lila usw.) hervorheben. Auf Basis des aktuellen Absatzes lässt sich die Ausrichtung "Linksbündig", "Zentriert" oder "Rechtsbündig" wählen, Blocksatz ist nicht verfügbar. Für Auflistungen können Sie zwischen nummerierten Listen oder Listen mit Aufzählungssymbol wählen. Schließlich ist es noch möglich, Absätze ein- oder auszurücken.
Über die neuen Eigenschaften "Oberer Rand", "Linker Rand", "Rechter Rand" und "Unterer Rand" können Sie einstellen, mit welchem Abstand zum Rand des Steuerelementes der Text im Memofeld angezeigt werden soll. Text lässt sich dadurch besser lesbar anzeigen. Über die ebenfalls neue Eigenschaft "Bildlaufleistenposition" können Sie festlegen, ob der Bildlauf wahlweise links oder rechts im Memofeld angezeigt wird, um so beispielsweise komfortable, umschaltbare Benutzeroberflächen für Rechts- und Linkshänder realisieren.
Formular mit 'x' Datensätzen anzeigen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Wenn ich ein Endlosformular als Dialog öffne, so wird immer nur ein oder maximal drei von zum Beispiel 25 möglichen Datensätzen angezeigt. Was muss ich machen, damit zumindest 10 oder 15 Datensätze gezeigt werden?
ANTWORT: Geben Sie in der Ereignisprozedur "Beim Laden" des Formulars folgende Anweisung ein:
DoCmd.MoveSize 100, 100, 5000, 10000
Dadurch wird das Formular an die Position "100, 100" gesetzt und dessen Breite auf "5000" bzw. dessen Höhe auf "10000" eingestellt. Mit den Werten müssen Sie ein wenig experimentieren, bis das Formular Ihren Anforderungen entsprechend angezeigt wird. Um nur die Breite und Höhe zu ändern oder nur die Höhe zu ändern, können Sie auch einzelne Parameter auslassen, Access verwendet dann die aktuellen Werte:
DoCmd.MoveSize , , 5000, 10000
DoCmd.MoveSize , , , 10000
Formular mit Detaildaten öffnen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In einem Formular mit einem Unterformular (Datenblattansicht) möchte ich durch Anklicken einer Zeile diesen Datensatz in einem neuen Formular öffnen. Im Unterformular stelle ich nur 3-4 Felder dar. Der Datensatz hat aber 15 Felder. Um diesen Datensatz weiter bearbeiten zu können, möchte ich ein neues Formular durch das Anklicken öffnen.
ANTWORT: Für eine solche Lösung empfehlen wir einen Doppelklick als Auslöser, weil andernfalls das Klicken zur Aktivierung eines Feldes für eine Änderung die Anzeige des Formulars zur Folge hätte. Gehen Sie folgendermaßen vor:
* Öffnen Sie das Unterformular im Entwurfsmodus.
* Markieren Sie das Feld, über das per Doppelklick das Öffnen des Formulars ausgelöst werden soll.
* Stellen Sie die Eigenschaft "Bei Doppelklick" auf "[Ereignisprozedur]" ein und klicken Sie auf die Schaltfläche mit den drei Punkten, um den VBA-Editor zu öffnen.
* Geben Sie folgende Anweisung ein:
Private Sub ArtikelNr_DblClick(Cancel As Integer)
DoCmd.OpenForm "Artikel", , , "ArtikelNr=" & _
Me.ArtikelNr
End Sub
"Artikel" ersetzen Sie dabei durch den Namen des zu öffnenden Formulars und "ArtikelNr" durch den Namen des Primärschlüsselfeldes oder eines anderen, gemeinsamen Feldes, über das eine Verknüpfung erfolgen kann. Wenn es sich beim Verknüpfungsfeld um ein Feld vom Datentyp "Text" handelt, sind im Kriterium einfache Anführungszeichen zu verwenden:
DoCmd.OpenForm "Artikel", , , "ArtikelName='" & _
Me.ArtikelName & "'"
* Speichern Sie die Änderungen und testen Sie die Lösung.
Nach einem Doppelklick in das betreffende Feld wird nun das Formular mit den dazugehörenden Detaildaten angezeigt. Durch den 4. Parameter bei "DoCmd.OpenForm" erfolgt dabei eine Filterung gemäß des übergebenen Kriteriums, so dass genau ein Datensatz angezeigt wird. Soll es keine Rolle spielen, in welches Feld der Doppelklick erfolgt, ordnen Sie oben erläuterte Anweisung allen Felder in der Ereignisprozedur "Bei Doppelklick" zu. Alternativ können Sie auch eine Schaltfläche im Formularfuß des Unterformulars verwenden und die Anweisung dort in der Ereignisprozedur "Beim Klicken" unterbringen - das Formular wird dann für den jeweils aktivierten Datensatz geöffnet.
Formular per Esc-Taste schließen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Wir arbeiten mit Access 2000. In unserer Datenbank verwende ich in den meisten Formularen zum Schließen eine Schaltfläche Esc, der ich in der Ereignisprozedur "Beim Klicken" die Anweisung "DoCmd.Close" zugeordnet habe. Außerdem habe ich die Eigenschaft "Abbrechen" auf "Ja" gesetzt. Ich möchte nun, dass beide Methoden (Klicken auf die Schaltfläche und Drücken der Esc-Taste) gleich funktionieren! Genauer: Wie muss ich die Prozedur erweitern, so dass beim Schließen des Formulars ein im Unterformular geänderter Datensatz gespeichert wird? Bei Verwendung der Schaltfläche klappt das. Beim Drücken der Esc-Taste aber leider nicht! Normalerweise genügt zum Speichern eines Datensatzes im Unterformular der Sprung zu einem Feld im Hauptformular. Ich habe also vor den "Close"-Befehl ein "Me.Artikel.SetFocus" gesetzt. Das wird jedoch nicht beachtet. Beim Testen im "Einzelschritt" (Haltepunkt definiert) wird die (oben genannte) Prozedur gar nicht angesprochen!
ANTWORT: Die Esc-Taste hat unter Access eine spezielle Bedeutung: Wird sie nach einer Änderung in einem Feld gedrückt, nimmt Access diese Änderung zurück und gibt den ursprünglichen Feldinhalt wieder vor. Wenn sie anschließend noch einmal gedrückt wird oder am aktuellen Feld keine Änderung erfolgt ist, nimmt Access alle eventuell vorher vorgenommenen Änderungen am Datensatz zurück und stellt alle ursprünglichen Feldinhalte komplett wieder her. Sie können die Funktionsweise der Taste Esc ändern, indem Sie die Eigenschaft "Tastenvorschau" des Formulars auf "Ja" einstellen und für die Ereignisprozedur "Bei Taste Ab" zum Beispiel folgende Anweisungen verwenden:
Private Sub Form_KeyDown(KeyCode As Integer, _
Shift As Integer)
If KeyCode = 27 Then
KeyCode = 0
btnEsc_Click
End If
End Sub
Der KeyCode "27" entspricht der Esc-Taste. Wird diese erkannt, setzen wir den KeyCode auf "0", um Access mitzuteilen, dass es nicht auf die Taste reagieren soll. Anschließend wird die Ereignisprozedur "Beim Klicken" einer Schaltfläche "btnEsc" aufgerufen, die dann Ihre oben erläuterten Aktionen ausführt und das Formular nach Speicherung der Änderungen schließt. Die Speicherung eventueller Änderungen können Sie übrigens einfacher per "DoCmd.RunCommand acCmdSaveRecord" ausführen. Der Ordnung halber möchten wir darauf hinweisen, dass eine Änderung der Funktionsweise der Esc-Taste bei Access-Anwendern zu Verwirrungen und ggf. zur Speicherung falscher Daten führen kann, wenn diese sich darauf verlassen, dass die Esc-Taste wie oben erläutert als Rückgängig-Aktion funktioniert.
Formular unsichtbar öffnen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In einem Formular verwende ich Ergebnisse aus 3 verschiedenen Formularen (das Ergebnis wird im jeweiligen Formular berechnet). Nun sollen die 3 geöffneten Formulare als nicht sichtbar geöffnet werden (Daten werden nur vom geöffneten Formularen übernommen). Können Sie mir Dabei behilflich sein?
ANTWORT: Öffnen Sie die Formulare jeweils mit folgender Anweisung:
DoCmd.OpenForm FormName:=
"FormName", WindowMode:= acHidden
"FormName" ersetzen Sie jeweils durch den Namen des Formulars. "WindowMode:= acHidden" legt fest, dass das Formular versteckt bzw. unsichtbar geöffnet wird.
Ja-/Nein-Felder in vorgedruckten Formularen korrekt ausgeben
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
In vielen Bereichen werden Berichte verwendet, um Daten auf Vordrucken wie beispielsweise Bestellformularen oder Schadensmeldungen auszugeben. Ist es endlich gelungen, die einzelnen Felder im Bericht so auszurichten, dass die Inhalte an den dafür vorgesehenen Stellen auf dem Vordruck ausgedruckt werden, bleibt noch ein Problem zu lösen: Die Ausgabe von Ja-/Nein-Feldern. Werden hier Kontrollkästchen verwendet, erscheinen diese auf dem Papier als leeres oder mit einem Häkchen gefülltes Rechteck. Weder das Rechteck, das meist schon auf dem Vordruck vorhanden ist, noch das Häkchen sind für diese Aufgabe brauchbar. Leider stellt Access keinerlei Einstellmöglichkeiten für das Aussehen des Kontrollkästchens in Berichten zur Verfügung, mit einfachen Tricks können Sie aber trotzdem das Zeichen im Vordruck ausgeben, das Ihren aktuellen Anforderungen entspricht.
Dazu wird einfach ein ungebundenes Textfeld eingesetzt, dessen Inhalt Sie abhängig vom Ja-/Nein-Feld individuell füllen und so entweder einfach gar nichts oder ein einfaches "X" als Status "Angekreuzt" ausgeben können:
1. Fügen Sie im Bericht an der gewünschten Stelle ein Textfeld ein und stellen Sie die Eigenschaften "Hintergrundart" und "Rahmenart" auf "Transparent" ein.
2. Geben Sie in der Eigenschaft "Steuerelementeinhalt" folgende Formel ein:
=Wenn([JaNeinFeld]=-1;"X";"")
* "JaNeinFeld" ersetzen Sie dabei durch den Namen des Ja/Nein-Feldes, dessen Status ausgegeben werden soll. Die Formel sorgt dafür, dass bei Status "Aktiviert" (Wert= "-1") ein "X" und bei Status "Deaktiviert" gar nichts (leere Zeichenfolge) im Textfeld erscheint.
Wenn Sie den Bericht anzeigen lassen, wird der Status mit einem einfachen "X" ohne Rechteck ausgegeben, so dass der Bericht problemlos zum Füllen vorgedruckter Formulare oder Fragebögen eingesetzt werden kann.
Möchten Sie anstelle des "X" ein Kreuz ausgeben, dass wie handschriftlich gesetzt aussieht, gehen Sie folgendermaßen vor:
1. Fügen Sie im Bericht an der gewünschten Stelle ein Textfeld ein und stellen Sie die Eigenschaften "Hintergrundart" und "Rahmenart" auf "Transparent" ein.
2. Geben Sie in der Eigenschaft "Steuerelementeinhalt" folgende Formel ein:
=Wenn([JaNeinFeld]=-1;"";"")
* "JaNeinFeld" ersetzen Sie dabei durch den Namen des Ja/Nein-Feldes, dessen Status ausgegeben werden soll.
* Setzen Sie den Cursor zwischen die ersten leeren Anführungszeichen, halten Sie die Alt-Taste gedrückt, tippen Sie "0-2-5-1" auf dem numerischen Cursorblock ein und lassen Sie die Alt-Taste wieder los. Zwischen den Anführungszeichen erscheint nun der Buchstabe "Q".
* Stellen Sie als "Schriftart" für das Textfeld den Zeichensatz "Wingdings" ein. Der Buchstabe "Q" erscheint nun als handschriftlich getätigtes Kreuz.
Wenn Sie den Bericht anschließend einmal anzeigen lassen, wird der Status des Kontrollkästchens mit einem Kreuz ausgegeben, das wie handschriftlich gesetzt erscheint. Möchten Sie statt des handschriftlichen "X" ein normales Häkchen im Sinne von "abgehakt" ausgeben, tippen Sie in Schritt 4. die Ziffernfolge "0-2-5-2" ein. Weitere interessante Zeichen können Sie verwenden, wenn Sie über Start-Programme-Zubehör einmal das Applet "Zeichentabelle" aufrufen und "Wingdings" als Zeichensatz einstellen. Klicken Sie dann das gewünschte Zeichen an und anschließend auf Auswählen und Kopieren. Danach können Sie das Zeichen dann per Strg+V in der Formel einfügen.
Ja/Nein-Felder global setzen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich benutze ein Formular mit mehreren Hundert Datensätzen als Basis eines Berichtes. Nun möchte ich in einem Ja/Nein-Feld (das als Abfragekriterium dient) automatisch für alle Datensätze den Haken setzten und später wieder automatisch entfernen. Können Sie mir dabei helfen?
ANTWORT: Legen Sie im Formular zwei Schaltflächen "btnAll" und "btnNone" mit den Beschriftungen Alle auswählen und Alle zurücksetzen oder ähnlich an. Kopieren Sie dann folgende Ereignisprozeduren in das Formularmodul:
Private Sub btnAll_Click()
Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone
While Not rs.EOF
rs.Edit
rs("JaNein") = -1
rs.Update
rs.MoveNext
Wend
Set rs = Nothing
End Sub
Private Sub btnNone_Click()
Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone
While Not rs.EOF
rs.Edit
rs("JaNein") = 0
rs.Update
rs.MoveNext
Wend
Set rs = Nothing
End Sub
"JaNein" ersetzen Sie durch den Namen Ihres Ja/Nein-Feldes im Formular. Diese Routinen gehen in einer Schleife alle Datensätze des Formulars durch und setzen das Feld entweder auf "-1" (Häkchen gesetzt) oder auf "0" (Häkchen nicht gesetzt).
Kompletten Pfad der Datenbank in allen Formularen anzeigen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Der Pfad/Name der aktuellen Datenbank soll für die Anzeige in allen Formularen über einen String definiert werden. Dieser String (strDBPath) soll dann in allen Formularen der Anwendung zur Verfügung stehen. Ich habe in dem unter Extras-Start eingestellten Startformular den String wie folgt definiert:
Public strDBPath As String
Den Inhalt setze ich in der Ereignisprozedur "Beim Laden" wie folgt:
strDBPath = CurrentDb.Name
Wenn ich jedoch in einem Formular (in der gleichen Anwendung) auf den String zugreife, kommt es zu einer Fehlermeldung. Wie kann ich eine Variable definieren, so dass diese in allen Formularen einer Anwendung verwendet werden kann?
Sie sind hier über eine kleine Ungereimtheit in Access gestolpert: Mit "Public" (oder "Global") werden normalerweise Variablen deklariert, die in der gesamten Anwendung zur Verfügung stehen. Dazu muss die Deklaration allerdings in einem Modul erfolgen. Das Modul eines Formulars ist jedoch ein Klassenmodul, hier hat "Public" (oder "Global") die gleiche Wirkung wie "Private" (oder "Dim"), es werden also Variablen deklariert, die nur Gültigkeit im Bereich des Formulars haben und nach außen hin nicht verfügbar sind. Um das Problem zu lösen, verschieben Sie einfach die Deklaration der Variablen "strDBPath" in ein Modul. Wenn es nur darum geht, Pfad/Name der Datenbank im Formular anzuzeigen, können Sie auch ungebundene Textfelder verwenden und in deren Eigenschaft "Steuerelementeinhalt" folgenden Ausdruck eingeben:
=[CurrentDb].[Name]
Leere Felder auffällig hervorheben
Versionen: Access 2007, 2003, 2002/XP und 2000
Zur besseren Übersicht möchten Sie leere Felder, die noch nicht erfasst wurden, in Formularen oder Endlosformularen farblich hervorheben lassen. Dazu nutzen Sie die bedingte Formatierung wie folgt:
* Öffnen Sie das gewünschte Formular im Entwurfsmodus.
* Markieren Sie der Reihe nach die Felder, die farblich hervorgehoben werden sollen, wenn noch keine Informationen dafür erfasst wurden.
* Wählen Sie das Menü Format-Bedingte Formatierung an. In Access 2007 wechseln Sie auf das Register "Formularentwurfstools, Entwurf" und klicken in der Gruppe "Schriftart" auf das Symbol Bedingt.
* Stellen Sie unter "Bedingung 1" den Eintrag "Ausdruck" ein.
* Geben Sie im Textfeld dahinter folgenden Ausdruck ein:
IstNull([Feldname])
Für "Feldname" geben Sie den Namen des jeweiligen Feldes an.
* Stellen Sie als Formatierung bei erfüllter Bedingung zum Beispiel eine rote oder gelbe Füll-/Hintergrund mit einer gelben oder blauen Textfarbe sowie die Auszeichnung "Fett2ein. Es erscheint zunächst unsinnig, für die Anzeige leerer Felder eine Textfarbe einzustellen, wenn Access aber beispielsweise einen Hinweis wie "#Fehler!" oder "#Name?" anzeigt, sollte sichergestellt sein, dass er auch lesbar ist.
* Klicken Sie auf Ok und wiederholen Sie die obigen Schritte für das jeweils nächste Feld.
Zukünftig werden alle Felder, für die noch keine Informationen erfasst wurden, beispielsweise mit rotem Hintergrund angezeigt.
Leere Felder farblich hervorheben
Versionen: Access 2007, 2003, 2002/XP und 2000
FRAGE: Wir stellen unseren Kundenstamm auf Access um. Zur besseren Übersicht möchten wir Felder, die noch leer sind, farblich hervorheben lassen.
ANTWORT: Dazu nutzen Sie die bedingte Formatierung wie folgt:
* Öffnen Sie das betreffende Formular im Entwurfsmodus.
* Markieren Sie der Reihe nach die Felder, die farblich hervorgehoben werden sollen, wenn noch keine Informationen dafür erfasst wurden.
* Wählen Sie das Menü Format-Bedingte Formatierung an. In Access 2007 wechseln Sie auf das Register "Formularentwurfstools, Entwurf" und klicken in der Gruppe "Schriftart" auf das Symbol Bedingt.
* Stellen Sie unter "Bedingung 1" den Eintrag "Ausdruck" ein.
* Geben Sie im Textfeld dahinter folgenden Ausdruck ein:
IstNull([Feldname])
Für "Feldname" geben Sie den Namen des jeweiligen Feldes an.
* Stellen Sie als Formatierung bei erfüllter Bedingung zum Beispiel eine rote oder gelbe Füll-/Hintergrund mit einer gelben oder blauen Textfarbe sowie die Auszeichnung "Fett" ein. Es erscheint zunächst wenig sinnvoll, für die Anzeige leerer Felder eine Textfarbe einzustellen, wenn Access aber beispielsweise einen Hinweis wie "#Fehler!" oder "#Name?" anzeigt, sollte sichergestellt sein, dass er auch lesbar ist.
* Klicken Sie auf Ok und wiederholen Sie die Schritte für das nächste Feld.
In Zukunft werden nun alle Felder, für die noch keine Informationen erfasst wurden, beispielsweise mit rotem Hintergrund angezeigt.
Maus in Formularen sperren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
In Formularen müssen die Eingaben oftmals in einer bestimmten Reihenfolge vorgenommen werden, weil beispielsweise Feldinhalte abhängig von vorherigen Eingaben gesetzt werden. Es darf also nicht möglich sein, dass der Anwender direkt in ein Feld klickt, sondern er soll nur mit den Cursortasten, Return oder Tab von einem Feld zum anderen wechseln.
Das Problem lässt sich lösen, indem Sie für jedes Feld, in das nicht mit der Maus gewechselt werden darf, zwei Ereignisprozeduren zuordnen. Stellen Sie dazu jeweils die Eigenschaften "Beim Klicken" und "Beim Doppelklicken" auf den Eintrag "[Ereignisprozedur]" ein und geben Sie die folgenden Anweisungen ein:
On Error Resume Next
Screen.PreviousControl.SetFocus
Diese Anweisungen sorgen dafür, dass bei einem Klick oder Doppelklick in das jeweilige Feld das zuvor aktivierte Feld wieder den Fokus erhält und somit ein Wechsel des Feldes per Maus unterbunden wird.
Mauszeiger als 'Hand'-Symbol anzeigen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich verwende in einem Formular ein Objekt (Bild) und möchte beim Klicken auf dieses Bild eine Aktion ausführen lassen, zum Beispiel ein Formular öffnen. Dabei möchte ich, dass sich der normale Mauszeiger (Pfeil), sobald er auf dem Bild gesetzt wird, sich in eine Hand ändert. Leider habe ich die Änderungsmethode nirgendwo finden können. Können Sie mir helfen?
ANTWORT: Access selbst bietet keine Möglichkeit, einen individuellen Mauszeiger zu setzen. Hier können Sie aber per API-Funktion Abhilfe schaffen:
* Kopieren Sie zunächst die folgenden Deklarationen und Prozeduren in den allgemeinen Teil Ihres Formulars:
Private Const IDC_HAND As Long = 32649
Private Const IDC_ARROW As Long = 32512
Private Const GCL_HCURSOR = -12
Private Declare Function LoadCursor _
Lib "user32" _
Alias "LoadCursorA" ( _
ByVal hInstance As Long, _
ByVal lpCursorName As Long) As Long
Private Declare Function SetClassLong _
Lib "user32" _
Alias "SetClassLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Dim blnIsHand As Boolean
Sub RemoveHandCursor()
Dim R As Long
Dim hArrowCursor As Long
On Error Resume Next
'Kein Hyperlink-Cursor gesetzt
If Not blnIsHand Then Exit Sub
'Zu verwendenden Cursor laden
hArrowCursor = LoadCursor(ByVal 0&, IDC_ARROW)
'Standard-Cursor setzen
R = SetClassLong(Me.hwnd, GCL_HCURSOR, _
hArrowCursor)
DoEvents
'Flag zurücksetzen
blnIsHand = False
End Sub
Sub SetHandCursor()
Dim hHandCursor As Long
Dim R As Long
On Error Resume Next
If blnIsHand Then Exit Sub 'Ist schon gesetzt
'Zu verwendenden Cursor laden
hHandCursor = LoadCursor(ByVal 0&, IDC_HAND)
'Neuen Cursor setzen
R = SetClassLong(Me.hwnd, GCL_HCURSOR, hHandCursor)
DoEvents
'Flag setzen
blnIsHand = True
End Sub
* Kopieren Sie folgende Anweisungen in die Ereignisprozedur "Bei Mausbewegung" des Bild-Steuerelementes:
SetHandCursor
* Kopieren Sie folgende Anweisungen in die Ereignisprozedur "Bei Mausbewegung" des Detail-Bereiches des Formulars:
RemoveHandCursor
Wenn Sie nun den Mauszeiger über das Bild bewegen, wird über die Ereignisprozedur "Bei Mausbewegung" die Prozedur "SetHandCursor" aufgerufen. Die Prozedur lädt per API-Funktion "LoadCursor" das "Hand"-Symbol in den Speicher und die API-Funktion "SetClassLong" ordnet das Symbol dem Formular als anzuzeigenden Cursor zu. Wird die Maus aus dem Bild bewegt, löst das die Ereignisprozedur "Bei Mausbewegung" des Detailbereichs aus. Dadurch wird die Prozedur "RemoveHandCursor" aufgerufen, die per "LoadCursor" den Standard-Mauszeiger "Pfeil" lädt. "SetClassLong" ordnet den Mauzeiger dann wieder dem Formular als anzuzeigenden Mauszeiger zu. Wenn Sie einen Formularkopf oder einen Formularfuß verwenden, muss dort in der Ereignisprozedur "Bei Mausbewegung" ebenfalls die Prozedur "RemoveHandCursor" wie oben erläutert aufgerufen werden!
Mehr Übersicht mit umschaltbaren Unterformularen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
In der Access Weekly-Ausgabe vom 13.4.2007 hatten wir Ihnen gezeigt, wie Sie mehrseitige Formulare für die übersichtlichere Anordnung vieler Felder einsetzen. Eine weitere Möglichkeit, umfangreiche Informationen schnell erreichbar und übersichtlich innerhalb eines einzigen Formulars darzustellen, besteht darin, die Anzeige auf Unterformulare zu verteilen. Diese Unterformulare werden dann in einem Hauptformular über Schaltflächen ein-/ausgeblendet. So lassen sich beispielsweise für die Erfassung oder Bearbeitung von Kundendaten im Hauptformular die Basisdaten und die Zusatz-, Privat- oder sonstigen Infos per Unterformular einblenden und umschalten. In einem Info-System kann ein solcher Mechanismus zum Beispiel eingesetzt werden, um in einem Formular wahlweise Kunden-, Artikel- oder Lieferanten-Infos anzuzeigen.
Wenn Sie Unterformulare in Hauptformularen einsetzen, stellen Sie normalerweise die Eigenschaft "Herkunftsobjekt" auf den Namen des Unterformulars ein, das permanent angezeigt werden soll. Über die Eigenschaften "Verknüpfung von" und "Verknüpfung nach" legen Sie fest, welche Felder in Haupt- und Unterformular verknüpft werden müssen (also identische Inhalte haben), damit die zum jeweiligen Datensatz passenden Informationen korrekt angezeigt werden. Diese Einstellungen lassen sich auch per VBA ändern, so dass es kein Problem ist, innerhalb eines Hauptformulars einem Unterformular verschiedene Herkunftsobjekte zuzuordnen. Dazu gehen Sie wie folgt vor:
1. Zunächst erstellen Sie eine Abfrage, die alle anzuzeigenden Daten selektiert und sortiert, also zum Beispiel eine Abfrage "AFfrm Kunden", die alle Kundendaten nach Namen sortiert liefert.
2. Dann erstellen Sie ein Hauptformular basierend auf dieser Abfrage, in dem Sie die Felder für die Basisinformationen platzieren. Unter oder neben diesen Feldern platzieren Sie ein Steuerelement "Unterformular" mit dem Namen "UFMain" oder ähnlich und sichern das Formular beispielsweise als "Kunden/Hauptformular".
3. Im nächsten Schritt erstellen Sie zwei weitere Formulare, die ebenfalls auf der gleichen Abfrage basieren und platzieren im ersten Formular die Felder für die Zusatzdaten und im zweiten Formular die Felder für die Privat-Informationen. Diese Formulare werden unter "UF Kunden/Zusatz" und "UF Kunden/Privat" oder ähnlich gesichert.
4. Im Hauptformular weisen Sie der Eigenschaft "Herkunftsobjekt" des Steuerelementes "UFMain" den Namen des ersten anzuzeigenden Formulars "UF Kunden/Zusatz" zu. Die Eigenschaften "Verknüpfen von" und "Verknüpfen nach" stellen Sie auf das entsprechende Indexfeld, also beispielsweise "Kunden-Code" oder "KundenNr" ein.
5. Wenn Sie sich jetzt das Hauptformular einmal anzeigen lassen, sind zunächst immer die Zusatzinformationen im Unterformular sichtbar.
6. Legen Sie nun im Formularfuß zwei Schaltflächen "btnZusatz" und "btnPrivat" oder ähnlich an und beschriften Sie sie entsprechend mit "Zusatz" und "Privat". Die Ereignisprozeduren "Beim Klicken" enthalten die Anweisungen "UFMain.SourceObject = "UF Kunden/Zusatz"" bzw. "UFMain.SourceObject = "UF Kunden/Privat"".
7. Wenn Sie sich jetzt das Hauptformular noch einmal anzeigen lassen, werden zunächst wieder die Zusatz-Infos im Unterformular angezeigt, Sie können jetzt aber über die Schaltflächen umschalten auf "Privat" bzw. wieder zurück auf "Zusatz".
Ähnlich wie für die Erfassung/Bearbeitung von Kunden- oder ähnlichen Daten lassen, sich auch Informationen aus verschiedenen Bereichen innerhalb eines einzigen Hauptformulars umschaltbar anzeigen. Einsatzgebiete sind zum Beispiel Sachbearbeiter, die am Telefon Auskunft geben und dafür Zugriff auf verschieden strukturierte Informationen haben müssen.
Vom Grundsatz her erfolgt die Erstellung einer solchen Lösung ähnlich der oben beschrieben Lösung für die Erfassung/Bearbeitung von Daten:
1. Legen Sie Abfragen für die verschiedenen Unterformulare an. Also beispielsweise "AFfrm Kunden" für die Kundendaten, "AFfrm Lieferanten" für die Daten der Lieferanten und "AFfrm Artikel" für Artikeldaten".
2. Legen Sie Unterformulare basierend auf den verschiedenen Abfragen an. Also zum Beispiel "UF Kunden", "UF Lieferanten" und "UF Artikel".
3. Erstellen Sie ein Hauptformular mit einer entsprechenden Anzahl links vertikal angeordneter Schaltflächen, also beispielsweise den drei Schaltflächen Kunden (btnKunden), Lieferanten (btnLieferanten) und Artikel (btnArtikel) sowie einem rechts davon angeordneten "Unterformular"-Steuerelement (UFMain).
4. Ordnen Sie das erste Unterformular der Eigenschaft "Herkunftsobjekt" des Unterformulars "UFMain" zu. Also zum Beispiel "UF Kunden". Die Eigenschaften "Verknüpfung von" und "Verknüpfung nach" werden hier nicht benötigt.
5. Füllen Sie die Ereignisprozeduren "Beim Klicken" der Schaltflächen für die Umschaltung der Unterformulare.
Für die Umschaltung der Unterformulare kommt eine zentrale Prozedur im Klassenmodul des Formulars zum Einsatz, die einerseits den aktuell ausgewählten Bereich kenntlich macht, indem die Schriftfarbe der Schaltfläche geändert wird und zum anderen das jeweils benötigte Unterformular einblendet:
Sub UFAnzeigen (btn As Control, strUFoName)
Dim Anz As Integer, I As Long
Anz = Me.Count
For I = 0 To Anz - 1
If TypeOf Me(I) Is CommandButton Then
Me(I).ForeColor = QBColor(0)
End If
Next I
btn.ForeColor = QBColor(12)
UFMain.SourceObject = StrUFoName
End Sub
Der Aufruf dieser Prozedur und damit die Umschaltung der Unterformulare erfolgt über die Ereignisprozedur "Beim Klicken" der einzelnen Schaltflächen wie folgt:
Sub btnKunden_Click ()
UFAnzeigen btnKunden, "UF Kunden"
End Sub
Sub btnLieferanten_Click ()
UFAnzeigen btnLieferanten, "UF Lieferanten"
End Sub
Sub btnArtikel_Click ()
UFAnzeigen btnArtikel, "UF Artikel"
End Sub
In der Prozedur "UFAnzeigen" setzen wir zunächst in einer Schleife alle Schaltflächen wieder auf schwarze Schrift zurück, ändern dann die Farbe der aufrufenden Schaltfläche auf "Rot" und setzen abschließend die Eigenschaft "SourceObject" für das Unterformular auf das anzuzeigende, gemäß Parameter "strUFoName" spezifizierte Herkunftsobjekt.
Menü-Formular optimal nutzen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich verwende ein "Menü-Formular" um darüber mit Schaltflächen und "DoCmd.OpenForm"-Anweisungen weitere Formulare vor dem Menü-Formular zu öffnen. Wenn der Anwender zum Beispiel in dem Formular für die Adressverwaltung aus Versehen neben das Formular klickt, wird das Menü-Formular aktiviert und das Adressen-Formular verschwindet dahinter. Wie lässt sich das vermeiden?
ANTWORT: Öffnen Sie die Formulare mit dem zusätzlichen Parameter "acDialog" wie folgt:
DoCmd.OpenForm "FormName", , , , , acDialog
als Dialog. Ein Klick neben das Formular bleibt dann wirkungslos bzw. aktiviert kein anderes Formular. Auf diese Art kann allerdings immer nur ein Formular zurzeit geöffnet werden. Es muss dann, um zum Menü zurückzukehren, geschlossen werden, erst dann kann im Menü ein anderes Formular geöffnet werden.
Registersteuerelement ein-/ausblenden
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Können Sie mir einen Tipp geben, wie man ein Registersteuerelement abhängig von einem Feldinhalt ein- oder ausblenden kann? Ich habe ein Adressformular sowohl für private wie auch für geschäftliche Kunden. Ich möchte das Register "Mitarbeiter" aber nur einblenden, wenn die Anrede "Firma" ist.
ANTWORT: Das Registersteuerelement verfügt über eine Eigenschaft "Visible", mit der es sichtbar oder unsichtbar geschaltet werden kann. In Ihrem Fall wären die dazu notwendigen Anweisungen zunächst in der Ereignisprozedur "Beim Anzeigen" des Formulars unterzubringen, damit der Status bei jedem Datensatzwechsel geprüft werden kann:
Sub Form_Current()
If Me.Anrede & "" = "Firma" Then
Me.Mitarbeiter.Visible = True
Else
Me.Mitarbeiter.Visible = False
End If
End Sub
"Anrede" ersetzen Sie ggf. durch den Namen des Feldes oder Kombinationsfeldes, das die Anrede enthält. Die Anweisungen prüfen, ob die aktuelle Einstellung für Anrede "Firma" ist. Ist das der Fall, wird das Registersteuerelement per "Visible = True" sichtbar, ansonsten per "Visible = False" unsichtbar geschaltet. Die Verknüpfung 'Me.Anrede & ""' sorgt dafür, dass bei Feldern ohne Inhalt kein Laufzeitfehler "Ungültige Verwendung von Null" ausgelöst wird. Weiterhin muss sichergestellt sein, dass nach einer Änderung der Anrede das Registersteuerelement ebenfalls aus- oder eingeblendet wird. Dazu wird die Ereignisprozedur "Nach Aktualisierung" des Feldes oder Kombinationsfeldes "Anrede" genutzt. Dort geben Sie folgende Anweisung ein:
Form_Current
Dadurch wird obige Ereignisprozedur aufgerufen, die dann wie erläutert das Registersteuerelement ein- oder ausblendet.
Römische Zahlen ausgeben
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich muss in einigen Formularen und Berichten römische Zahlen (Quartale, Jahreszahlen usw.) ausgeben. Bei der Funktion "Format()" finde ich keine Maske, um Zahlen in diese Darstellungsart konvertieren zu können. Habe ich etwas übersehen oder gibt es eine andere Lösung?
ANTWORT: Mit der Funktion "Format()" können Sie mit einem kleinen Trick lediglich Quartalsangaben in römischen Zahlen ausgeben:
intQuartal = Format([Datumsfeld],"q") 'Ergebnis ist 1..4
strQuartal= "Quartal " & _
Choose(intQuartal,"I", "II", "III", "IV")
Um generell numerische Werte in römischen Zahlen auszugeben, kopieren Sie folgende Funktion in eine neues oder in ein vorhandenes Modul:
Public Function DezToRoemisch(ByVal aValue As Long) _
As String
Dim I&
Dim varArabisch As Variant, varRoemisch As Variant
Dim strResult As String
varArabisch = _
Array(1, 4, 5, 9, 10, 40, 50, 90, 100, _
400, 500, 900, 1000)
varRoemisch = _
Array("I", "IV", "V", "IX", "X", "XL", _
"L", "XC", "C", "CD", "D", "CM", "M")
For I = UBound(varArabisch) To _
LBound(varArabisch) Step -1
Do While aValue >= varArabisch(I)
aValue = aValue - varArabisch(I)
strResult = strResult & varRoemisch(I)
Loop
Next I
DezToRoemisch = strResult
End Function
Diese Funktion rufen Sie dann zum Beispiel in VBA wie folgt auf:
strQuartal = DezToRoemisch(Format([Datumsfeld],"q"))
Steuerelemente effektiver einfügen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Wenn Sie Formulare und Berichte aufbauen, kopieren Sie häufig vorhandene Steuerelemente mit Strg+C und fügen Sie direkt per Strg+V wieder ein. Dabei hat Access die unangenehme Eigenheit, das Formular oder eine Registerkarte zu vergrößern, damit die kopierten Steuerelemente hineinpassen.
Diese Effekte können sie umgehen: Access fügt immer unter dem aktuell markierten Steuerelement ein. Wenn Sie also Steuerelemente am unteren Rand eines Formulars oder einer Registerkarte kopieren, ist abzusehen, dass das Formular oder die Registerkarte vergrößert wird, da beim Einfügen das Steuerelement, das Sie kopiert haben, markiert bleibt. Wenn Sie nun auf den grauen Balken des Detailbereichs klicken, ist das das aktuell markierte Steuerelement. Die kopierten Steuerelemente werden damit am oberen Rand des Detailbereichs eingefügt. Das gleiche gilt für Registerkarten: Klicken Sie hier vor dem Einfügen einfach auf den Registerkartenreiter, dann wird das Steuerelement am oberen Rand der Registerkarte eingefügt.
Tabulatorreihenfolge im Registersteuerelement
Versionen: Access 2007, 2003, 2002/XP und 2000
FRAGE: In einem Formular tritt seit einiger Zeit ein seltsames Verhalten auf. Es befinden sich diverse Steuerelemente in 4 verschiedenen Registerblättern im Formular. Bei den Steuerelementen sind einige von der Reihenfolge ausgeschlossen und für den Rest ist eine individuelle Reihenfolgeposition festgelegt. Bis auf eine Registerseite funktioniert diese Festlegung auch einwandfrei, die Steuerelemente werden mittels Tab-Taste in genau der festgelegten Reihenfolge angesteuert. Nur in einem Registerelement lässt sich die Reihenfolge nicht individuell festlegen. Access vergibt hier die Reihenfolge willkürlich und auch nicht immer gleich. Entweder wird die Reihenfolge schon während des Versuchs, diese festzulegen geändert, spätestens jedoch nach erneutem Aufruf des Formulars ist die Reihenfolge wieder komplett durcheinander.
ANTWORT: Zum besseren Verständnis des Problems ist es zunächst notwendig, die interne Funktionsweise von Registersteuerelementen zu erklären: Jede Registerkarte ist nicht etwa ein eigenes Container-Element, das nur die Steuerelemente einer einzelnen Seite aufnimmt, sondern es gibt lediglich ein gemeinsames Container-Element, in das alle Steuerelemente eingefügt werden. Je nach aktivierter Registerkarte blendet Access die jeweils nicht benötigten Steuerelemente aus, indem es die Eigenschaft "Left" auf einen negativen Wert oder auf einen so großen Wert setzt, dass das Steuerelemente rechts außerhalb des Registersteuerelementes liegt.
Die jeweils ausgeblendeten Steuerelemente muss Access aus der Tabulatorreihenfolge ausschließen und beim Einblenden wieder in die Tabulatorreihenfolge einfügen. Dabei, insbesondere wenn dann noch einzelne Steuerelemente aus der Tabulatorreihenfolge ausgeschlossen sind, gerät Access aufgrund eines Bugs durcheinander, so dass sich bestenfalls eine willkürliche Tabulatorreihenfolge ergibt, schlimmstenfalls kann es auch passieren, dass einzelne Steuerelemente nicht mehr angezeigt werden, weil deren Eigenschaft "Left" nicht korrekt angepasst wurde. Um das Problem zu lösen, müssen Sie entweder im "Lost_Focus"-Ereignis der einzelnen Steuerelemente eine "SetFocus"-Anweisung verwenden, um explizit auf das nächste gewünschte Steuerelement zu positionieren oder Sie ersetzen das Registersteuerelement von Access durch das MultiPage-Objekt von Microsoft Forms, das diesbezüglich zuverlässiger arbeitet. Sie können es über "Einfügen-ActiveX-Steuerelement" in ein Formular einfügen.
Textfeld komplett markieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Ich habe in einem Formular eine Suchfunktion entwickelt. Im Formularkopf habe ich ein Textfeld. In diesem Textfeld gebe ich einen beliebigen Begriff ein und erhalte eine gefilterte Auswahl. Bei dem Textfeld habe ich folgenden Code in der Ereignisprozedur "Nach Aktualisierung" eingegeben:
Dim strEingabe As String
Dim strFilter As String
If IsNull(Me.Text39) Or IsEmpty(Me.Text39) = True Then
strEingabe = ""
Else
strEingabe = "*" & Me.Text39 & "*"
End If
If strEingabe = "" Then
Me.Filter = ""
Me.FilterOn = False
Exit Sub
End If
strFilter = "[Ausdr1] like '" & strEingabe & "'"
Me.Filter = strFilter
Me.FilterOn = True
Nun funktioniert alles perfekt, jedoch setzt mir Access die Markierung im Textfeld an den Anfang. Wenn keine Daten gefunden werden, wird der Suchtext im Textfeld komplett markiert und wenn Daten gefunden werden, setzt Access die Markierung an den Anfang. Wie kann ich dieses Verhalten abstellen, so dass immer nach der Suche das gesamte Textfeld markiert ist?
Fügen Sie zwischen dem ersten und dem zweiten "If"-Block folgende Anweisungen ein:
With Me.Text39
.SelStart = 0
.SelLength = 999
.SetFocus
End With
Diese Anweisungen sorgen dafür, dass immer der komplette Inhalt des Textfeldes markiert ist.
Textfelder im Endlosformular individuell formatieren
Versionen: Access 2003, 2002/XP und 2000
FRAGE: Ich möchte in einem Formular, das auf einer Abfrage basiert, die Eigenschaften der Textfelder individuell nach Inhalt steuern. Sobald das Textfeld eines Datensatzes einen gewissen Wert hat, möchte ich z.B. die Hintergrundfarbe ändern. Und zwar natürlich nur bei dem Textfeld dieses Datensatzes. Irgendwie müssen diese Objekte im Formular doch indexiert sein. Wie spricht man denn diesen Index an?
ANTWORT: In einem Endlosformular geht das leider nicht. Technisch gesehen gibt es im Detailbereich nur eine Textfeldreihe, die von Access für die Anzeige dupliziert und mit den Werten gemäß aktuellem Datensatz gefüllt wird. Die einzige Möglichkeit, einzelne Felder individuell zu formatieren besteht in der bedingten Formatierung, die Sie im Entwurfsmodus bei markiertem Feld über das Menü Format-Bedingte Formatierung abrufen können.
Hier lassen sich bis zu drei Bedingungen und Formatierungen definieren, so dass Sie beispielsweise ein Feld "Kundenumsatz" bei Umsätzen kleiner 5.000 Euro "Fett/Rot", bei Umsätzen zwischen 5.000 und 10.000 Euro "Fett/Gelb" und bei Umsätzen größer 10.000 Euro "Fett/Grün" anzeigen lassen können.
Umschaltbare Unterformulare nutzen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Möchte ein Literaturverwaltungssystem erstellen und bin auf folgendes Problem gestoßen: Ich habe eine Tabelle, die Informationen zu Tagungsbänden speichert und eine Tabelle mit Buchtiteln. Aus Gründen der Datenbanknormalisierung sind es getrennte Tabellen, die ich aber in einer Tabelle "Exemplare" wieder zusammengeführt habe. Die Exemplare sollen ausgeliehen werden. Meine Frage ist nun, ob es möglich ist, aus dem Hauptformular, je nachdem ob ein Buchtitel oder Tagungsband ausgewählt wird das dazugehörige Unterformular im selben Unterformular-Steuerelement anzuzeigen (während der Laufzeit anpassen). Zum jeweiligen Exemplar würde ich gerne in einem Unter-Unterformular die Ausleihe anzeigen. Ist eine Synchronisation aus dem Unterformular möglich, wenn sich das Unterformular während der Laufzeit ändert? Gibt es dafür eine Lösung?
ANTWORT: Sie können sowohl das anzuzeigende Unterformular als auch die Verknüpfungsfelder per VBA einstellen. Das Unterformular verfügt zunächst über die Eigenschaft "SourceObject" (Herkunftsobjekt), die das anzuzeigende Formular spezifiziert und kann durch einfache Zuweisung zum Beispiel wie folgt geändert werden:
Me.UFName.SourceObject = "Unterformular Details"
Me.UFName.SourceObject = "Unterformular Ausleihe"
"UFName" ist dabei durch den Namen des betreffenden Unterformulars zu ersetzen. Weiterhin stellt ein Unterformular die Eigenschaften "LinkChildFields" (Verknüpfen von) und "LinkMasterFields" (Verknüpfen nach) für die Verknüpfung von Haupt- und Unterformular bereit. Ihre Bücher werden Sie vermutlich nach ISBN-Nummern verwalten, so dass das betreffende Verknüpfungsfeld für die beiden umzuschaltenden Unterformulare identisch ist. Andernfalls müssten mit entsprechenden Zuweisungen die Felder beispielsweise wie folgt spezifiziert werden:
Me.UFName.LinkChildFields = "Verknüpfungsfeld UFo"
Me.UFName.LinkMasterFields = " Verknüpfungsfeld HFo"
Werte für Felder in ungebundenen Formularen zwischenspeichern
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Nehmen wir an, dass Sie eine Abfrage über ein ungebundenes Formular starten und dazu in einem Feld ein Kriterium eingeben, das von der Abfrage übernommen wird. Nach dem Schließen und erneutem Öffnen der Datenbank ist dieser Wert nicht mehr vorhanden und muss neu eingegeben werden. Sie können sich helfen, indem Sie doch eine Tabelle speziell für die Speicherung der erstellen:
1. Legen Sie eine Tabelle an, die nur ein Text- oder Datumsfeld "fldParameter" umfasst.
2. Ordnen Sie diese Tabelle dem Formular als Datenbasis zu.
3. Verbinden Sie das im Formular vorhandene Feld über die Eigenschaft Steuerelementeinhalt? mit dem Feld "fldParameter" der Tabelle.
Wenn Sie jetzt etwas im Feld eingeben, wird es in der Tabelle gespeichert. Rufen Sie das Formular das nächste Mal auf, wird der zuletzt eingegebene Wert/das zuletzt eingegebene Datum wieder im Formular angezeigt.
Alternativ können Sie die Registry nutzen, um den Feldinhalt zwischenzuspeichern. Ergänzen Sie dazu die Ereignisprozedur "Beim Schließen" des Formulars um folgende Anweisung:
SaveSetting "MeineDatenbank", _
"MeinFormular", _
"LetzterInhalt", _
Me.Feldname
"MeineDatenbank" und "MeinFormular" spezifizieren einen Programm- und einen Anwendungs-Abschnitt in der Registry unter "HKCU\Software\Visual Basic and VBA Program Settings". Mit "LetzterInhalt" wird ein Schlüssel angegeben, in dem der Feldinhalt gemäß "Me.Feldname" festgehalten wird. "Feldname" ersetzen Sie durch den Namen des Feldes in Ihrem Formular. Die Ereignisprozedur "Beim Laden" des Formulars erweitern Sie um folgende Anweisung:
Me.Feldname = GetSetting("MeineDatenbank", _
"MeinFormular", _
"LetzterInhalt", "")
Diese Anweisung liest den zuletzt gespeicherten Feldinhalt wieder aus der Registry aus und weist ihn dem Feld im Formular zu. "Feldname" ersetzen Sie wieder durch den Namen des Feldes in Ihrem Formular.
Wichtige Eingabefelder auffällig hervorheben
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Für die Erfassung von Daten in Formularen können Sie zwar plausible Standardwerte vorgeben, aber trotzdem ist es in vielen Fällen notwendig, dass der Anwender zum Beispiel bei der Aufnahme einer Bestellung die mit "Postpaket" vorgegebene Versandart prüft, ggf. beim Kunden rückfragt und die Einstellung entsprechend ändert. In der Regel formatieren Sie dann beispielsweise das Bezeichnungsfeld eines Steuerelementes in einer auffälligen Farbe (gelbe Schrift auf rotem Hintergrund) oder verwenden ein Bild-Steuerelement mit einem Symbol "Ausrufezeichen", um die Aufmerksamkeit des Anwenders auf die betreffende Einstellung zu lenken. Eine weitere Möglichkeit, auf eine wichtige Einstellung oder Eingabe aufmerksam zu machen, besteht darin, zum Beispiel den Rahmen eines Steuerelementes mit einem auffälligen Farbwechsel blinken zu lassen. Dank des Timers in Formularen lässt sich mit wenig Aufwand realisieren.
Am Beispiel der Optionsgruppe "Versand per" im Formular "Bestellungen" der Beispieldatenbank "Nordwind" sieht das folgendermaßen aus:
* Öffnen Sie das Formular im Entwurfsmodus.
* Doppelklicken Sie irgendwo im freien Bereich unter dem Formular, um dessen Eigenschaftenfenster anzuzeigen.
* Geben Sie für die Eigenschaft "Zeitgeberintervall" den Wert "500" ein.
* Stellen Sie die Eigenschaft "Bei Zeitgeber" auf den Eintrag "[Ereignisprozedur]" ein.
"Zeitgeberintervall" wird in Millisekunden angegeben, so dass bei einem Wert von "500" der Aufruf der Ereignisprozedur "Bei Zeitgeber" alle 0,5 Sekunden erfolgt. Soll das Blinken etwas "hektischer" erfolgen, geben Sie als Wert beispielsweise "400" oder "300" ein und verkürzen somit die Pause zwischen dem Umschalten der Farbe.
* Klicken Sie auf die Schaltfläche mit den drei Punkten hinter der Eigenschaft "Bei Zeitgeber", um den VBA-Editor zu öffnen.
* Geben Sie hier folgende Anweisungen ein:
Sub Form_Timer ()
If Me.VersandÜber.BorderColor = QBColor(8) Then
Me.VersandÜber.BorderColor = QBColor(12)
Else
Me.VersandÜber.BorderColor = QBColor(8)
End If
End Sub
Wenn Sie das Formular nun anzeigen lassen, wird der Rahmen der Optionsgruppe abwechselnd in Dunkelgrau und Rot angezeigt, macht also durch sein Blinken auf die wichtige Einstellung aufmerksam.
Und so funktioniert die Lösung: Die Timer-Routine prüft im eingestellten Abstand die aktuelle Farbe des Rahmens der Optionsgruppe. Ist sie "Dunkelgrau", wird auf "Rot" umgeschaltet, ist sie "Rot", wird wieder zurück auf "Dunkelgrau" geschaltet. Dadurch ergibt sich ein entsprechender Blinkeffekt.
Um bei der Zuweisung der Farbe nicht mit kryptischen RGB-Werten hantieren zu müssen, nutzen wir die Funktion "QBColor()", die anhand des als Parameter übergebenen Wertes einen der folgenden RGB-Farbwerte für die einfachere Zuweisung liefert:
Wert Farbe
-------------
0 Schwarz
1 Blau
2 Grün
3 Cyan
4 Rot
5 Magenta
6 Gelb
7 Grau/Hell
8 Grau/Dunkel
9 Blau/Hell
10 Grün/Hell
11 Cyan/Hell
12 Rot/Hell
13 Magenta/Hell
14 Gelb
15 Weiß
Diese Technik können Sie für alle Steuerelemente einsetzen, die über eine Eigenschaft "BorderColor" verfügen. Das sind neben Optionsgruppen die Steuerelemente Textfeld, Bezeichnungsfeld, Liste, Kombinationsfeld und Kontrollkästchen.
Nun kann ein solches Blinken bei längerer Verweildauer im Formular den Anwender ein wenig nerven oder ablenken. Um den Rahmen nur fünf Mal blinken zu lassen, ändern Sie die Ereignisprozedur "Bei Zeitgeber" wie folgt:
Private Sub Form_Timer()
Static bCnt As Byte
bCnt = bCnt + 1
If bCnt > 10 Then
Me.VersandÜber.BorderColor = QBColor(8)
Me.TimerInterval = 0
Exit Sub
End If
If Me.VersandÜber.BorderColor = QBColor(8) Then
Me.VersandÜber.BorderColor = QBColor(12)
Else
Me.VersandÜber.BorderColor = QBColor(8)
End If
End Sub
Die Anweisung "Static bCnt As Byte" deklariert zunächst eine Variable, die zwischen den Aufrufen der Prozedur ihren Inhalt behält und somit als Zähler verwendet werden kann. Bei eine "normalen" Deklaration per "Dim" wäre das nicht möglich, da solche Variablen mit dem Beenden der Prozedur ihre Gültigkeit und somit ihren Inhalt verlieren. Der Zähler "bCnt" wird bei jedem Aufruf hochgezählt. Überschreitet er den Wert "10", hat der Rahmen des Steuerelementes fünf Mal geblinkt - der Zeitgeber wird dann per "Timerintervall = 0" deaktiviert, die Rahmenfarbe auf den Standard zurückgesetzt und die Routine verlassen. Andernfalls erfolgt die oben erläuterte Umschaltung der Rahmenfarbe.
Abbruchpunkt bleibt aktiv
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Während der Entwicklung hatte ich verschiedene Abbuchpunkte (Breakpoints) in einem Modul gesetzt und nach Abschluss des Debuggings wieder gelöscht. Beim Öffnen der Datenbank springt Access aber immer noch in den Debuggingmodus und bleibt in einer Zeile stehen, für die früher einmal ein Breakpoint gesetzt war, für die jetzt aber definitiv kein Breakpoint mehr gesetzt ist.
ANTWORT: Das Problem tritt auf, wenn man die Breakpoints nicht einzeln markiert und löscht, sondern sie gemeinsam per Strg+Umschalt+F9 bzw. Debuggen-Alle Haltepunkte löschen entfernt.
Um das Problem zu lösen, gehen Sie folgendermaßen vor:
1. Öffnen Sie das Office-Installationsverzeichnis, also zum Beispiel "C:\Programme\Microsoft Office\Office12" bei Office 2007.
2. Klicken Sie mit der rechten Mautaste auf "msaccess.exe" und wählen Sie Kopieren im Kontextmenü an.
3. Klicken Sie mit der rechten Maustaste auf den Desktop und wählen Sie Einfügen im Kontextmenü an.
4. Klicken Sie mit der rechten Maustaste auf die Verknüpfung und wählen Sie Eigenschaften im Kontextmenü an.
5. Ergänzen Sie die Angaben im Feld Ziel im folgenden Zusatz:
/decompile "X:\Pfad\Datenbank.mdb"
Der gesamte Inhalt sollte dann zum Beispiel so aussehen:
"C:\Programme\Microsoft Office\Office 12\msaccess.exe" /decompile "X:\Pfad\Datenbank.mdb"
Öffne Sie die Verknüpfung per Doppelklick. Access lädt nun die Datenbank, dekompiliert die VBA-Projekte und kompiliert sie einmal komplett neu. Anschließend tritt das oben erwähnte Problem nicht mehr auf.
Access 2000-Datenbank lässt sich nur einmal starten
Versionen: Access 2003, 2002/XP, 2000 und 97
Ich habe ein ganz merkwürdiges Phänomen mit einer Access 2000-Datenbank, die in Front- und Back-End aufgeteilt ist. Um Updates einfacher zu verteilen, liegt eine Kopie des Front-Ends auf dem Server, die nach evtl. Aktualisierungen auf die einzelnen Arbeitsstationen lokal kopiert wird. Sie wird von 3 Rechnern genutzt, wobei 2 ganz normal arbeiten können. Auf dem dritten Rechner hingegen startet das Front-End nur, wenn ich es vorher neu auf die lokale Platte kopiert habe. Versuche ich das Front-End mehrmals nacheinander zu starten, erscheint eine Fehlermeldung, dass entweder die Ereignisprozedur nicht gefunden wurde oder auf ein ungültiges Makro verwiesen wird.
Wir vermuten, dass hier ein Virenscanner oder eine Security Suite ihre Finger im Spiel hat. Viele dieser Tools sind so einstellbar, dass sie VBA-Projekte zum Schutz vor Makroviren blockieren. Wenn Sie die Datenbank neu auf den Rechner kopieren und starten, wird dies eventuell zunächst nur als "Neue Datei angelegt" erkannt oder der Blockier-Mechanismus greift beim ersten Start noch nicht, weil die Datei noch nicht als Anwendung mit VBA-Projekt registriert wurde. Schalten Sie einmal testweise alle im Hintergrund laufenden Tools auf dem betreffenden Rechner aus oder prüfen Sie sie bezüglich solcher VBA-Blockier-Mechanismen und deaktivieren Sie diese.
Access 2007: Navigationsbereich im Griff
Versionen: Access 2007
Unterhält man sich einmal mit Anwendern und Entwicklern über ihre Erfahrungen beim Umstieg auf Access 2007, ergeben sich viele Probleme aus dem neuen Navigationsbereich für den Zugriff auf die Datenbank-Objekte. Dessen Standardeinstellungen sind so gewählt, dass nicht direkt auf Objekte, sondern über Kategorien und Verknüpfungen (in etwa vergleichbar mit den ab Access 2000 verfügbaren Gruppen und Favoriten) auf Objekte zugegriffen wird und man deshalb kaum etwas wiederfindet.
Dieses Problem lässt sich schnell lösen, indem Sie folgende Einstellung ändern:
1. Klicken Sie mit der linken Maustaste auf die Titelleiste des Navigationsbereiches und aktivieren Sie im oberen Bereich "Navigieren zur Kategorie" die Einstellung Objekttyp.
2. Klicken Sie nochmals mit der linken Maustaste auf die Titelleiste des Navigationsbereiches und aktivieren Sie im unteren Bereich "Nach Gruppe filtern" die Einstellung Alle Accessobjekte.
Im Navigationsbereich werden nun ähnlich wie im Datenbankfenster die Abschnitte "Tabellen", "Abfragen", "Formulare" usw. angezeigt. Mit einem Klick auf die blauen Titel der Abschnitte öffnen oder schließen Sie die Abschnitte und sehen darin die jeweiligen Objekte.
Nachdem Sie einige Zeit mit diesem Modus gearbeitet haben, wird deutlich, dass vor allem bei umfangreichen Datenbanken durch die einspaltige, rein vertikale Darstellung schnell die Übersicht verloren geht. Sie verbringen unnötig viel Zeit damit, im Navigationsbereich zu scrollen, um den einen oder anderen Abschnitt und die darin enthaltenen Objekte zu finden. Sie können den Zugriff vereinfachen, indem Sie folgende Tipps zum Schließen aller Abschnitte und zum Ausblenden nicht benötigte Abschnitte nutzen:
Klicken Sie mit der rechten Maustaste auf den blauen Titel eines Abschnittes und wählen Sie Alle Ebenen reduzieren im Kontextmenü an. Es werden jetzt nur die blauen Titel der einzelnen Abschnitte angezeigt und Sie können gezielt einen Abschnitt wie "Abfragen" oder "Berichte" öffnen.
Nicht benötigte Abschnitte ausblenden: Wenn Sie hauptsächlich mit der Datenbank arbeiten, also keine Entwicklungs- und Entwurfsfunktionen nutzen, wechseln Sie meist nur zwischen Formularen und Berichten und rufen eventuell einmal ein Makro auf. Der Zugriff auf andere Objekte erfolgt eher selten, so dass diese Objekte ausgeblendet werden können. Klicken Sie dazu mit der rechten Maustaste auf die Titelleiste des Navigationsbereiches und wählen Sie Navigationsoptionen im Kontextmenü an. Aktivieren Sie im dann folgenden Dialog links die Kategorie "Objekttyp" und deaktivieren Sie rechts die Objekte, die nicht angezeigt werden sollen, also beispielsweise "Tabellen", "Abfragen" und "Module". Nach einem Klick auf Ok präsentiert sich Ihnen dann ein wesentlich aufgeräumterer Navigationsbereich.
Noch mehr Übersicht erhalten Sie, wenn Sie zusätzlich nicht benötigte Objekte im Navigationsbereich ausblenden: Wie im Datenbankfenster gewohnt, können Sie auch im Navigationsbereich in den einzelnen Abschnitten einzelne nicht verwendete Objekte ausblenden, indem Sie das Objekt mit der rechten Maustaste anklicken, Ansichteigenschaften anwählen und die Option Ausgeblendet aktivieren. Um Objekte wieder einzublenden, aktivieren Sie in den Navigationsoptionen (Rechtsklick auf Titelleiste des Navigationsbereiches) im Bereich "Anzeigeoptionen" die Option Ausgeblendete Objekte anzeigen. Anschließend können Sie dann per Rechtsklick-Eigenschaften die Option Ausgeblendet wieder zurücksetzen.
Im Datenbankfenster haben Sie eventuell die Darstellung "Details" verwendet, um Zusatzinformationen wie Erstellungs-/Änderungsdatum und Objektbeschreibung angezeigt zu bekommen. Diese Ansicht können Sie auch für den Navigationsbereich aktivieren, indem Sie mit der rechten Maustaste auf die Titelleiste des Navigationsbereiches klicken und Ansicht Nach-Details anwählen.
Durch die Multifunktionsleiste und den Navigationsbereich steht im Vergleich zu früheren Access-Versionen weitaus weniger Platz für die Anzeige von Datenbankobjekten zur Verfügung. Mehr Platz im Arbeitsbereich erhalten Sie wie folgt: Klicken Sie mit der rechten Maustaste in die Multifunktionsleiste und wählen Sie Multifunktionsleiste minimieren im Kontextmenü an. Es werden jetzt nur noch die Register der Multifunktionsleiste angezeigt. Ein Klick auf eines der Register blendet die Multifunktionsleiste wieder ein, die Aktivierung anderer Elemente blendet sie automatisch wieder aus. Rechts in der Titelleiste des Navigationsbereiches finden Sie ein Symbol "<<", über das sich der Navigationsbereich einklappen lässt. Er wird dann nur noch als schmaler Balken "Navigationsleiste" links am Fensterrand mit einem Symbol ">>" als Titel anzeigt. Ein Klick darauf - oder auf den blauen Balken - klappt den Navigationsbereich dann wieder aus.
Der Navigationsbereich bietet aber auch einige interessante neue Features: Besonders hilfreich für Entwickler ist die Möglichkeit, Tabellen und die damit verbundenen oder davon abhängigen Abfragen, Formulare und Berichte auflisten zu lassen. Klicken Sie dazu mit der linken Maustaste auf die Titelleiste des Navigationsbereiches und wählen Sie den Eintrag Tabellen und damit verbundene Sichten an. Sie können nun mit einem Blick erkennen, welche Tabellen mit welchen Abfragen, Formularen oder Berichten verwendet werden. Diese Ansicht ist bei "Aufräumarbeiten" nach Abschluss der Entwicklung besonders hilfreich, um nicht verwendete Tabellen zu finden oder um zu vermeiden, dass vermeintlich nicht verwendete Tabellen irrtümlich gelöscht werden.
Vor allem für den Einsatz Ihrer Datenbanken bei weniger erfahrenen Anwendern haben Sie in früheren Versionen Favoriten, Gruppen und Verknüpfungen genutzt. Favoriten gibt es bei Access 2007 nicht mehr, die Verwaltung von Kategorien und Gruppen finden Sie in den Navigationsoptionen (Rechtsklick auf Titelleiste des Navigationsbereiches, Navigationsoptionen). Hier können Sie nun "Elemente" (entspricht den bekannten "Kategorien") wie zum Beispiel "Datenerfassung" oder "Auswertungen" und pro Kategorie beliebig viele Gruppen wie beispielsweise "Kunden" und "Aufträge" in der Kategorie "Datenerfassung" oder "Quartalsberichte" und "Umsatzübersichten" in "Auswertungen" organisieren. Kategorien und Gruppen lassen sich bei Bedarf über Kontrollkästchen einzeln aktivieren oder deaktivieren. Die Umschaltung der Kategorie erfolgt per Linksklick auf die Titelleiste des Navigationsbereiches, in dem dann anschließend die definierten Gruppen der jeweiligen Kategorie zuzüglich einer Gruppe "Nicht zugewiesene Objekte" angezeigt werden. Per Rechtsklick auf ein Objekt und Anwahl von Zur Gruppe hinzufügen können Sie die Objekte dann wie erforderlich zuordnen.
Access-Abstürze vermeiden
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: In unserer Firma nutzen wir mehre Datenbanken, die mit Access 2002/XP entwickelt wurden. Diese sind in Front- und Back-End aufgeteilt und jeder Benutzer hat sein eigenes Front-End. Es kommt relativ häufig vor (besonders beim 2. Start der Datenbanken), dass die Datenbank einen Laufzeitfehler anzeigt und nicht geöffnet werden kann. Abhilfe schafft nur ein Beenden der Task bzw. der Prozesse (MSACCESS.EXE) über den Task-Manager oder ein nerviger Neustart des Rechners. Wie kann man diese leidigen Prozeduren umgehen und Abhilfe schaffen?
ANTWORT: Ohne genaue Fehlermeldung lässt sich das Problem nicht direkt einkreisen - die Ursache kann eine VBA-Prozedur oder ein Add-In sein. Sie können zunächst einmal versuchen, die Datenbank mehrmals mit gedrückter Umschalt-Taste zu öffnen. Dabei wird unter anderem die Ausführung von Start-Routinen unterbunden. Tritt das Problem nicht mehr auf, liegt die Ursache irgendwo im VBA-Bereich, den sich dann einmal ein VBA-Spezialist bezüglich der Fehlermeldung anschauen müsste. Eine weitere Ursache kann ein unsauber geschriebenes Add-In sein. Um das einzukreisen, deaktivieren Sie unter Extras-Add-Ins-Add-In-Manager erst einmal alle Add-Ins. Starten Sie die Datenbank dann mehrmals hintereinander. Tritt das Problem nicht mehr auf, aktivieren Sie die Add-Ins der Reihe nach und starten die Datenbank wiederum mehrmals. Tritt das Problem irgendwann wieder auf, ist das zuletzt aktivierte Add-In die Ursache. Sie müssten dann einmal mit dem Anbieter des Add-Ins in Kontakt treten und um eine Problemlösung bitten.
AutoKorrektur für ein einzelnes Steuerelement ausschalten
Versionen: Access 2007, 2003, 2002/XP und 2000
In den meisten Fällen sind Sie für die kleinen Korrekturen dankbar, die Access über die AutoKorrektur bei der Dateneingabe vornimmt. Aus "dre" wird beispielsweise "der" und "Herrn MÜller" ändert Access automatisch wieder in "Herrn Müller".
In Access 2003, 2002/XP, 2000 und 97 können Sie über das Dialogfeld Extras-AutoKorrektur diese Funktion generell ausschalten. In Access 2007 finden Sie das Dialogfeld über Office-Access-Optionen-Dokumentprüfung-AutoKorrektur-Optionen.
Wenig bekannt ist die Tatsache, dass Sie die AutoKorrektur bei Bedarf auch ganz gezielt für einzelne Felder deaktivieren können? Wechseln Sie dazu in den Entwurfsmodus des entsprechenden Formulars, klicken Sie das gewünschte Feld an und blenden Sie das Eigenschaftenfenster ein. Setzen Sie dann die Eigenschaft "AutoKOrrektur zulassen" auf "Nein" und in Zukunft wird die AutoKorrektur nicht mehr bei Eingaben in dieses Feld eingreifen.
AutoWert wird durch Reparatur zurückgesetzt
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Nach einer Reparatur einer Datenbank sind die AutoWert-Felder einiger Tabellen plötzlich auf Datentyp "Long" eingestellt. Wie kann ich wieder mit AutoWerten arbeiten?
ANTWORT: Wenn bei der Reparatur Probleme mit den AutoWert-Feldern auftreten, ändert Access den Datentyp in "Long", um die vorhandenen Werte und Feldinhalte der Datensätze erhalten zu können. Um wieder mit AutoWert-Felder zu arbeiten, kopieren Sie zunächst die Tabelle mit Strg+C, geben als Namen beim Einfügen mit Strg+V zum Beispiel "Tabelle/Neu" an und wählen die Option "Nur Struktur". Anschließend ändern Sie den Datentyp der Felder der kopierten Tabelle von "Long" auf "AutoWert". Erstellen Sie dann eine Anfügeabfrage mit der ursprünglichen Tabelle als Quelle und der kopierten Tabelle als Ziel. Nach Ausführung der Abfrage benennen Sie die ursprüngliche Tabelle zum Beispiel in "Tabelle/Alt" und die kopierte Tabelle in den ursprünglichen Namen um.
Datenbank automatisch schließen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich möchte eine Access-Anwendung nach 3 Minuten automatisch beenden. Wenn etwas im Formular eingegeben wird, soll der Countdown wieder von neuem beginnen. Wie baut man eine solche Lösung auf?
ANTWORT: Zunächst einmal reicht es nicht, nur Eingaben in Textfelder zu berücksichtigen, es müssen auch Sondertasten wie Tab-, Return und Cursor-Tasten sowie Mausbewegungen eingeschlossen werden. Gehen Sie folgendermaßen vor:
* Deklarieren Sie zunächst im allgemeinen Teil des Formulars eine globale Variable "TimeoutFlag"
Dim TimeoutFlag As Integer
* Kopieren Sie dann die folgende Funktion in das Formularmodul:
Function TimeOut ()
TimeoutFlag = 1
End Function
* Diese Funktion ordnen Sie nun allen Steuerelementen in den Eigenschaften "Bei Taste" und "Bei Mausbewegung" zu. Markieren Sie dazu alle Steuerelemente gemeinsam und wählen Sie dann das Menü Ansicht-Eigenschaften an bzw. drücken Sie F4. Im Eigenschaftenfenster können Sie dann die Ereignisprozeduren für alle Steuerelemente gemeinsam setzen, indem Sie hier jeweils "=TimeOut()" eingeben.
* Öffnen Sie anschließend das Eigenschaftenfenster für das Formular, indem Sie einen Doppelklick in den grauen Bereich unter dem Detailbereich ausführen. Die Eigenschaft "Tastenvorschau" stellen Sie auf "Ja" ein und tragen dann in den Eigenschaften "Bei Taste" und "Bei Mausbewegung" ebenfalls "=TimeOut()" ein.
* Danach markieren Sie der Reihe nach Seiten-/Formular-Kopf und -Fuß sowie den Detailbereich und stellen hier die Eigenschaft "Bei Mausbewegung" ebenfalls auf "=TimeOut()" ein.
Hierdurch ist nun sichergestellt, dass alle Anwender-Aktionen entdeckt und über die Funktion "TimeOut() in der globalen Variablen "TimeoutFlag" festgehalten werden. Nun muss noch der Timer für die Abfrage eingerichtet werden:
1. Stellen Sie die Eigenschaft "Zeitgeberintervall" des Formulars auf "180000" - der Timer "tickt" in Millisekunden, so dass der Wer "1.000" einer Sekunde und "3*60*1000=180000" drei Minuten entspricht. Dies hat zur Folge, dass die Ereignisprozedur des Timers nun alle drei Minuten aufgerufen wird.
2. Stellen Sie die Eigenschaft "Bei Zeitgeber" auf "Ereignisprozedur" ein und klicken Sie auf die Schaltfläche mit den drei Punkten, um den VBA-Editor zu starten. Kopieren Sie nun folgende Anweisungen in den VBA-Editor:
If TimeoutFlag = 0 Then
DoCmd.Close acForm, Me.Name, acSaveNo
DoCmd.Quit
End If
TimeoutFlag = 0
Die Ereignisprozedur des Timers prüft hier zuerst, ob die Variable "TimeoutFlag" auf "0" steht. Wenn ja, hat der Anwender drei Minuten lang nichts getan, das Formular wird geschlossen und anschließend Access beendet. Ansonsten wird "TimeoutFlag" zurück auf "0" gesetzt. Bis zum nächsten Aufruf der Ereignisprozedur des Timers vergehen nun 3 Minuten, in denen ggf. eine Aktion erfolgt und "TimeoutFlag" wieder auf "1" gesetzt wird.
Datenbank wahlweise mit oder ohne 'AutoExec' starten
Versionen: Access 2007, 2003, 2002/XP und 2000
In einer Datenbank-Anwendung nehmen Sie oftmals Initialisierungen und die Anzeige von Startobjekten über ein AutoExec-Makro vor und können so beispielsweise für den Einsatz mit weniger erfahrenen Anwendern "gefährliche" Funktionen der Benutzeroberfläche ausblenden und nur das an Bedienelementen zur Verfügung stellen, was der Anwender unbedingt benötigt. Wenn Sie nun etwas an der Datenbank ändern möchten, stehen Ihnen die benötigten Funktionen nicht zur Verfügung und Sie müssen zusätzlichen Code vorsehen, der die komplette Benutzeroberfläche wiederherstellt. Einfacher ist es in solchen Fällen, die Datenbank über eine Verknüpfung mit einem speziellen Parameter zu starten, der dafür sorgt, das "AutoExec" nicht ausgeführt wird:
* Legen Sie eine Verknüpfung auf die Datenbank an und ändern Sie die Angaben im Feld Ziel wie folgt:
"C:\Programme\Microsoft Office\Office\msaccess.exe"
"D:\Datenbank.mdb" /cmd noae
Der Parameter "/cmd" übergibt an die VBA-Umgebung eine Zeichenkette (hier "noae" für "No AutoExec"), die Sie normalerweise zum Beispiel mit "If Command$ = "noae" Then..." in einer VBA-Routine abfragen können.
* Ergänzen Sie Ihr AutoExec-Makro am Anfang um folgende Aktion:
Bedingung: Befehl()="noae"
Aktion: StoppMakro
"Befehl()" wird je nach Access-Version eventuell auf "Command()" umgesetzt!
* Speichern Sie die Änderungen und verlassen Sie die Datenbank wieder.
Wenn Sie die Datenbank nun "normal" per Doppelklick starten, bleibt alles beim Alten. Beim Start über die Verknüpfung wertet "AutoExec" als erstes die Bedingung aus - wird dabei "noae" als Parameter erkannt, stoppt Access die weitere Ausführung des Makros und es stehen alle Funktionen in der Datenbank zur Verfügung.
Datenbank-Komprimierung in Access 2007
Versionen: Access 2007
FRAGE: Eine Access 2002-Datenbank mit aktivierter Option beim Schließen komprimieren wird im Kompatibilitätsmodus unter Access 2007 eingesetzt. Leider hängt sich Access beim Schließen und somit beim Komprimieren der Datenbank auf. Wo kann ich in Access 2007 die Option beim Schließen komprimieren einstellen? Und wo findet man den Aufruf von "Datenbank komprimieren" für die manuelle Komprimierung?
ANTWORT: Die Funktion "Reparieren und komprimieren" finden Sie in Access 2007 unter der Office-Schaltfläche und dort unter dem Eintrag Verwalten. Um die Option beim Schließen komprimieren einzustellen, öffnen Sie die Access-Optionen unter der Office-Schaltfläche und wechseln in den Bereich "Aktuelle Datenbank". Hier finden Sie die Option beim Schließen komprimieren im Abschnitt "Anwendungsoptionen".
Datenbanken schneller wechseln oder anlegen
Versionen: Access 2007
Sie bearbeiten täglich viele verschiedene Datenbanken oder legen regelmäßig neue Datenbanken an und sind es leid, bei jedem Wechsel über die Office-Schaltfläche eine neue Datenbank auswählen oder dort vor einer Neuanlage erst einmal auf Schließen klicken zu müssen?
Dann nehmen Sie die Funktion "Schließen" doch einfach in die Symbolleiste "Schnellzugriff" auf: Klicken Sie auf die Office-Schaltfläche, dann mit der rechten Maustaste auf das Schließen-Symbol und wählen Sie Zur Symbolleiste Für Den Schnellzugriff Hinzufügen an. In Zukunft können Sie nach der Bearbeitung einer Datenbank auf dieses Symbol klicken. Access wechselt daraufhin in den Arbeitsbereich "Erste Schritte". Hier können Sie nun entweder unter "Zuletzt verwendete Datenbanken öffnen" eine Ihrer regelmäßig bearbeiteten Datenbanken abrufen oder über die Vorlagen direkt eine neue Datenbank anlegen.
Datenbanken zeitgesteuert komprimieren
Versionen: Access 2003, 2002/XP, 2000 und 97
Die regelmäßige Komprimierung von Datenbanken ist, insbesondere wenn mehrere Anwender gleichzeitig mit einer Datenbank arbeiten, sozusagen überlebenswichtig für die Datenbank. Ohne regelmäßige Komprimierung stellen sich früher oder später Inkonsistenzen ein, in deren Folge Datensätze nicht mehr gelesen oder Objekte nicht mehr geöffnet werden können. Bis einschließlich Access 97 musste die Komprimierung manuell (Menü Extras-Datenbank-Dienstprogramme-Datenbank komprimieren) veranlasst werden, ab Access 2000 kann unter Extras-Optionen, Registerkarte "Allgemein", die Option Beim Schließen komprimieren aktiviert und der Vorgang so automatisiert werden. Dies führt allerdings dazu, dass vor allem bei umfangreicheren Datenbanken das Beenden von Access oder der Wechsel zu einer anderen Datenbank mit einer spürbaren Verzögerung von ein paar Sekunden bis hin zu ein, zwei Minuten erfolgt. Da in einem Unternehmen immer irgendwo auch nachts ein Rechner läuft und die Datenbanken übers Netzwerk zu erreichen sind, bietet es sich an, einen solchen Rechner die Komprimierungsarbeiten nachts ausführen zu lassen, so dass die Option Beim Schließen komprimieren wieder deaktiviert und die Arbeit mit Access entsprechend beschleunigt werden kann. Darüber hinaus kommen so auch Access 97-Datenbanken in den Genuss einer zuverlässigen, regelmäßigen Komprimierung, denn den manuellen Aufruf der Funktion Datenbank komprimieren nimmt man erfahrungsgemäß erst dann vor, wenn es bereits Probleme mit der Datenbank gibt.
Wenn also ein Rechner verfügbar ist, der auch nachts läuft oder Sie Ihren Rechner generell durchlaufen lassen, können Sie die Komprimierung Ihrer Datenbanken zeitgesteuert durchführen lassen, indem Sie ein spezielles Feature des Betriebssystems nutzen: In "Geplante Tasks" (ab Windows 2000, vorher "Geplante Vorgänge") können Sie Aufträge eintragen, die regelmäßig oder zu einem bestimmten Zeitpunkt erledigt werden sollen. Ist der Zeitpunkt erreicht, startet Windows automatisch die eingetragene Anwendung und übergibt ihr die für den Auftrag spezifizierten Parameter. Einer der Parameter ist Pfad und Dateiname der Datenbank, der andere Parameter ist "/compact" und teilt Access mit, dass die spezifizierte Datenbank nicht geöffnet, sondern komprimiert werden soll.
Einen solchen Auftrag richten Sie wie folgt ein:
* Starten Sie "Geplante Tasks/Geplante Vorgänge" über das Menü Start-Programme-Zubehör-Systemprogramme.
* Doppelklicken Sie auf das Symbol Geplanten Task Hinzufügen. Windows startet nun einen Assistenten, der Sie durch die weitere Einrichtung führt. Bestätigen Sie zunächst die Begrüßung mit einem Klick auf die Schaltfläche Weiter.
* Wenn Sie nur eine Version von Access installiert haben, wählen Sie bei der Auswahl der auszuführenden Anwendung den Eintrag "Access" aus. Sind mehrere Access-Versionen installiert, klicken Sie auf die Schaltfläche Durchsuchen und lokalisieren Sie die für die zu komprimierende Datenbank zu verwendende MSACCESS.EXE im jeweiligen Office-Installationsverzeichnis. Um also zum Beispiel eine Access 2002-Datenbank zu komprimieren, suchen Sie MSACCESS.EXE in "C:\Programme\Microsoft Office\Office10". Klicken Sie dann auf Weiter.
* Geben Sie auf der folgenden Seite des Assistenten als Bezeichnung zum Beispiel "Komprimierung Adress-Datenbank" ein, wählen Sie im Bereich "Task ausführen" die Option Täglich und klicken Sie auf Weiter.
* Auf der dann folgenden Seite des Assistenten legen Sie die gewünschte Ausführungszeit mit beispielsweise Werktags um 22:00 Uhr fest und klicken auf Weiter.
* Sofern notwendig, können Sie auf der nächsten Seite ein spezielles Benutzerkonto für die Ausführung festlegen. Ansonsten geben Sie die Standarddaten Ihrer Anmeldung ein und klicken auf Weiter.
* Auf der letzten Seite des Assistenten aktivieren Sie die Option Erweiterte Eigenschaften für diesen Task beim Klick auf Fertigstellen anzeigen und klicken auf Fertigstellen.
* In den erweiterten Eigenschaften spezifizieren Sie nun die zu übergebenden Parameter, indem Sie das Feld Ausführen beispielsweise wie folgt ergänzen:
"Z:\Test\adresse.mdb" /compact
Pfad/Dateiname passen Sie gemäß der bei Ihnen zu komprimierenden Datenbank entsprechend an.
* Klicken Sie auf Ok, um die Änderungen zu übernehmen.
In Zukunft wird nun zur angegebenen Zeit die automatische Komprimierung Ihrer Datenbank gestartet. Möchten Sie mehrere Datenbanken komprimieren, richten Sie einfach wie oben erläutert weitere Aufträge ein, die Sie dann etwas zeitversetzt zum Beispiel um 22:05, 22:10, 22:15 Uhr ausführen lassen.
Datenbankgröße überwachen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Häufig ist es notwendig, die Größe der aktuellen Datenbank zu überwachen. Bei Erreichen einer bestimmten Größe soll eine Meldung angezeigt werden. Geben Sie dazu zunächst in einem neuen oder in einem vorhandenen Modul die folgende Funktion ein:
Function DBSize() As Long
DBSize = FileLen(CurrentDb.Name)
End Function
Diese Funktion liefert mit Hilfe von "FileLen()" als Ergebnis die Größe der aktuellen Datenbank, adressiert über CurrentDb.Name, in Bytes. Legen Sie dann ein Makro "AutoExec" an bzw. öffnen Sie ein vorhandenes AutoExec-Makro im Entwurfsmodus und blenden Sie die Bedingungen ein. Geben Sie als Bedingung den Ausdruck "DBSize() > 10000000" ein. Richten Sie eine Aktion "Meldung" mit den folgenden Parametern ein:
Meldung: "Datenbank ist größer 10 MB!"
Signalton: Ja
Typ: Warnmeldung (!)
Titel: "Datenbankgröße:"
Bei jedem Öffnen der Datenbank wird nun geprüft, ob diese größer 10.000.000 Bytes (= 10 MB) ist. Ist das der Fall, wird eine entsprechende Meldung angezeigt.
Druckerstatus abfragen
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: Wie kann ich mit Access 2002/XP feststellen ob ein Drucker eingeschaltet ist? Oder wie kann ich mit Access verhindern, dass ein Dokument an einen Drucker gesendet wird, der nicht betriebsbereit ist?
ANTWORT: Eine direkte Abfrage des Status eines Druckers ist mit Access nicht möglich. Sie können aber vor dem Ausdruck eine Sicherheitsabfrage anzeigen und den Anwender so prüfen lassen, ob der Drucker eingeschaltet ist: Ein Bericht verfügt über eine Ereignis-Prozedur "Beim Öffnen" (VBA: Report_Open") in der Sie eine entsprechende Abfrage unterbringen können:
Sub Report_Open (Cancel As Integer)
Dim Taste As Integer
Taste = MsgBox("Ist der Drucker eingeschaltet?", _
vbYesNo + vbQuestion, _
"Bericht '" & Me.Name & "' drucken:")
If Taste = vbNo Then Cancel = True
End Sub
Diese kleine Routine zeigt beim Öffnen eines Berichtes zunächst eine entsprechende Abfrage an. Klickt der Anwender auf Nein, wird die Prozedur-Variable "Cancel" auf "True" gesetzt und Access somit mitgeteilt, dass der Bericht nicht ausgedruckt werden soll. Ansonsten bleibt die Prozedur-Variable auf dem Standard-Wert (False) und der Bericht wird wie gewohnt ausgedruckt.
Falsche Sortierung im Datenbankfenster
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: Nachdem kürzlich ein Kollege an meinem Rechner mit Access gearbeitet hat, werden die Objekte im Datenbankfenster nicht mehr alphabetisch sortiert angezeigt. Laut seiner Aussage hat er an den Einstellungen nichts geändert. Wissen Sie, wie sich die alphabetische Sortierung wieder herstellen lässt?
ANTWORT: Vermutlich hat der Kollege in der Symbolleiste "Datenbank" das Symbol Ansicht-Details angeklickt, dann durch einen Klick auf einen der Spaltenköpfe "Beschreibung", "Bearbeitet", "Erstellt" oder "Typ" eine andere Sortierung gewählt und die Ansicht danach wieder auf "Liste" oder "Symbole" umgestellt, so dass die Objekte hier nun in der unter "Details" festgelegten Sortierung angezeigt werden. Um wieder de alphabetische Sortierung zu aktivieren, schalten Sie die Ansicht einmal auf "Details" um, klicken auf die erste Spalte "Name" und schalten dann wieder zurück auf "Liste" oder "Symbole".
Individuelle Statuszeile anzeigen
Versionen: Access 2007, 2003, 2002/XP und 2000
FRAGE: Ich möchte in meiner Datenbankanwendung eine eigene Statusleiste verwenden, um dem Nutzer formular- und aktionsabhängig einige wichtige Informationen direkt anzuzeigen. Ich habe schon mit dem entsprechenden ActiveX-Steuerelement (Microsoft Status Bar Control) in den einzelnen Formularen experimentiert. Das Problem ist, das jedes Formular anders aussieht. Wenn ein Formular etwas länger ist, so das der Nutzer per Bildlaufleiste nach unter blättern muss um die Statusleiste zu sehen, geht der Sinn der Statusleiste schnell verloren. Gibt es eine Möglichkeit auf die Access-interne Statusleiste zuzugreifen? Der übliche Statusleistentext reicht mir hier nicht. Ich möchte Panels mit eigenen Informationen verwenden. Ich habe schon versucht, das ActiveX-Steuerelement für die Statusleiste in eine leere Menüleiste zu setzen. Nur leider erhalte ich mit den üblichen Funktionen des CommandBar-Objektes keinen Zugriff auf das ActiveX- Element in der Menüleiste.
ANTWORT: Zunächst zum Microsoft Status Bar Control: Wenn Sie es im Formularfuß statt im Detailbereich platzieren, wird es unabhängig von der Größe des Formulars immer angezeigt. Der Formularfuß muss dazu ggf. im Formularentwurf über Ansicht-Formularkopf-/-Fuß (bis Access 2003) bzw. im Register "Formularentwurfstools", "Anordnen" in der Gruppe "Ein-/Ausblenden" (Access 2007) eingeschaltet werden. In die Ereignisprozedur "Bei Größenänderung" nehmen Sie folgende Anweisungen auf:
Private Sub Form_Resize()
With Me.sbTest
.Width = Me.WindowWidth - 480
End With
DoEvents
End Sub
"sbTest" ersetzen Sie durch den Namen Ihres Status Bar Controls. Die Anweisungen passen die Breite des Status Bar Controls an die aktuelle Breite des Fensters abzüglich eines konstanten Wertes für die Breite von Rahmen und Rollbalken an - mit diesem Wert müssen Sie eventuell etwas experimentieren. Die Statuszeile von Access können Sie über die Funktion "SysCmd()" zum Beispiel in der Ereignisprozedur "Bei Fokuserhalt" wie folgt nutzen:
SysCmd acSysCmdSetStatus, _
"Geben Sie hier XYZ ein..."
In der Ereignisprozedur "Bei Fokusverlust" wird die Statuszeile wie folgt wieder freigegeben:
SysCmd acSysCmdClearStatus
Allerdings ist es nicht möglich, einzelne Panels der Statuszeile gezielt anzusprechen, es wird immer das erste Panel verwendet.
Von der Verwendung einer Symbolleiste für wechselnde Hinweise raten wir ab, da das nicht den allgemeinen Richtlinien für die Gestaltung von Benutzeroberflächen entspricht - und auch kein Anwender dort hinschauen würde, da man mit Symbolleisten im allgemeinen andere Aufgaben verbindet.
Keine Anzeige im Tabellenverknüpfungs-Manager
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: Ich habe meine Back-End-Datenbank(en) in das Format 2002/2003 konvertiert. Alles läuft problemlos, nur beim Aufruf des Tabellenverknüpfungs-Managers wird nichts angezeigt. Nach Alle auswählen und Ok läuft etwas ab und die Meldung "Alle ausgewählten verknüpften Tabellen wurden erfolgreich aktualisiert" erscheint. Habe ich etwas vergessen oder übersehen?
ANTWORT: Das Back-End hat keine Informationen, in welchen anderen Datenbanken seine Tabellen eingebunden sind, dort kann also nichts angezeigt werden. Der Tabellenverknüpfungs-Manager muss in den einzelnen Front-End-Anwendungen aufgerufen werden, in denen die Tabellen eingebunden sind.
Programm-Abstürze beim Komprimieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Zurzeit entwickle ich eine Datenbank mit Access 2003. Beim Komprimieren stürzt Access regelmäßig ab, legt ein Backup an und startet neu. Weder das Importieren in eine neue MDB noch der Einsatz von "/decompile" haben geholfen. Haben Sie noch eine Idee was ich machen kann, damit die Abstürze aufhören? Debuggen bringt keine Fehler, alles arbeitet wie gewünscht. Die MDE stürzt nicht ab, wohl aber Access beim Erstellen.
ANTWORT: Vermutlich "funkt" hier ein im Hintergrund laufender Virenscanner dazwischen. Virenscanner sind häufig so eingestellt, dass sie neu angelegte Dateien sofort scannen. Beim Komprimieren legt Access zunächst eine leere Datei "db1.mdb" an und füllt sie langsam mit den aufgeräumten Inhalten der Ursprungs-MDB. Anschließend wird die Ursprungs-MDB gelöscht und "db1.mdb" in den Namen der Ursprungs-MDB umbenannt. Da hat es natürlich fatale Folgen, wenn sich gleichzeitig ein anderes Programm an dieser Datei zu schaffen macht. Deaktivieren Sie den Virenscanner einmal testweise. Ist das Problem behoben, prüfen Sie die Einstellungen - dort können in der Regel Ausnahmen definiert werden, in denen Sie allgemein "*.MDB" oder konkret den Pfad der Datenbank eintragen.
Setup für eine Datenbank erstellen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Auf einer CD sind vorhanden: Front-End-Datenbank, Back-End-Datenbank und Arbeitsgruppen-Datei (KUNDEN.MDW). Die CD möchte ich an Kunden weitergeben, die dann ein automatisches Setup verwenden sollen. Das Setup soll folgendes können: Nach der Auswahl eines Verzeichnisses durch den Anwender werden automatisch Front-End- und Back-End-Datenbank kopiert. Die Arbeitsgruppen-Datei soll in das Verzeichnis kopiert werden, in dem sich die auf dem System vorhandene SYSTEM.MDW befindet. Eine Verknüpfung mit dem Namen der Front-End-Datenbank (mit einer entsprechenden Befehlszeile) auf dem Desktop wird erstellt. Beim Doppelklicken auf diese Verknüpfung wird die Front-End-Datenbank mit der zugehörigen Arbeitsgruppen-Datei gestartet und die Tabellenverknüpfungen mit der Back-End-Datenbank werden hergestellt (dafür gibt es bereits eine Lösung).
ANTWORT: Da gibt es zwei Möglichkeiten: Sie könnten in eine für Ihre Access-Version passende Developer Edition investieren (ältere Versionen stehen manchmal bei eBay zum Verkauf) und den darin enthaltenen Verpackungs- und Weitergabe-Assistenten nutzen, der die obigen Aufgabe automatisch erledigt und Ihnen eine fertige SETUP.EXE erstellt. Die Alternative ist ein programmierbares bzw. scriptingfähiges Setup-System wie der Wise InstallMaker (http://www.wise.com), der InstallShield Wizard (http://www.installshield.com) oder ein kostenloses Setup-System wie Inno Setup (http://www.jrsoftware.org/isinfo.php). Diese Systeme sind sehr flexibel, aber Sie müssen sich zunächst damit auseinandersetzen und sich darüber hinaus zusätzliche Grundlagen aneignen, also beispielsweise lernen, wie Startmenü-Einträge und Verknüpfungen erstellt oder wie Registrierungsschlüssel ausgelesen oder angelegt werden. Erfahrungsgemäß sind Sie mit einer Access Developer Edition schneller am Ziel.
So testen Sie auf laufende Word- und Excel-Instanzen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Um per VBA festzustellen, ob Word oder Excel derzeit gestartet sind, nutzen Sie folgenden Mechanismus:
Dim objWord As Word.Application
On Error Resume Next
Set objWord = GetObject(, "Word.Application")
If Err <> 0 Or objWord Is Nothing Then 'Word läuft nicht
Dim objExcel As Excel.Application
On Error Resume Next
Set objExcel = GetObject(, "Excel.Application")
If Err <> 0 Or objExcel Is Nothing Then 'Excel läuft nicht
Eine wichtige Voraussetzung dabei ist, dass eine Referenz auf "Microsoft Word x.x Object Library" bzw. "Microsoft Excel x.x Object Library" gesetzt wurde. "x.x" hängt dabei von der eingesetzten Office-Version ab. "GetObject()" liefert eine Referenz auf eine laufende Instanz einer Anwendung. Ist die betreffende Anwendung nicht gestartet, kommt es zu einem Laufzeitfehler, der sich entsprechend abfangen lässt.
Das Vorhandensein einer bestimmten Textmarke in einem Word-Dokument können Sie beispielsweise wie folgt prüfen:
With objWord
If .ActiveDocument.Bookmarks.Exists("Name") Then
'Textmarke vorhanden
Else
'Textmarke nicht vorhanden
End If
End With
"Name" ersetzen Sie dabei durch den Namen der zu prüfenden Textmarke. Im Gegensatz zu Word stellt Excel keine "Exists"-Funktion für Bereiche zur Verfügung. Hier hilft folgende Abfrage:
Dim n As Name
On Error Resume Next
Set n = ActiveWorkbook.Names("Name")
If Err <> 0 Or n Is Nothing Then 'Nicht vorhanden
"Name" ersetzen Sie hier durch den Namen des zu prüfenden Bereiches.
Titelleiste von Berichten ändern
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich verwende Access 2000 in Verbindung mit Windows XP. In meiner Access - Datenbank verwalte ich u.a. den Status der Bearbeitung umfangreicher Projekte. Um die Verantwortlichen entsprechend zu informieren existiert ein Report, der eine Übersicht erzeugt. Über diesen Report erstelle ich PDF-Dokumente durch "drucken" mit dem Acrobat PDFWriter. Hierbei wird mir der Text, der in den Eigenschaften des Reports unter 'Beschriftung' angegeben ist als Dateiname angeboten. Ist es möglich den Inhalt des Feldes "Beschriftung" beim Drucken automatisch variabel zu gestalten, zum Beispiel im Format =([Auftragsnummer] & " Statusbericht vom " & [Jetzt()])? Für hilfreiche Hinweise bedanke ich mich im Voraus.
ANTWORT: Die Eigenschaft "Beschriftung" können Sie per VBA in der Ereignisprozedur "Beim Formatieren" des Berichtsfußes setzen:
* Öffnen Sie den Bericht im Entwurfsmodus.
* Sofern kein Berichtsfuß verwendet wird, wählen Sie Ansicht-Berichtskopf-/-fuß an, um diese Bereiche einzublenden. In Access 2007 finden Sie diese Funktion unter "Berichtentwurfstools", Register "Anordnen", Gruppe "Ein/Ausblenden", Symbol Berichtskopf-/-fuß oben rechts.
* Doppelklicken Sie auf den grauen Balken "Berichtsfuß" und stellen Sie die Eigenschaft "Beim Formatieren" auf "[Ereignisprozedur]" ein.
* Geben Sie im VBA-Editor die folgende Anweisung ein:
Me.Caption = Me.Auftragsnummer & _
" Statusbericht vom " & _
Format$(Now,"Short Date")
* Speichern Sie die Änderungen und lassen Sie den Bericht einmal testweise anzeigen.
Die Beschriftung wird nun wie gewünscht geändert und dementsprechend im PDFWriter vorgegeben.
Zugriff auf das Datenbankfenster
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich habe die Datenbank eines Kollegen übernommen und arbeite mich nun als Admin in Access ein. Besagte Datenbank hat ein User-Front-End, das beim Öffnen der Datei nur ein Formular anzeigt und zur Ausgabe von Berichten führt. Wie komme ich an die Tabellen und Abfragen, die dahinter stehen?
ANTWORT: Vermutlich werden Teile der Oberfläche per "AutoExec"-Makro und über Einstellungen unter Extras-Start (bis Access 2003) oder die Access-Optionen, "Aktuelle Datenbank" (Access 2007) ausgeblendet. Die Ausführung des AutoExec-Makros können Sie umgehen, indem Sie beim Start der Datenbank die Umschalt-Taste gedrückt halten. Anschließend sollten die normalen Menüs sichtbar und darüber weitere Einstellungen korrigierbar sein.
Bericht in MDE-Datenbank importieren/verknüpfen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ist es möglich, einen Bericht aus einer anderen Datenbank in eine MDE- oder MDB-Datenbank zu importieren bzw. mit ihr zu verknüpfen zu verknüpfen?
ANTWORT: Ein Importieren oder Verknüpfen externer Objekte ist bei MDE-Datenbanken leider nicht möglich, Sie können jedoch einen Bericht aus einer anderen Datenbank ausdrucken. Kopieren Sie dazu folgende Funktion in ein Modul der MDE-Datenbank:
Function BerichtAusMDBDrucken(strDBName As String, _
strReportName As String)
Dim objAccess As Access.Application
On Error Resume Next
Set objAccess = CreateObject("Access.Application")
With objAccess
.OpenCurrentDatabase strDBName
.DoCmd.OpenReport strReportName
End With
BerichtAusMDBDrucken = (Err = 0)
End Function
"strDBName ist Pfad/Name der externen Datenbank, "strReport" ist der Name des Berichtes. In eine MDB können Sie einen Bericht aus einer anderen MDB mit DoCmd.TransferDatabase importieren:
DoCmd.TransferDatabase acImport, , "X:\Daten\Exterrne.mdb", acReport, "Berichtsname"
Datei im Internet auslesen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Um eine monatliche Updateprüfung durchzuführen, soll im Hintergrund eine Textdatei mit der Versionsnummer im Internet ausgelesen werden. Wenn die Nummer größer ist als die aktuelle, springt die Download-Seite automatisch auf, liegt keine neue Version vor, läuft das Programm normal weiter. Meine Frage: Wie kann ich auf die Textdatei zugreifen?
ANTWORT: Erstellen Sie ein Formular "CheckUpdate" oder ähnlich, in das Sie zunächst über das Menü Einfügen-ActiveX-Steuerelement ein "Microsoft Webbrowser Control" einfügen und "WebCtrl" oder ähnlich benennen. Wechseln Sie dann mit Alt+F11 in die VBA-Entwicklungsumgebung und setzen Sie über Extras-Verweise eine Referenz auf "Microsoft HTML Object Library". In die Ereignisprozedur "Beim Laden" des Formulars kopieren Sie folgende Anweisungen:
Dim objDoc As MSHTML.HTMLDocument
Dim strText As String
Const CurrVersion = 302 'v3.02
With Me.WebCtrl
.Navigate "http://www.host.de/Datei.txt"
While .ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend
Set objDoc = .Document
strText = objDoc.activeElement.innerText
Set objDoc = Nothing
If Val(strText) > CurrVersion Then
DoCmd.Restore
.Navigate "http://www.host.de/Updateseite.htm"
Else
DoCmd.Close acForm, Me.Name, acSavePrompt
End If
End With
Die bei ".Navigate" angegebenen URLs ersetzen Sie entsprechend durch Ihre Adressen der Textdatei und der ggf. anzuzeigenden Updateseite.
Erweitern Sie ein eventuell vorhandenes AutoExec-Makro um folgende Aktion oder legen Sie es mit folgender Aktion an:
Aktion: ÖffnenFormular
Formularname: CheckUpdate
Fenstermodus: Symbol
Beim Öffnen der Datenbank wird das Formular "CheckUpdate" automatisch minimiert geladen und deren Ereignisprozedur "Form_Load" ausgeführt. Die VBA-Anweisungen laden die Textdatei in das Webbrowser Control und lesen über deren Eigenschaft "Document.ActiveElement.Text" den Inhalt in die Variable "strText". Der folgende Vergleich mit "CurrVersion" führt entweder dazu, dass das Formular mit der Updateseite angezeigt oder das Formular geschlossen wird.
Daten in geschützter Datenbank aktualisieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich nutze ein Kassenprogramm, das auf Access basiert. Leider hat dieses Programm keine Importfunktion mit der ich zum Beispiel meine vorhandenen Kundendaten importieren kann. Ich habe aber keine Lust ca. 1.000 Kunden manuell zu erfassen. Die Daten des Kassenprogramms sind in einer MDB-Datei gespeichert. Wenn ich diese Datei mit Access öffnen will, erhalte ich die Meldung, der Zugriff sei nur über das Kassenprogramm möglich. Es gelingt mir zwar, die Datei in Excel zu öffnen und ich erhalte dann auch eine Auswahl der DB-Objekte und kann die Kundentabelle in Excel öffnen, aber die Änderungen auch nur als Arbeitsmappe speichern.
ANTWORT: Vermutlich startet die Datenbank über ein "AutoExec"-Makro eine Routine, die ein irrtümliches Öffnen und Ändern verhindern soll. Wenn Sie beim Öffnen der Datenbank die Umschalt-Taste gedrückt halten, werden keine Makros und Routinen automatisch ausgeführt, es könnte also auf diesem Wege möglich sein, die Datenbank so zu öffnen, dass Sie beispielsweise per Anfügeabfrage Datensätze hinzufügen können.
Alternativ könnten Sie versuchen, die Tabellen aus der Kassen-Datenbank über das Menü Datei-Externe Daten-Tabellen verknüpfen in Ihre Datenbank einzubinden und die Daten dann über diese Verbindung zu aktualisieren. Ansonsten empfiehlt sich einmal eine Rückfrage beim Anbieter des Kassensystems - es sollte auch in seinem Interesse sein, dass den Kunden nicht unnötig Arbeit durch solche Schutzmechanismen aufgelastet wird.
Daten ohne Feldnamen in erster Zeile exportieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich möchte aus einer Tabelle Daten in eine ASCII-Datei exportieren. Dieser Export soll makrogesteuert erfolgen. Leider funktioniert das jedoch nur mit Feldnamen in der ersten Zeile, so dass unser Großrechner die Daten nicht importieren kann. Wie lässt sich dieses Problem lösen?
ANTWORT: Sie müssen den Export einmal manuell ausführen. Im Export-Assistenten gibt es eine Schaltfläche Weitere, darüber können Sie diverse Einstellungen, darunter auch bezüglich Feldnamen in erster Zeile, vornehmen und die Spezifikation über eine Schaltfläche Speichern unter unter einem frei wählbaren Namen sichern. Bei "DoCmd.Transfer..." bzw. im Makro geben Sie dann den Namen dieser Spezifikation an, damit deren Festlegungen berücksichtigt und Feldnamen in der ersten Zeile unterdrückt werden können.
Datenbanken zwischen nicht vernetzten Rechnern abgleichen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich habe eine Datenbank auf zwei miteinander nicht vernetzten Computern gespeichert. Ist es möglich, mal auf dem einen, mal auf dem anderen Änderungen durchzuführen und dann zu vergleichen, wo welche Änderungen sind, damit ich dann beide auf den gleichen Stand bringen kann? Dass ich die beiden "Versionen" irgendwie, also z.B. mit Hilfe eines USB-Sticks, zusammenbringen muss, ist natürlich logisch, aber gibt es dann eine Möglichkeit, dass ich nicht Datensatz für Datensatz prüfen muss, um feststellen zu können, ob an einer der beiden Änderungen vorgenommen wurden? Danke im Voraus für die Auskunft.
ANTWORT: Die Lösung Ihres Problems nennt sich "Replikation": Erstellen Sie zunächst eine aktuelle Version der Datenbank, die alle Änderungen beinhaltet und konvertieren Sie sie über das Menü Extras-Replikation-Datenbank in Replikat konvertieren in einen sogenannten "Designmaster", den Sie zum Beispiel unter "D:\Access\Daten\Replikation" speichern (vorher ggf. Sicherheitskopie anlegen!).
Bei diesem Vorgang wird gleichzeitig eine Kopie der Datenbank als sogenanntes "Replikat" angelegt, das Sie am besten direkt auf den USB-Stick kopieren. Dieses Replikat können Sie nun direkt vom USB-Stick am Laptop nutzen und dort Daten erfassen und ändern, während der Designmaster auf dem Desktop-PC verbleibt und dort ebenfalls der Erfassung und Änderung von Daten dient. Um die beiden Datenbanken abzugleichen, schließen Sie den USB-Stick mit dem Replikat am Desktop-Rechner an, starten den Designmaster und wählen dort Extras-Replikation-Jetzt synchronisieren an.
Access gleicht die Datenbanken nun so ab, dass beide Kopien auf dem gleichen Stand sind, es überträgt also zum Beispiel neue Datensätze vom Designmaster ins Replikat und umgekehrt oder aktualisiert eine im Replikat geänderte Hausnummer im betreffenden Datensatz des Designmasters.
Bitte beachten Sie, dass diese Art der Replikation nur bis Access 2003 genutzt werden kann. Ab Access 2007 muss dazu ein SQL-Server eingesetzt werden, der Replikationen unterstützt!
dBase-Dateien importieren
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: Wenn ich in Access 2000 oder 2002/XP dBase-Dateien (.dbf) importieren will, wird mir ab und zu folgende Fehlermeldung angezeigt: "Suchschlüssel nicht gefunden". Wird die Datei verknüpft statt importiert, funktioniert die Einbindung zwar, sobald ich aber eine Abfrage basierend auf der verknüpften Tabelle erstellen möchte, wird wieder die o.g. Fehlermeldung angezeigt. Haben Sie eine Idee, woran das liegt und wie man diese Fehlermeldung umgehen könnte? In Access 97 tritt diese Fehlermeldung übrigens nicht auf. Ist das ein Problem von Access 2000 und 2002/XP oder liegt das an den dBase-Dateien?
ANTWORT: dBase-Datenbanken bestehen nicht nur aus .dbf-Dateien, sondern, wenn indexiert, auch aus Kombinationen einer .dbf- und einer .dbx- sowie eventuell einer .dbt-Datei für Memofeld-Inhalte. Während Access 97 das Fehlen der Zusatz-Dateien einfach ignoriert, setzen neuere Access-Versionen voraus, dass alle .db*-Dateien, die eine dBase-Datenbank bilden, vorhanden sind. Sie müssten also einmal bei der Quelle der .dbf-Dateien nachhaken und um die Übersendung der och fehlenden .dbx/.dbt-Dateien bitten.
Erstellungsdatum einer Datei auslesen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Ich finde Ihren Tipp "Verzeichnisse und Dateien per VBA auslesen und verarbeiten" sehr Hilfreich und habe ihn in meine Dokumentenverwaltung eingebaut. Meine Frage ist: Kann man auch das Erstellungsdatum einer Datei damit auslesen? Das Datum der letzten Änderung ist für mich leider nicht sehr interessant. Danke für Ihre gute Arbeit!
Wenn Sie einmal die im ersten Teil des Tipps vorgestellte Prozedur "ShowProperties" ausführen, werden alle Eigenschaften aufgelistet, die Sie mit der Lösung auslesen können. Unter anderem finden Sie hier unter Index "4" die Eigenschaft "Erstellt am", die Erstellungsdatum und Erstellungszeit einer Datei liefert. Mit einem Aufruf
strDate = GetExtFileInfo(strFName, 4)
erhalten Sie dann beispielsweise "12.04.2007 13:45" als Ergebnis.
Excel-Export in Access 2003 und 2007
Versionen: Access 2007 und 2003
FRAGE: Wir nutzen eine Datenbank sowohl unter Access 2003 als auch unter Access 2007. Wenn wir Datensätze aus Access 2007 mit einem Makro und der Einstellung "Excel 97-2003" an Excel exportieren, funktioniert das einwandfrei. Wenn die Datenbank jedoch mit Access 2003 geöffnet wird, zeigt Access bei Ausführung des Makros eine Fehlermeldung an, dass das Ausgabeformat nicht verfügbar ist. Wenn wir nun in Access 2003 dieselbe Einstellung "MS Excel 97-2003" verwenden, funktioniert das Makro wieder, aber anschließend wird in Access 2007 der Fehler bei Ausführung des Makros angezeigt. Was können wir tun damit der Export sowohl mit Access 2003 als auch mit Access 2007 funktioniert und wir nicht dauernd die Einstellungen ändern müssen?
ANTWORT: Wenn Sie dieselbe Datenbank im Kompatibilitätsmodus unter Access 2007 und "normal" unter Access 2003 einsetzen, lässt sich das Problem leider nicht lösen. Die Einstellungen sehen zwar von der Sache her identisch aus (Microsoft Excel 97-2003, Excel 97 - Excel 2003-Arbeitsmappe), sie unterscheiden sich aber.
Verwenden Sie anstelle eines Makros die VBA-Anweisung "DoCmd.OutputTo" mit dem Parameter "acFormatXLS" bzw. "DoCmd.TransferSpreadsheet" mit dem Parameter "acSpreadsheetTypeExcel9", um das Problem zu lösen.
Excel-Tabellenblatt importieren
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: Ich möchte in Access mit einem Makro aus einer Excel-Arbeitsmappe ein bestimmtes Tabellenblatt namens "Neue_Zahlen" importieren. Bei der Auswahl der Aktion im Makro habe ich "TransferArbeitsblatt" ausgewählt, weiß aber nicht was ich eingeben muss um das spezielle Tabellenblatt zu importieren. Können Sie mir einen Tipp geben wie das funktioniert?
ANTWORT: Normalerweise geben Sie im Feld "Bereich" zum Beispiel mit "B2:Z9" den Bereich der Zellen an, die importiert werden sollen. Access geht dabei davon aus, dass in der Arbeitsmappe nur ein Tabellenblatt vorhanden ist oder dass die Daten des ersten Tabellenblattes auszulesen sind. Um gezielt von einem bestimmten Tabellenblatt zu importieren, ergänzen Sie die Angaben im Feld "Bereich" beispielsweise wie folgt:
Neue_Zahlen!B2:Z9
Fehlermeldung 'Anzahl der Dateisperrungen überschritten' vermeiden
Versionen: Access 2007, 2003, 2002/XP und 2000
FRAGE: Wir nutzen eine VBA-Routine und verschiedene Recordsets, um ca. 20.000 Datensätze von einem Großrechner in Access zu importieren. Dabei nutzen wir "FindFirst", um auf ggf. vorhandene Datensätze zu prüfen. Außerdem werden verschiedene Feldinhalte per "rs.Edit" und "rs.Update" angepasst. Nach rund der Hälfte der Datensätze steigt Access mit einem Fehler "3052 - Anzahl der Dateisperrungen überschritten" aus. Woran kann das liegen und wie lässt sich diese Unterbrechung vermeiden?
ANTWORT: Die Meldung "Anzahl der Dateisperrungen überschritten" ist etwas unglücklich übersetzt - vielmehr handelt es sich hier um Handles, die Access bei jedem Zugriff auf eine Tabelle, eine Abfrage, einen Recordset oder für bestimmte Recordset-Operationen vergibt und die normalerweise z.B. durch ein "Recordset.Close" wieder freigegeben werden. In Ihrem Fall ist der Handle Pool bei ca. 10.000 Durchläufen erschöpft. Setzen Sie einmal folgende Anweisung an den Anfang der Routine:
DBEngine.SetOption dbMaxLocksPerFile, 15000
'oder 20000, 30000...
und
DBEngine.SetOption dbMaxLocksPerFile, 9500 'Default
an das Ende. Damit sollte das Problem behoben sein.
Falls sich durch die Anweisung nichts ändert, können Sie den Wert auch einmal direkt in der Registry in
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\
Jet\4.0\Engines\Jet 4.0
im Eintrag "MaxLocksPerFile" auf 15000, 20000, 30000 anpassen.
Linien verschwinden im RTF-Export
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Wir exportieren verschiedene Berichte mit vertikalen und horizontalen Linien im RTF-Format an Word, um sie dort weiter zu bearbeiten. Leider verschwinden dabei immer wieder die Linien, so dass wir sie in Word über die Zeichnen-Funktionen nachträglich einfügen müssen. Können Sie uns einen Tipp geben, wie sich das vermeiden lässt?
Die Standardeinstellung "Haarlinie" für die Eigenschaft "Rahmenbreite" von Linien resultiert in einem Wert mit Nachkommastellen wie "0,25", der mitunter von Word nicht richtig, sondern als "0" interpretiert wird - die Linie ist dann zwar physisch im Dokument vorhanden, aber quasi unsichtbar. Stellen Sie also zunächst einmal in den Access-Berichten die Eigenschaft "Rahmenbreite" auf einen höheren Wert, also beispielsweise 2 oder 3 Punkt ein. Hilft dies nicht, ersetzen Sie die Linien im Bericht einmal durch Rechtecke mit der Rahmenbreite "1" und stellen Sie die Höhe bzw. Breite auf "0" ein.
Parameterabfrage per Makro exportieren
Versionen: Access 2007, 2003, 2002/XP und 2000
Nehmen wir an Sie haben eine Parameterabfrage mit einem Parameter "Stadt" eingerichtet. Das Ergebnis dieser Abfrage, zum Beispiel eine Übersicht aller Vereinsmitglieder in einer bestimmten Stadt, möchte Sie per Makro in eine Excel-Arbeitsmappe exportieren. Beim Ausführen des Makros zeigt Access jedoch nicht den Dialog "Parameterwerte eingeben", sondern eine Fehlermeldung "1 Parameter wurde erwartet..." an. Das liegt daran, dass beim Öffnen von Abfragen über Makros nicht auf Parameter geprüft wird und deshalb die Anzeige des Dialogs "Parameterwerte eingeben" unterbleibt. Hier hilft der folgende Trick:
* Geben Sie in einem Modul die folgende Funktion ein:
Function WelcheStadt() As String
WelcheStadt= InputBox( _
"Bitte den Namen der Stadt eingeben:")
End Function
* Löschen Sie die Parameter aus der Abfrage, so dass wieder eine "normale" Auswahlabfrage vorliegt.
* Geben Sie in der Zeile "Kriterien" für das Feld mit dem Städtenamen folgende Formel ein:
=WelcheStadt()
* Speichern Sie die Änderungen.
Wenn Sie in Zukunft das Makro starten, fragt Access zunächst nach der gewünschten Stadt. Geben Sie den Ort ein und bestätigen Sie mit Ok. Daraufhin wird automatisch die entsprechende Abfrage ausgeführt und das Ergebnis in eine Excel-Arbeitsmappe geschrieben.
Text in Word fett formatieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich übergebe regelmäßig Daten von Access an Word, was auch gut klappt. Eine Sache gelang mir bisher nicht: Wie kann ich per Code übergebene Daten (per Textmarke) formatieren? In meinen Fall möchte ich Text, der sich in einem Positionsrahmen befindet formatieren. Und zwar nur die erste Zeile. Der ganze Text lautet:
Ihr Gesprächspartner:
Michael Mustermann
Tel: 01234 / 56 78 90
Fax: 01234 / 56 78 91
m.mustermann@provider.de
"Ihr Gesprächspartner:" soll per Code aus Access heraus fett formatiert werden. Wie geht das?
ANTWORT: Diese Aufgabe lassen Sie einfach die Suchen/Ersetzen-Funktion von Word erledigen. Wenn wir einmal davon ausgehen, dass Ihre Objektvariable für den Zugriff auf Word "objWord" ist, sähe ein entsprechender Codeschnippsel so aus:
With objWord.Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
.Replacement.Font.Bold = True
.Text = "Ihr Gesprächspartner:"
.Replacement.Text = "Ihr Gesprächspartner:"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
Diese Anweisungen suchen nach der Zeichenfolge "Ihr Gesprächspartner:" (.Text = "Ihr Gesprächspartner:") und ersetzen jede Fundstelle durch den gleichen Begriff (.Replacement.Text = "Ihr Gesprächspartner:") zuzüglich der Formatierung "Fett" (.Replacement.Font.Bold = True).
Textimport mit Zeilenumbruch
Versionen: Access 2007, 2003, 2002/XP und 2000
FRAGE: Beim Importieren einer Textdatei in eine Tabelle habe ich folgendes Problem: Die zuvor ausgegebenen Daten werden in eine Textdatei geschrieben und dabei die einzelnen Spalten durch ein Semikolon ";" voneinander getrennt. Wenn aber in der Spalte 3 (bei mir in der Tabelle ein Memofeld) eine Zeilenschaltung vorhanden ist, entsteht beim Einlesen in die Tabelle ein Fehler, da durch die Zeilenschaltung der Inhalt als neuer Datensatz importiert wird. Gibt es eine Möglichkeit, dieses Problem zu umgehen?
ANTWORT: Verwenden Sie für den Export der Daten eine Abfrage und ändern Sie die Zeile "Feld" für die Ausgabe des Memofeldes wie folgt:
Memoexport: Replace([Memofeld];Zchn(13) & Zchn(10);"~~")
"Memofeld" ersetzen Sie durch den Namen des Memofeldes in Ihrer Tabelle. Durch die obige Anweisung werden Zeilenschaltungen bei der Ausgabe durch zwei Tilden "~~" ersetzt. Nach dem Import der Daten lassen Sie eine Aktualisierungsabfrage laufen, die diesen Vorgang wieder umkehrt. Tragen Sie dazu in der Abfrage beim importierten Memofeld in der Zeile "Aktualisieren:" folgenden Ausdruck ein:
Replace([Tätigkeit];"~~";Zchn(13) & Zchn(10))
Dadurch werden nun die beiden Tilden "~~" wieder durch Zeilenschaltungen ersetzt - Problem gelöst!
Verbindung zum SQL Server 2005 Express schlägt fehl
Versionen: Access 2007, 2003, 2002/XP und 2000
Ich versuche, auf einem Windows 2000- oder einem Windows XP-Server einen SQL Server 2005 Express zu installieren. Die Installation läuft ohne Probleme ab, doch anschließend ist es mir bei beiden Systemen nicht möglich, mit den Verwaltungs- oder Kommandozeilentools eine Verbindung herzustellen, damit ich Datenbanken, Tabellen und Zugriffsrechte verwalten kann. Jeder Versuch wird mit einer Fehlermeldung "Server existiert nicht oder Zugriff verweigert" quittiert. Was könnte die Ursache dafür sein?
Vermutlich haben Sie in den Verbindungsdaten als Servernamen "localhost" angegeben - diese Einstellung wird jedoch beim lokalen Zugriff, der standardmäßig über Named Pipes erfolgt, nicht unterstützt. Verwenden Sie als Servernamen entweder einen einzelnen Punkt (".") als Stellvertreter für "localhost", die IP-Adresse 127.0.0.1 oder den Namen des Windows-Servers, dann klappt der Verbindungsaufbau. Alternativ können Sie über den SQL Server Configuration Manager die Netzwerk- und Client-Konfiguration dahingehend ändern, dass Sie Named Pipes, Shared Memory und VIA deaktivieren und den Zugriff ausschließlich über TCP/IP laufen lassen.
Zahlen nach Excel exportieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich habe folgendes Problem, dessen Lösung ich bislang nicht finden konnte: In einer Datenbank zeichne ich täglich verschiedene Wirtschaftsdaten auf, wie z.B. Zinssätze, DAX-Kurse oder Preise für Rohstoffe. Zur Auswertung der Daten exportiere ich Teile daraus mit Hilfe der Methode "TransferArbeitsblatt" in eine Excel-Datei. Beim Export werden die Werte nun minimal verändert, so wird zum Beispiel aus einem Wert von 2,08 in Access der Wert 2,07999992370605 in Excel. Dieses Phänomen tritt jedoch nicht auf, wenn ich in Access in der entsprechenden Tabelle die Spalten markiere und über Strg+C und Strg+V in Excel einfüge. Die Daten sind daher in Access korrekt abgelegt.
Felder in Access:
Feldgröße: Single
Format: Festkommazahl
Dezimalstellen: 4
Woher kommt die Abweichung?
ANTWORT: Wenn Sie die Daten mit Strg+C/Strg+V übertragen, werden sie so übernommen, wie sie in der aktuellen Ansicht angezeigt werden, also beispielsweise mit zwei Nachkommastellen. Bei der Übertragung per "TransferArbeitsblatt" verwendet Access jedoch das für das Feld eingestellte Format "Single", ignoriert aber die eingestellte Anzahl Nachkommastellen. Das Problem lässt sich lösen, indem Sie einmal einen manuellen Export per Export-Assistent durchführen und dort das Format für das betreffende Feld explizit festlegen. Über die Schaltfläche Weitere im Export-Assistenten können Sie die Spezifikation speichern und dann zukünftig bei "TransferArbeitsblatt" als Parameter angeben.
Zugriff auf externe Tabellen beschleunigen
Versionen: Access 2007, 2003, 2002/XP und 2000
Um per VBA über einen Recordset auf Daten in externen Tabellen zuzugreifen, binden Sie sie normalerweise in Ihre Datenbank ein und öffnen dann einen Recordset beispielsweise wie folgt:
Set db = CurrentDb()
Set rs = db.OpenRecordset("ExterneTabelle", dbOpenDynaset)
Da Access die Einbindung externer Tabellen erst dann initialisiert, wenn ein Zugriff auf die Tabelle erfolgt, benötigt dieser Vorgang einige Zeit. Wesentlich effizienter wäre es, wenn Sie auf die Verknüpfung der Tabelle verzichten, die externe Datenbank direkt öffnen und dann wie folgt auf die Tabelle zugreifen:
Set db = OpenDatabase("ExterneDatenbank")
Set rs = db.OpenRecordset("ExterneTabelle")
Zugriff auf Outlook-Nachrichten
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich habe eine Datenbank, die in einer Zeitgeber-Ereignisprozedur per Office Automation regelmäßig den Posteingang von Outlook prüft:
Set objOutl= GetObject(, "Outlook.Application")
Set objInbox = _
objOutlook.GetNamespace("MAPI").GetDefaultFolder( _
olFolderInbox)
For Each objMail in objInbox.Items
If objMail.Subject = "XYZ..." Then
.....
End If
Next objMail
Diese Routine löst manchmal einen Fehler 13 in der Zeile "Next objMail" aus. Woran könnte das liegen?
ANTWORT: Alles deutet daraufhin, dass sich im Posteingang ein Element befindet, das nicht das Format "Nachricht" aufweist. Bei "Next objMail" läuft die Routine zum Beispiel auf eine Lesebestätigung, die nicht dem Format "MailItem" entspricht, also wird ein Laufzeitfehler 13, "Typen unverträglich", ausgelöst. Ändern Sie die betreffende Schleife einmal wie folgt:
Dim objItem As Object
.....
For Each objItem In objInbox.Items
If objItem.Class <> olMail Then GoTo SkipItem
Set objMail = objItem
If objMail.Subject = "XYZ..." Then
.....
End If
SkipItem:
Next objItem
.....
Es werden alle Elemente im Posteingang durchlaufen und zunächst daraufhin geprüft, ob deren Eigenschaft "Class" dem Typ "olMail" entspricht - wenn nicht, wird das Element übersprungen, andernfalls kann "objMail" gefahrlos auf "objItem" referenziert und darüber auf die Nachricht zugegriffen werden.
Makro in Word ausführen
Versionen: Access 2003, 2002/XP, 2000 und 97
Wie kann ich aus Access mit einem Makro ein anderes Makro in Word starten?
Per Makro geht das leider nicht direkt, Sie müssen dazu eine VBA-Funktion einsetzen, die das Word-Makro per Office Automation beispielsweise wie folgt startet:
Function WordMakroStarten(strMakroName As String)
Dim wrdApp As Word.Application
Set wrdApp = CreateObject("Word.Application")
wrdApp.Visible = True
wrdApp.Run strMakroName
End Function
Bevor Sie die Prozedur nutzen können, müssen Sie eine Referenz auf die Objektbibliothek von Word setzen. Wählen Sie dazu in der VBA-Entwicklungsumgebung das Menü Extras-Verweise an, und markieren Sie in der Liste Verfügbare Referenzen den Eintrag "Microsoft Word x.0 Object Library" (x= "11" für Word 2003, "10" für Word 2002/XP, "9" für Word 2000 oder "8" für Word 97. Anschließend können Sie Word-Makros über einen normalen Funktionsaufruf beispielsweise aus anderen Access-Prozeduren starten:
WordMakroStarten "Makroname"
In einem Makro legen Sie eine Aktion "AusführenCode" an und geben im Feld "Funktionsname" folgenden Ausdruck ein:
WordMakroStarten("Makroname")
"Makroname" ersetzen Sie jeweils durch den Namen des Makros, das in Word ausgeführt werden soll.
Makro nach Rückfrage abbrechen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Über ein Makro lasse ich verschiedene Aktionen ausführen. Ich möchte zwischendurch eine Abfrage "Makro weiter ausführen? [Ja] [Nein]" anzeigen und bei einem Klick auf Nein die weitere Ausführung des Makros abbrechen. Ist das möglich?
ANTWORT: Wählen Sie zunächst im Makroentwurf das Menü Ansicht-Bedingungen an, um die Spalte "Bedingung" anzeigen zu lassen. Geben Sie dort folgenden Ausdruck ein:
Meldung("Makro weiter ausführen?";36)=7
Als Aktion stellen Sie "StopMakro" ein. Wenn Access nun bei der Ausführung des Makro in diese Zeile gelangt, wird zunächst die Meldung "Makro weiter ausführen?" mit dem Fragezeichensymbol und den Schaltflächen Ja und Nein angezeigt. Wenn der Anwender auf Nein klickt, ist das Funktionsergebnis "7". Die Bedingung ist dann erfüllt und das Makro wird über "StopMakro" abgebrochen. Bei einem Klick auf Ja geht es hingegen mit der nächsten Zeile im Makro weiter, da die Bedingung nicht erfüllt ist.
Makros schneller anlegen
Versionen: Access 2007, 2003, 2002/XP und 2000
Beim Anlegen von Makros können Sie viel Zeit sparen: Wenn Sie Objekte, für die bestimmte Aktionen ausgeführt werden sollen, aus dem Datenbankfenster bzw. dem Navigationsbereich in das Makro-Entwurfsfenster ziehen, legt Access je nach Objekttyp automatisch eine Aktion an und trägt die notwendigen Parameter ein:
* Tabelle: Aktion "ÖffnenTabelle" in Datenblattansicht
* Abfrage: Aktion "ÖffnenAbfrage" in Datenblattansicht
* Formular: Aktion "ÖffnenFornular" in Formularansicht
* Bericht: Aktion "ÖffnenBericht" in der Seitenansicht
* Makro: Aktion "AusführenMakro"
* Modul: Aktion "ÖffnenModul" in der Entwurfsansicht
Alle Tabellen und Abfragen für Seriendruck anzeigen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Nachdem ich in einem Seriendruck-Dokument die Datenquelle gelöscht habe, um eine neu angelegte Abfrage als Datenquelle zuzuordnen, öffnet sich das Fenster, in dem man Tabellen und Abfragen auswählen kann. Ich bekomme aber nicht alle Abfragen angezeigt, die tatsächlich in der Datenbank vorhanden sind. Kennen Sie das Phänomen?
ANTWORT: Bei der Auswahl der Datenquelle verwendet Word verschiedene Modi (OLEDB, ODBC, DDE) für den Zugriff auf Tabellen und Abfragen. Im Standardmodus "OLEDB" werden nicht alle Tabellen und Abfragen angezeigt. Der flexibelste Zugriff erfolgt per DDE. Um diesen Modus nutzen zu können, gehen Sie wie folgt vor:
1. Rufen Sie in Word das Menü Extras-Optionen auf bis Word 2003 bzw. klicken Sie unter der Office-Schaltfläche auf Word-Optionen (Word 2007).
2. Wechseln Sie auf die Registerkarte "Allgemein" (bis Word 2003) bzw. in den Bereich "Erweitert" und dort in den Abschnitt "Allgemein" (Word 2007).
3. Aktivieren Sie die Option Konvertierung beim Öffnen bestätigen (bis Word 2003) bzw. Dateiformatkonvertierungen beim Öffnen bestätigen (Word 2007).
4. Klicken Sie auf Ok, um die Änderungen zu übernehmen.
Wenn nun zukünftig im Seriendruck eine Datenquelle zugeordnet werden soll, zeigt Word zunächst einen Dialog "Datenquelle bestätigen" an. Markierten Sie hier den Eintrag "MS Access-Datenbanken über DDE" und klicken Sie auf Ok. Im dann folgenden Dialog werden für die Auswahl zwei Register "Tabellen" und "Abfragen" angezeigt, die alle verfügbaren Objekte auflisten. Wechseln Sie auf "Abfragen", markieren Sie die gewünschte Abfrage, aktivieren Sie die Option Mit Abfrage verknüpfen und klicken Sie auf Ok.
Datenbankverbindung von Word zu Access
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich nutze mehrere Serienbriefe in Word, die mit einer gemeinsamen Access-Datenbank als Datenquelle verknüpft sind. Bei den meisten Serienbriefen funktioniert das problemlos. In zwei Fällen davon verliert Word immer wieder die Verbindung zur Access- Datenbank. Diese muss dann wieder neu manuell eingebunden werden. Wo ist diese Verbindung zur Datenquelle eingetragen?
ANTWORT: Word speichert diese Informationen in einem speziellen Format direkt im Seriendruck-Dokument. Eine Änderung dieser Informationen "von außen" ist leider nicht möglich. Per VBA können Sie die Datenquelle beispielsweise mit einem "AutoOpen"- oder "AutoExec"- Makro im Seriendruck-Dokument über eine Anweisung wie die folgende setzen:
ActiveDocument.MailMerge.OpenDatasource _
Name:="D:\Daten\Access\Adressen.mdb", _
LinkToSource:=True, _
AddToRecentFiles:=False, _
Connection:="TABLE Kunden")
Word-Seriendruck mit Access-Abfragen, Teil 1
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Wenn Sie Adressen mit Access verwalten, liegt es nahe, darauf basierende Rundschreiben und Serienbriefe mit Word zu erstellen und die dort vorhandenen, im Vergleich zu Berichten weitaus komfortableren Funktionen zum Aufbau und zur Formatierung der Serienbriefe zu nutzen. Dazu bietet die Seriendruck-Funktion von Word die Möglichkeit, direkt Access-Tabellen als Datenquellen einbinden zu können. Allerdings ist es in den seltensten Fällen praktikabel, eine komplette Tabelle als Datenquelle heranzuziehen: Meist möchten Sie nur eine bestimmte Zielgruppe anschreiben und benötigen eine Filterung beispielsweise nach Land, Postleitzahl, Vorwahl oder Produkt. Mitunter ist auch eine spezielle Sortierung nach Regionen oder Postleitzahlgebieten notwendig, wenn Sie zum Beispiel günstige Versandtarife oder spezielle Portooptimierungen (Infopost, Infobrief etc.) nutzen möchten.
Im Seriendruck von Word können Sie nicht nur Access-Tabellen, sondern, je nach Word-Version mit Hilfe eines kleinen Tricks, auch Access-Abfragen als Datenquelle verwenden. Damit stehen Ihnen nicht nur Möglichkeiten offen, Adressen per Auswahlabfrage nach beliebigen Kriterien filtern und sortieren zu können, es lässt sich auch eine Parameterabfrage verwenden und so der Seriendruck flexibel bei der Ausführung steuern. In unserem Tipp der Woche zeigen wir Ihnen zunächst an einem praktischen Beispiel, wie Access-Abfragen im Word-Seriendruck verwendet werden. Der zweite Teil erläutert den Aufbau verschiedener praxisbezogener Abfragen, die Sie regelmäßig für spezielle Serienbrief-Aktionen benötigen.
Für erste Experimente bietet sich einmal mehr die bei Access mitgelieferte Beispieldatenbank "Nordwind" an. Hier sollen zunächst einige einfache Abfragen erstellt werden, die Kundenadressen nach Land selektieren:
* Öffnen Sie die Beispieldatenbank "Nordwind" und wechseln Sie in den Bereich "Abfragen". In Access 2007 wechseln Sie auf das Register "Erstellen" der Multifunktionsleiste.
* Klicken Sie auf die Schaltfläche Neu, dann auf "Entwurfsansicht", wählen Sie die Tabelle "Kunden" per Doppelklick aus und klicken Sie auf Schließen. In Access 2007 klicken Sie in der Gruppe "Andere" auf das Symbol Abfrageentwurf, wählen die Tabelle "Kunden" per Doppelklick aus und klicken dann auf Schließen.
* Fügen Sie per Doppelklick in die Feldliste die benötigten Adressfelder wie Firma, Kontaktperson bzw. Vor- und Nachname, Straße, Postleitzahl, Ort und Land bzw. Land/Region zum Abfrageentwurf hinzu.
* Geben Sie beim Feld "Land" bzw. "Land/Region" in der Zeile "Kriterien" den folgenden Ausdruck ein:
="Deutschland"
Achtung! In der Beispieldatenbank "Nordwind" von Access 2007 gibt es die alten, seit jeher verwendeten Adressen "Alfreds Futterkiste" & Co nicht mehr, dort sind nur noch sehr einfach aufgebaute Testadressen mit "Land/Region= USA" vorhanden. Ändern Sie dort direkt in der Tabelle "Kunden" einfach einige Datensätze auf "Land/Region= Deutschland", "Land/Region= Belgien", "Land/Region= Frankreich" usw.
* Speichern Sie die Abfrage zum Beispiel unter dem Namen "Kunden/Deutschland".
* Ändern Sie das Auswahlkriterium zum Beispiel in '="Belgien", '="Frankreich"' usw. und speichern Sie die Abfrage gemäß Kriterium jeweils unter Namen wie "Kunden/Belgien", "Kunden/Frankreich" usw.
Damit sind zunächst ein paar Beispielabfragen erstellt, die Sie nun wie folgt im Word-Serienruck einbinden können:
* Starten Sie Word und wählen Sie das Menü Extras-Briefe und Sendungen-Seriendruck-Assistent (Word 2003, 2002) bzw. Extras-Seriendruck (Word 2000, 97) an. In Word 2007 wechseln Sie auf das Register "Sendungen" und wählen Seriendruck starten-Seriendruck-Assistent mit Schritt-für-Schritt-Anweisungen an.
* In Word 2007, 2003 und 2002 folgen Sie nun den Anweisungen im rechts eingeblendeten Aufgabenbereich "Seriendruck" bis zu "Schritt 3 von 6, Empfänger wählen". Aktivieren Sie die Option Vorhandene Liste verwenden, klicken Sie auf Durchsuchen und lokalisieren Sie die Beispieldatenbank "Nordwind" mit den eben angelegten Beispielabfragen. Wählen Sie dann die gewünschte Abfrage, also beispielsweise "Kunden/Deutschland" und bestätigen Sie den folgenden Selektions-Dialog mit Ok.
In Word 2000 und 97 klicken Sie im Seriendruck-Manager auf Erstellen-Serienbriefe und dann auf Daten importieren-Datenquelle öffnen. Im dann folgenden Dialog "Datenquelle öffnen" stellen Sie in der Liste "Dateityp" den Eintrag "MS Access Datenbanken" ein, lokalisieren die Beispieldatenbank "Nordwind" mit den eben angelegten Beispielabfragen und - wichtig! - aktivieren die Option Importweise auswählen, bevor Sie auf die Schaltfläche Öffnen klicken. Es wird daraufhin ein weiterer Dialog angezeigt, in dem Sie den Eintrag "MS Access-Datenbanken über DDE" markieren und dann auf Ok klicken. Diese Einstellung ist notwendig, damit im nächsten Schritt Tabellen UND Abfragen zur Auswahl angezeigt werden. Andernfalls können nur Tabellen ausgewählt werden! Wechseln Sie auf die Registerkarte "Abfragen", wählen Sie dann die gewünschte Abfrage, also beispielsweise "Kunden/Deutschland" und bestätigen Sie den Auswahl-Dialog mit einem Klick auf Ok.
* Komplettieren Sie dann den Seriendruck, indem Sie die gewünschten Felder ins Dokument einfügen und den Brief wie erforderlich gestalten. Anschließend können Sie dann Ihre Serienbriefe direkt ausdrucken.
Im zweiten Teil dieses Tipps der Woche in der nächsten Ausgabe von Access Weekly geht es dann um spezielle Abfragen mit Filterungen, Gruppierungen, Sortierungen und Parametern, außerdem zeigen wir Ihnen, wie Sie regelmäßig auftretende Probleme bei der Erkennung von Datentypen (Datum, Zeit, Währung usw.) lösen.
Berechnetes Feld in Tabelle speichern
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich habe eine Rechnungsdatenbank entworfen und lasse in einem Formular über ein Textfeld per Formel einen Wert wie z.B. eine Bestellzwischensumme zuzüglich Mehrwertsteuer errechnen und erhalte als Ergebnis einen Eurobetrag. Da "Steuerelementeinhalt" eine Formel beinhaltet, kann ich leider nicht angeben, wo dieser Wert in meiner Tabelle gespeichert werden soll. Ich habe mir ein zweites Textfeld angelegt und übergebe derzeit meinen Wert per Makro und manuellem Klick von dem einen in das andere Textfeld, das dann an die Tabelle gebunden ist. Gibt es eine Möglichkeit, einen errechneten Wert in einem Textfeld in einer Tabelle zu speichern, wenn im Steuerelementeinhalt eine Formel verwendet wird?
ANTWORT: Wenn in "Steuerelementeinhalt" eines Feldes eine Formel steht, kann es nicht mehr an eine Tabelle gebunden werden. Sie können aber die Formel bzw. die notwendigen Berechnungen in eine Ereignisprozedur verlagern. Wenn zum Beispiel nach Änderung eines gebundenen Feldes "Mehrwertsteuer" der Inhalt eines ebenfalls gebundenen Feldes "Brutto" gesetzt oder geändert werden soll, stellen Sie für das Feld "Mehrwertsteuer" die Eigenschaft "Nach Aktualisierung" auf den Eintrag "[Ereignisprozedur]" ein. Klicken Sie dann auf die Schaltfläche mit den drei Punkten, um den VBA-Editor zu öffnen. Dort geben Sie nun zum Beispiel folgende Anweisungen ein:
On Error Resume Next
Me.Brutto = Me.Netto * (Me.Mehrwertsteuer / 100 + 1)
Genauso gehen Sie beim Feld "Netto" vor, damit Änderungen daran sich ebenfalls im Feld "Brutto" niederschlagen: Stellen Sie die Eigenschaft "Nach Aktualisierung" auf den Eintrag "[Ereignisprozedur]" ein und klicken Sie auf die Schaltfläche mit den drei Punkten, um den VBA-Editor zu öffnen. Dort geben Sie nun die gleichen Anweisungen wie beim Feld "Mehrwertsteuer" ein. Wenn nun im Feld "Netto" oder im Feld "Mehrwertsteuer" eine Änderung erfolgt, wird das Feld "Brutto" automatisch aktualisiert.
Daten an bestimmter Position in Tabelle einfügen
Versionen: Access 2003, 2002/XP, 2000 und 97
Ich möchte in einem Formular die Möglichkeit des nachträglichen Einfügens realisieren. Der Anwender hat ein Endlosformular und möchte an einer beliebigen Stelle im nachhinein Daten einfügen, die dann an dieser Position stehen sollten. Wie könnte ich das realisieren?
Das geht leider nicht ohne extrem aufwändige Programmierung: Die Reihenfolge, in der die Datensätze angezeigt werden, ergibt sich entweder chronologisch (ältester Datensatz am Anfang, neuester Datensatz am Ende), durch den Primärschlüssel, durch eine im Tabellenentwurf eingestellte Indizierung oder durch die in einer Abfrage festgelegte Sortierung. Ein Datensatz kann nur an einer bestimmten Position eingefügt werden, wenn zum Beispiel eine laufende Nummer verwendet und nach ihr sortiert und diese Nummer beim Einfügen eines neuen oder beim Löschen eines vorhandenen Datensatzes entsprechend per VBA angepasst wird. Dieser Mechanismus kann darüber hinaus durcheinander geraten, wenn Datensätze zum Beispiel per Bearbeiten-Am Ende anfügen hinzugefügt werden, da sich dieser Vorgang nicht abfangen und somit die laufende Nummerierung nicht anpassen lässt.
Pfadangaben in Feldern ändern
Versionen: Access 2007, 2003, 2002/XP und 2000
FRAGE: Ich habe meine Musiksammlung in Access erfasst. Dazu habe ich für alle Objekte das Cover eingescannt und den Pfad in einem Textfeld festgehalten. Nun habe ich aber die Verzeichnisse geändert und möchte mit einer Aktualisierungsabfrage einen Teil des Pfades ändern, was mir aber nicht gelingen will. Der alte Pfad lautete z.B. "L:\Meine Daten\Cover\CD's\BAP - Affjetaut". Diesen möchte ich nun ändern in "L:\Meine Daten\Cover\Musik\Access Musikprogramm\96 dpi\12 cm\CD's\BAP - Affjetaut" Geändert werden muss also nur der Teil "L:\Meine Daten\Cover\Musik\Access Musikprogramm\96 dpi\12 cm\CD's\"
M. Dose
ANTWORT: Diese Aufgabe lässt sich mit Hilfe einer VBA-Funktion erledigen, die zunächst den ursprünglichen Pfad in einzelne Verzeichnisnamen aufteilt und den neuen Pfad mit dem Namen des letzten Verzeichnisses des ursprünglichen Pfades zu einem neuen Pfad zusammensetzt. Die Funktion "NeuerPfad()", die Sie in ein neues oder vorhandenes Modul kopieren, erledigt diese Aufgabe:
Function NeuerPfad(varPfad As Variant) As Variant
Dim tmp As Variant
Dim strLetzterVerzName As String
'Alter Pfad: "L:\Meine Daten\Cover\CD's\" & _
"BAP - Affjetaut"
Const cstrNeuerPfad = _
"L:\Meine Daten\Cover\Musik\ Access" & _
"Musikprogramm\96 dpi\12 cm\CD's\"
On Error Resume Next
If IsNull(varPfad) Then Exit Function
tmp = Split(varPfad, "\")
strLetzterVerzName = tmp(UBound(tmp))
NeuerPfad = cstrNeuerPfad & strLetzterVerzName
End Function
Die Funktion teilt den als Parameter übergebenen Pfad anhand des Trennzeichens "\" in ein Array "tmp(0 to n)" auf. Das letzte Element des Arrays ist dann der Verzeichnisname, der erhalten bleiben soll. Dieser wird mit dem in "cstrNeuerPfad" definierten Pfad zusammengesetzt und als Funktionsergebnis übergeben.
In der Aktualisierungsabfrage tragen Sie in der Zeile "Aktualisieren:" folgenden Ausdruck ein:
=NeuerPfad([Feldname])
"Feldname" ersetzen Sie dabei durch den Namen des Feldes, in dem der Pfad gespeichert ist.
Tabellenstruktur per SQL kopieren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Über das Datenbankfenster kann ich bekanntlich die Struktur einer Tabelle recht einfach über Strg+C, Strg+V und Wahl der Option Nur Struktur kopieren. Wie lässt sich das aber per VBA erledigen?
Setzen Sie dazu "DoCmd.RunSQL" wie folgt ein:
strQuelle = "[Artikel]"
strZiel = "[Artikel/Neu]"
DoCmd.RunSQL "SELECT " & _
strQuelle & ".* INTO " & _
strZiel & " FROM " & _
strQuelle & " WHERE 1=0"
"SELECT INTO" wird normalerweise eingesetzt, um Datensätze aus einer Tabelle in eine andere Tabelle zu kopieren. Ist die Zieltabelle nicht vorhanden, wird sie automatisch mit der Struktur der Quelltabelle angelegt. Das nutzen wir hier, sorgen aber durch ein nie erfülltes "WHERE"-Kriterium von "1=0" dafür, dass keine passenden Datensätze gefunden werden können. "SELECT INTO" legt dann nur wie gewünscht die Struktur der Tabelle an.
Unterdatenblatt-Anzeige abschalten
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: Ihr Tipp "So schalten Sie die automatische Unterdatenblatt-Anzeige ab" aus Access Weekly vom 1.12.2006 funktioniert bei mir nicht! Ich habe die Eigenschaft "Unterdatenblattname" auf den Eintrag "[Keines]" eingestellt, die Tabelle gespeichert, geschlossen. Wieder im Entwurf geöffnet - im Eintrag steht wieder "[Automatisch]"! Woran kann das liegen?
ANTWORT: Vermutlich handelt es sich um eine eingebundene Tabelle. In diesem Fall müssen die Änderungen in der Datenbank vorgenommen werden, aus der Sie die Tabelle eingebunden haben.
Verknüpfte Tabellen schnell auflisten
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Wenn Sie in einer Datenbank nur die verknüpften Tabellen und deren Ursprungsdatenbanken auflisten möchten, erstellen Sie eine neue Abfrage und wählen das Menü Ansicht-Sql (in Access 2007 wechseln Sie auf die Multifunktionsleiste "Entwurf" und klicken auf Ansicht-SQL-Ansicht) an. Geben Sie dann im SQL-Editor die folgenden Anweisungen ein:
SELECT Name, ForeignName, Database
FROM MSysObjects
WHERE MSysObjects.Type=6;
Lassen Sie die Abfrage ausführen und es erscheinen alle gewünschten Informationen. In der versteckten Tabelle "MsysObjects" hält Access Informationen zu allen Objekten der Datenbank fest; unter anderem auch zu verknüpften Tabellen, die Sie über den Typ "6" identifizieren können. "Name" liefert den Namen, so wie er bei der Verknüpfung definiert wurde bzw. im Datenbank-Fenster angezeigt wird, "ForeignName" den Namen der Tabelle, so wie er in der Ursprungsdatenbank festgelegt ist und "Database" ist der Pfad/Dateiname der Ursprungsdatenbank.
ZÄHLENWENN-Funktion von Excel in Access nutzen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Ich entwickle gerade eine Access-Datenbank, in der eine umfangreiche Excel-Tabelle integriert werden soll und das mit möglichst wenig Aufwand. In dieser Excel-Tabelle finde ich nun eine Formel/Funktion folgenden Inhalts:
=ZÄHLENWENN('Fragenblock I'!A3:A446;3)
Die letzte Ziffer (hier z.B. "3", das Spektrum geht von "1" bis "4") bezeichnet den Inhalt eines Feldes "Zufriedenheit" in den Datensätzen, deren Anzahl (nicht Summe!), ich benötige. Diese Formel (oder eine ähnliche) benötige ich auch in Access.
Für solche Aufgaben stellt Access die sogenannten "Domänen-Funktionen" zur Verfügung. Diese Funktionen ermitteln für eine Domäne (= Tabelle, Abfrage) zum Beispiel die Summe, die Anzahl oder einen Minimal-, Mittel oder Höchstwert für ein bestimmtes Feld. Dabei kann ein Kriterium angegeben werden, dass die auszuwertenden Datensätze einschränkt. Wenn wir einmal davon ausgehen, dass die Excel-Daten in einer Tabelle "ExcelImport" gespeichert sind und es ein Feld "Zufriedenheit" vom Datentyp "Zahl" mit den möglichen Inhalten "1" bis "4" gibt, von denen Sie die Anzahl der Datensätze mit Feldinhalt "3" interessiert, käme folgende VBA-Anweisung zum Einsatz:
lngAnz = DCount("*", "ExcelImport",
"[Zufriedenheit] = 3")
Um eine Abfrage zu erstellen, die das benötigte Ergebnis liefert, gehen Sie wie folgt vor:
1. Erstellen Sie eine neue Abfrage mit der Tabelle "ExcelImport" als Basis.
2. Wählen Sie das Menü Ansicht-Funktionen an oder klicken Sie auf das Symbol Funktionen.
3. Doppelklicken Sie zweimal auf den Feldnamen "Zufriedenheit", um das Feld zum Abfrageentwurf hinzuzufügen. Es erscheint nun zweimal mit der Funktion "Gruppieren" im Entwurf.
4. Ändern Sie die Einstellung "Sortierung" der ersten Spalte auf "Aufsteigend".
5. Ändern Sie die Einstellung "Funktion" in der zweiten Spalte auf "Anzahl".
6. Lassen Sie die Abfrage ausführen.
Als Ergebnis erhalten Sie nun eine Übersicht, wie viele Datensätze jeweils mit Zufriedenheit "1", "2", "3" und "4" vorhanden sind. Möchten Sie nur die Anzahl für eine bestimmte Zufriedenheit ermitteln, tragen Sie im Feld "Kriterien" der ersten Spalte zum Beispiel "[Zufriedenheit] = 3" ein.
Anweisung 'End' führt zum Absturz
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich verwende die folgenden Ereignisprozeduren in der Datenbank:
Private Sub S_Spei_Click()
'Schaltfläche zum Speichern
DoCmd.RunCommand acCmdSaveRecord
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me.Bezeichnung) Then
'Abfrage, ob Feld ausgefüllt wurde
MsgBox "Bitte geben Sie eine Bezeichnung ein!"
Me.Bezeichnung.SetFocus
End
'NICHT Exit Sub, da mehrfach benutzt (siehe oben)!
End If
End Sub
In der Vollversion von Access funktioniert das einwandfrei: Beim Versuch zu Speichern kommt der Hinweis (MsgBox), dass die Bezeichnung einzugeben ist. Danach wird der Cursor in das entsprechende Feld gesetzt und die Prozedur wird ohne Fehlermeldung beendet. In der Runtime-Version erfolgt zwar auch die Mitteilung, danach steigt Access aber mit einem Laufzeitfehler einfach aus! Woran kann das liegen? Haben Sie eine Lösung für mein Problem?
M. Palapies
ANTWORT: Sowohl "End" als auch "Exit Sub" sind Anweisungen, die Sie in diesem Kontext nicht benötigen, da nach dieser Abfrage kein weiter Code, sondern nur noch "End Sub" folgt. Löschen Sie also die Anweisung "End". Geben Sie aber statt dessen die Anweisung "Cancel = True" ein, damit Access die Speicherung des Datensatzes abbricht - dann wird auch in der Runtime-Version das Feld wie erwartet aktiviert und es kann eine neue Eingabe erfolgen.
DAO-Version per VBA ermitteln
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Ich muss für Support-Zwecke feststellen können, welche DAO-Version(en) auf einem System installiert sind. Sicherlich lassen sich diese Informationen irgendwie aus der Registry auslesen, aber die zu befragenden Anwender sind aber nicht in der Lage, mit "RegEdit" umzugehen und Access stellt keine Funktionen zum Auslesen der Registry zur Verfügung.
Kopieren Sie die folgende Funktion in ein beliebiges Modul:
Function CheckDAO() As String
Dim objTmp As Object
Dim strVers As String
On Error Resume Next
Set objTmp = CreateObject("DAO.DBEngine.35")
If Err = 0 Then strVers = "DAO 3.5, "
Err.Clear
Set objTmp = CreateObject("DAO.DBEngine.36")
If Err = 0 Then strVers = strVers & "DAO 3.6, "
Err.Clear
Set objTmp = CreateObject("DAO.DBEngine.120")
If Err = 0 Then strVers = strVers & "DAO 12.0, "
If strVers = "" Then
strVers = "Kein DAO installiert..."
ElseIf Right$(strVers, 2) = ", " Then
strVers = Left$(strVers, Len(strVers) - 2)
End If
Set objTmp = Nothing
CheckDAO = strVers
End Function
Legen Sie in einem Formular eine Schaltfläche an und kopieren Sie die folgende Anweisung in die Ereignisprozedur "Beim Klicken":
MsgBox CheckDAO()
Die Funktion Versucht der Reihe nach für die aktuellen Version 3.5, 3.6 und 12.0 (Access 2007) per "CreateObject()" ein DBEngine-Objekt zu initialisieren. Bei Erfolg wird die jeweilige Version in einen Ergebnisstring aufgenommen. Die Rückmeldung ist dann zum Beispiel "DAO 3.6, DAO 12.0", "DAO 3.5, DAO 3.6", "DAO 3.6" oder "Kein DAO installiert...".
Datenbankfenster per VBA einblenden
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Über Extras-Start bzw. Access-Optionen/Aktuelle Datenbank wird das Datenbankfenster/der Navigationsbereich beim Start ausgeblendet. Für Wartungsarbeiten soll nun das Datenbankfenster/der Navigationsbereich über eine Schaltfläche in einem Formular wieder eingeblendet werden können. Die über Extras-Start bzw. Access-Optionen/Aktuelle Datenbank gesetzten Einstellungen sind jedoch Datenbankeigenschaften, die man nicht per VBA vorübergehend ein-/ausschalten kann, da das einen Neustart der Datenbank erfordern würde.
Das Problem lässt sich einfacher lösen, indem kurzerhand ein Objekt im Datenbankfenster/Navigationsbereich markiert wird - Access blendet daraufhin das Datenbankfenster bzw. den Navigationsbereich automatisch ein:
Private Sub btnDBWindow_Click()
On Error Resume Next
DoCmd.SelectObject acTable, , True
End Sub
Datenbankfenster per VBA einblenden
Versionen: Access 2003, 2002/XP, 2000 und 97
FRAGE: Über Extras-Start wird das Datenbankfenster beim Start ausgeblendet. Für Wartungsarbeiten soll nun das Datenbankfenster über eine Schaltfläche in einem Formular wieder eingeblendet werden. Welche VBA-Anweisung muss dazu verwendet werden?
ANTWORT: Die über Extras-Start gesetzten Einstellungen sind Datenbankeigenschaften, die man zwar per VBA zurücksetzen kann, anschließend müsste aber die Datenbank erneut geöffnet werden, damit die Änderungen wirksam werden - zumal das Datenbankfenster dann auch wieder dauerhaft angezeigt werden würde. Einfacher lässt sich das Problem lösen, indem einfach irgendein Objekt im Datenbankfenster markiert wird - Access blendet daraufhin das Datenbankfenster automatisch ein:
Private Sub btnDBWindow_Click()
On Error Resume Next
DoCmd.SelectObject acTable, , True
End Sub
Datensatz per VBA speichern
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Nach der Eingabe von Daten in einem Formular soll der Datensatz sofort gespeichert werden, damit dieser gleich gedruckt werden kann. Bisher haben Sie dazu eventuell die folgende Anweisung verwendet, um den Befehl "Datensatz speichern" zu simulieren:
SendKeys "+{ENTER}"
Leider funktioniert "SendKeys" unter Windows Vista nicht mehr. Um das Problem zu lösen, ersetzen Sie Ihre SendKeys-Anweisung einfach durch folgende Anweisung:
DoCmd.RunCommand acCmdSaveRecord
Damit wird der Datensatz ebenfalls gespeichert und kann anschließend sofort gedruckt werden.
Ereignis 'ExecuteComplete' nutzen
Versionen: Access 2007, 2003, 2002/XP und 2000
FRAGE: Wenn ich eine Aktualisierungsabfrage via VBA ausführe und anschließend den Primärindex auf das damit gefüllte Feld erstellen will, erhalte ich eine Fehlermeldung ("Feld darf keine Null enthalten"). Beim Debuggen Schritt für Schritt tritt der Fehler nicht auf. Meine Frage: Kann ggf. das ExecuteComplete-Ereignis verwendet werden? Wie kann ich es auslösen, wenn die Subroutine in einem Modul läuft?
ANTWORT: In einem Modul können Sie generell keine Ereignisse nutzen, das geht nur in einem Klassenmodul (zum Beispiel "clsConnStuff). Deklarieren Sie dort ein entsprechendes Objekt:
Private WithEvents MyConn As ADODB.Connection
Initialisieren Sie das Objekt in "Class.Initialize" mit
Set MyConn = CurrentProject.Connection
und dereferenzieren Sie es in "Class.Terminate" mit
Set MyConn = Nothing
Erstellen Sie im Klassenmodul eine oder mehrere "Public Sub SubName(<Parameters>)", in denen über "MyConn.Execute" die entsprechenden Anweisungen mit entsprechender Parameterübergabe ausgeführt werden. Nach Abschluss der Ausführung wird dann "ExecuteComplete" ausgelöst und "MyConn_ExecuteComplete" aufgerufen, wo Sie die benötigten Anweisungen unterbringen. In einem Modul können Sie die Klasse beispielsweise per
Dim MyConnStuff As New clsConnStuff
oder
Dim MyConnStuff As clsConnStuff
Set MyConnStuf = New clsConnStuff
instanziieren und die gewünschten Aktionen per
MyConnStuff.SubName <Parameters>
ausführen. Aufgeräumt wird abschließend mit
Set MyConnStuff= Nothing
Komfortable Sicherheitsabfragen
Versionen: Access 2007, 2003, 2002/XP und 2000
In Ihren VBA-Lösungen zeigen Sie immer wieder "Ja/Nein"-Sicherheitsabfragen der Form "Datensatz wirklich löschen?" oder "Bericht jetzt drucken?" an. Die damit verbundenen Anweisungen für "MsgBox()" und die Abfragen des Ergebnisses müssen immer wieder in gleicher Form eingetippt werden. Einfacher geht es wie folgt:
* Legen Sie sich in einem globalen Modul die folgende Funktion an:
Function FragenJaNein(strMsg As String, _
strTitle As String) As Boolean
Dim intTaste As Integer
Beep
intTaste = MsgBox(strMsg, _
vbYesNo + vbQuestion, strTitle)
FragenJaNein = (intTaste = vbYes)
End Function
* Nun können Sie bei Bedarf einen einfachen Aufruf wie folgt verwenden:
If FragenJaNein("Datensatz löschen?", _
"Löschen:")= True Then
'hier Datensatz löschen...
End If
Namen des aktiven Steuerelementes abfragen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich möchte in einer globalen VBA-Routine feststellen, welches Formular ein Anwender gerade geöffnet hat und welches Feld in diesem Formular momentan aktiviert ist, finde aber keine Informationen dazu. Können Sie mir einen Tipp geben?
ANTWORT: Für diese Abfragen stellt Access das Objekt "Screen" zur Verfügung. Die Eigenschaft "ActiveForm" enthält eine Referenz auf das aktuell verwendete Formular, die Eigenschaft "ActiveControl" auf das Steuerelement, das momentan den Fokus hat und die Eigenschaft "PreviousControl" gibt Auskunft, welches Steuerelemente vor "ActiveControl" den Fokus hatte. Den Namen des Formulars ermitteln Sie beispielsweise wie folgt:
strFormName = Screen.ActiveForm.Name
Den Namen des aktivierten oder vorherigen Steuerelementes ermitteln Sie zum Beispiel so:
strCurrCtrlName = Screen.ActiveControl.Name
strPrevCtrlName = Screen.PreviousControl.Name
Über diese Referenzen können Sie auch Eigenschaften von Formularen und Steuerelementen ändern und Methoden aufrufen und so beispielsweise in einer Plausibilitätsprüfung ein Feld farblich hervorheben und aktivieren:
With Screen.ActiveControl
.ForeColor = QBColor(12) 'Hellrot
MsgBox "Ungültige Eingabe!"
.SetFocus
End With
Bitte beachten Sie, dass oftmals "PreviousControl" statt "ActiveControl" verwendet werden muss: Wenn Sie zum Beispiel in einem Formular eine Schaltfläche Speichern verwenden und darüber eine globale Routine zur Überprüfung eines Feldinhaltes aufrufen, so referenziert "ActiveControl" die Schaltfläche und "PreviousControl" das Feld!
Symbol zu einer bestimmten Datei ermitteln
Versionen: Access 2007, 2003, 2002/XP und 2000
FRAGE: Ich setze für die Verwaltung von Dokumentpfaden (Korrespondenz, Bilder etc.) ein TreeView- sowie ein ImageList-Control ein, um Dateien strukturiert anzeigen zu können. Nun habe ich von der Möglichkeit erfahren, dass man über die Datei-Erweiterung des gespeicherten Dateinamens das Symbol (Icon) aus den in Windows registrierten Dateitypen automatisch auslesen und an das ImageList-Control übergeben kann. Wie funktioniert das?
ANTWORT: Dazu setzen Sie eine Kombination aus den API-Funktionen "SHGetFileInfo()" und "OleCreatePictureIndirect()" ein. Mit "SHGetFileInfo()" wird zunächst das zu einer Datei gehörende Symbol bei Windows abgefragt. "OleCreatePictureIndirect()" konvertiert es dann in eine Bitmap, die in der ImageList gespeichert werden kann. Kopieren Sie zunächst die folgenden Deklarationen und Funktionen in ein neues oder ein vorhandenes Modul:
strFName = Z:\Test\Beispiel.doc"
ilBilder.ListImages.Add( _
Picture:= GetFileIcon(strFName, _
SHGFI_SMALL)
In Zukunft können Sie dann die Funktion "GetFileIcon()" beispielsweise wie folgt aufrufen:
strFName = Z:\Test\Beispiel.doc"
ilBilder.ListImages.Add( _
Picture:= GetFileIcon(strFName, _
SHGFI_SMALL)
Dieses Beispiel würde der ImageList ein kleines Symbol (16*16) für Word-Dokumente hinzufügen. Möchten Sie das große Symbol (32*32) auslesen, geben Sie als zweiten Parameter "SHGFI_LARGE" an.
Unerklärliche Phänomene beim Ausführen von VBA-Prozeduren
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Seitdem ich eine Access-Datenbank auf ein anderes System kopiert habe, funktionieren VBA-Prozeduren nicht mehr gewohnt. Zum Beispiel:
Private Sub Form_Open(Cancel As Integer)
Me.Filter = "([Min von Datum] > Now()-4) "
'AND ([Min von Datum] < Now()+28)"
Me.FilterOn = True
If [Min von Datum] = _
Format(Now, "dd, dd.mm.yy") Then
DoCmd.OpenForm "Heute", , , stLinkCriteria
End If
End Sub
Es wird eine Fehlermeldung angezeigt und "Format" ist gelb unterlegt. Kombinationsfelder funktionieren auch nicht mehr. Wenn ich beim Formular-Editor einen Assistenten nutzen will, wird ebenfalls eine Fehlermeldung angezeigt. Was tun?
Dieses Problem kann mit jeder Access-Version und mit jedem Betriebssystem auftreten: In der urspünglichen Installation hatten Sie eine Komponente referenziert, die jetzt in der Windows-Installation nicht mehr zur Verfügung steht. Dadurch wird die VBA-Initialisierung blockiert und es können keine Assistenten ausgeführt werden, die VBA nutzen.
Um herauszufinden, welche Komponente die Ursache ist, bestätigen Sie die Fehlermeldung mit "Debuggen" und klicken dann auf das Stop-Symbol in der VBA-Entwicklungsumgebung. Wählen Sie nun Extras-Verweise an. Hier gibt es einen oder mehrere Einträge "NICHT VORHANDEN: Name der Komponente". Prüfen Sie die Einträge und entfernen Sie bei den Einträgen, die eine nicht benötigte Komponente bezeichnen, das Häkchen im Kontrollkästchen. Bei den benötigten Komponenten wie zum Beispiel speziellen ActiveX-Komponenten müssen Sie sicherstellen, dass sie auch in der neuen Installation vorhanden sind und ggf. das Setup der Komponenten in der neuen Installation ausführen.
Variablennamen flexibel zusammensetzen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Gibt es mit VBA die Möglichkeit Variablennamen aus einer Variablen zusammenzustellen? Beispiel ich habe fünf Variablen mit der Bezeichnung Z1, Z2, Z3, Z4, Z5. Diese möchte ich nun in einer Zählschleife nach folgendem Muster abarbeiten:
For A = 1 To 5
StringA = "Z" & CStr(A)
.....
Next A
Hier sollte nun die Variable "StringA", die je nach Schleife den Inhalt "Z1", "Z2" etc. hat, eine zuvor deklarierte Variable Z1, Z2 etc. ansprechen.
ANTWORT: Das ist leider nicht möglich, Variablennamen müssen in VBA immer konstant angeben werden. Eventuell können Sie sich hier mit versteckten Textfeldern (Sichtbar= Nein) im Formular behelfen, die Sie "Z1", "Z2" etc. benennen und mit den entsprechenden Inhalten füllen. Darauf können Sie dann in einer Schleife wie folgt zugreifen:
For A = 1 To 5
varWert = Me.Controls("Z" & CStr(A))
Next A
Über die "Controls"-Auflistung können Sie jedes einzelne Steuerelement im Formular anhand des Namens adressieren. Dabei kann auch eine Variable oder - wie hier - ein Ausdruck verwendet werden, aus dem sich der Name des Feldes ergibt.
VBA-Code in Access 2007 dauerhaft freigeben
Versionen: Access 2007
Wenn ich in Access 2007 aus den lokalen Vorlagen eine neue Datenbank erstelle oder eine solche Datenbank später erneut lade, wird immer eine Symbolleiste "Sicherheitswarnung" angezeigt und ich muss über die Schaltfläche Optionen jedes Mal Diesen Inhalt aktivieren einstellen. Kann man diese Aktivierung nicht irgendwo dauerhaft für eine Datenbank einstellen?
Neu erstellte Datenbanken werden von Access im Verzeichnis "Eigene Dateien" des jeweils angemeldeten Anwenders angelegt. Dieses Verzeichnis gehört jedoch nicht zu den "vertrauenswürdigen Speicherorten", aus denen Access eine Datenbank ohne diese Sicherheitswarnung öffnen würde. Wenn Sie dieses Verzeichnis zu den vertrauenswürdigen Speicherorten hinzufügen, wird die Sicherheitswarnung nicht mehr angezeigt und der Inhalt automatisch aktiviert:
1. Klicken Sie auf das Office-Symbol und dann auf Access-Optionen.
2. Wechseln Sie in den Bereich "Vertrauensstellungscenter".
3. Klicken Sie auf die Schaltfläche Einstellungen für das Vertrauensstellungscenter.
4. Wechseln Sie in den Bereich "Vertrauenswürdige Speicherorte".
5. Klicken Sie auf die Schaltfläche Neuen Speicherort Hinzufügen.
6. Lokalisieren Sie das Verzeichnis "Eigene Dateien" unter "Dokumente und Einstellungen\ Anmeldename". Wenn Sie dort mit Unterverzeichnissen arbeiten, aktivieren Sie die Option Unterordner Dieses Speicherortes Sind Ebenfalls Vertrauenswürdig.
7. Klicken Sie dreimal auf Ok, um die Änderungen zu übernehmen und alle Dialoge zu schließen.
Windows-Anmeldenamen eines Benutzers auslesen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: In der Access Weekly-Ausgabe vom 14. März 2008 haben Sie zum Thema "Windows-Anmeldenamen ermitteln" eine Lösung mit API-Funktion vorgestellt. Diese Information könnte man doch auch mit folgender VBA-Funktion abfragen:
Public Function NetworkUsername()
NetworkUsername = Environ$("Username")
End Function
ANTWORT: Zunächst einmal vielen Dank für die zahlreichen Zuschriften und Hinweise zu diesem Beitrag. Die oben erwähnte Lösung funktioniert zwar generell, es ist aber zu beachten, dass sie auf einer Umgebungsvariablen basiert, die auf vielen System aus Sicherheitsgründen nicht vorhanden ist und deren Inhalt außerdem beliebig festgelegt werden kann und somit nicht zwingend den Windows- Anmeldenamen enthält, also relativ unzuverlässig ist. Öffnen Sie einmal ein MS-DOS-Fenster und geben Sie folgende Zeile ein:
set USERNAME=Testuser
Der Aufruf obiger VBA-Funktion meldet nun "Testuser" und somit nicht den Windows-Anmeldenamen. Öffnen Sie erneut ein DOS-Fenster und geben Sie folgende Zeile ein:
set USERNAME=
Die VBA-Funktion meldet jetzt eine leere Zeichenkette, da die Umgebungsvariable durch obige Anweisung gelöscht wurde. Alle aktuellen Umgebungsvariablen und deren Inhalte können übrigens mit der Eingabe von
set
aufgelistet werden.
Um den Windows-Anmeldenamen also unter allen Umständen zuverlässig auszulesen, empfehlen wir dringend den Einsatz der API-basierten Lösung.
Windows-Anmeldenamen ermitteln
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich muss zur Benutzererkennung die Anmeldedaten unter XP ermitteln. Könnten Sie mir dazu weitere Informationen mitteilen?
ANTWORT: Die gesuchte API-Funktion ist "GetUserName()", die Sie zunächst im allgemeinen Teil eines neuen oder vorhandenen Moduls wie folgt deklarieren müssen:
Declare Function GetUserName _
Lib "advapi32.dll" _
Alias "GetUserNameA" ( _
ByVal lpBuffer As String, _
nSize As Long) As Long
Anschließend wird die API-Funktion über eine "API Wrapper"-Funktion "NetworkUsername()", die Sie ins gleiche Modul kopieren, wie folgt genutzt:
Function NetworkUsername() As String
Dim lngMaxLen As Long, lngResult As Long
Dim strUsername As String
strUsername = String$(254, 0)
lngMaxLen = 255
lngResult = GetUserName(strUsername, lngMaxLen)
If lngResult <> 0 Then
NetworkUsername = Left$(strUsername, lngMaxLen - 1)
Else
NetworkUsername = "???"
End If
End Function
Der API-Funktion werden zwei Parameter übergeben: Eine String-Variable, die nach dem Aufruf den Namen beinhaltet und eine numerische Variable, die festlegt, wie viele Zeichen maximal in der String-Variable abgelegt werden können. Das eigentliche Funktionsergebnis von "GetUserName()" ist entweder "True/-1" oder "False/0". Bei erfolgreicher Ausführung beinhaltet der Parameter "lngMaxLen" die Anzahl der Zeichen, die in "strUserName" zurückgeliefert wurden, so dass dieser Wert für die Zuweisung des Funktionsergebnisses über "NetworkUsername = Left$(strUserName, lngMaxLen - 1)" herangezogen werden kann.
Mit Hilfe dieser Funktion können Sie nun den Anmeldenamen abfragen:
strUserName = NetworkUsername()
Access-Datenbank schützen
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Ich habe eine Datenbank zusammengestellt, die vertrauliche Daten enthält. Ich muss die Datenbank schützen und zwar zum einen so, dass niemand die Struktur der Datenbank verändern kann. Dazu verwende ich ein Administrator-Kennwort. Meine Kollegen sollen aber mit der Datenbank arbeiten und Daten eingeben und auswerten können! Wie gehe ich dazu am besten vor?
ANTWORT: Dazu müssen Sie Access bis zur Version 2003 im sogenannten "Arbeitsgruppenmodus" einsetzen. Ab Access 2000 steht unter Extras-Sicherheit der Benutzerdatensicherheits-Assistent zur Verfügung, der Sie Schritt für Schritt durch die notwendigen Aktionen leitet. Für eine manuelle Einrichtung kopieren Sie zunächst die aktuelle SYSTEM.MDW in ein zentrales Netzwerkverzeichnis, das von Ihnen und den Kollegen erreichbar ist und für das volle Zugriffsrechte eingestellt sind. Den Speicherort der SYSTEM.MDW bringen Sie im Direktfenster der VBA-Entwicklungsumgebung mit folgender Eingabe in Erfahrung:
? SysCmd(acSysCmdGetWorkgroupFile)
Das Ergebnis ist zum Beispiel "C:\ Programme\ Gemeinsame Dateien\ System\ SYSTEM.MDW". Starten Sie nach dem Kopieren den Arbeitsgruppenadministrator über das Menü Extras-Sicherheit-Arbeitsgruppenadministrator bzw. über die Verknüpfung MS Access Arbeitsgruppen-Administrator im Office-Installationsverzeichnis. Klicken Sie auf Beitreten und lokalisieren Sie die eben kopierte SYSTEM.MDW im Netzwerk. Dieser Schritt ist auf allen Arbeitsstationen auszuführen, von denen aus im Arbeitsgruppenmodus gearbeitet werden soll! Anschließend können Sie über die Funktionen unter Extras-Sicherheit bzw. Extras-Zugriffsrechte Gruppen und Benutzer anlegen bzw. Zugriffsrechte gezielt für einzelne Datenbankobjekte setzen. Zu Einzelheiten konsultieren Sie unbedingt die Dokumentation bzw. die Hilfe zum Thema "Arbeitsgruppenmodus"!.
Wichtige Hinweise: Es ist zwar möglich, mit dem Arbeitsgruppenadministrator eine neue Arbeitsgruppe zu erstellen (Schaltfläche Erstellen), wenn Sie jedoch die vorhandene SYSTEM.MDW als Basis verwenden, können Sie einige Einstellungen und eventuell bereits vorhandene Gruppen-/Benutzerkonten mitnehmen.
Ab Access 2007 wird kein Arbeitsgruppenmodus mehr unterstützt! Hier müssen die Zugriffsrechte über den Server des Back-Ends verwaltet werden.
Arbeitsgruppenmodus ohne Anmeldung?
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
FRAGE: Wir setzen eine Datenbank im Arbeitsgruppenmodus ein. Beim öffnen kommt sofort ein Anmeldefenster zur Eingabe von Benutzername und Kennwort. Wir möchten jedoch ein eigenes Login-Formular verwenden, da mit diesem Formular noch Daten in Abhängigkeit des Benutzers bereitgestellt werden sollen. Wie kann man die erste Anmeldung umgehen, da nicht zweimal Benutzername und Kennwort eingeben werden soll oder kann man Name und Kennwort der ersten Anmeldung irgendwie übernehmen?
ANTWORT: Den Anmeldedialog von Access können Sie nur umgehen, indem Sie den Arbeitsgruppenmodus ausschalten oder die Datenbank über eine Verknüpfung aufrufen und die Kommandozeilen-Parameter "/user Benutzername" und "/pwd Kennwort" nutzen. Der Name des angemeldeten Anwenders kann über die Funktion "CurrentUser()" abgefragt werden, ein Zugriff auf das Kennwort ist nicht möglich.
Benutzer- und Gruppenberechtigungen unter Access 2007
Versionen: Access 2007
Meine Frage beschäftigt sich mit den etwas komplizierten Benutzer- und Gruppenberechtigungen: Bis Access 2003 war es möglich, eine eigene Arbeitsgruppendatei zu erstellen. Durch das richtige Vergeben von Benutzer- und Gruppenrechten bzw. das Entfernen der Standardrechte, war es möglich, eine Datenbank so zu sichern, dass das Berechtigungssystem nicht durch einen einfachen Wechsel der Arbeitsgruppendatei umgangen werden konnte. Eine solche, gesicherte MDB soll nun nach Access 2007 überführt werden. Wie können dabei die Sicherheitseinstellungen erhalten werden?
Mit Access 2007-Datenbanken (ACCDBs) ist eine Steuerung der Zugriffsrechte auf Basis von Benutzern und Gruppen nicht mehr möglich. Hier müssen Sie eine SQL Server-basierte Lösung einsetzen und die Zugriffsrechte über den SQL Server steuern. Sie können Datenbanken aus früheren Versionen aber unkonvertiert unter 2007 im Kompatibilitätsmodus laufen lassen, in dem alle Funktionen der älteren Versionen verfügbar sind. In diesem Modus lassen sich allerdings die neuen Funktionen von Access 2007 nicht nutzen.
Gemeinsamer Zugriff auf Datenbank nicht mehr möglich
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
Bei einer Access-Anwendung ist der gemeinsame Zugriff auf die Datenbank plötzlich nicht mehr möglich. Sobald ein Benutzer die Datenbank geöffnet hat, erhalten alle anderen die entsprechende Meldung. Die Einstellung 'Gemeinsamer Zugriff' ist überall korrekt eingestellt, die Rechte auf dem Server sind kontrolliert (Vollzugriff). Ich erinnere mich an einen Tipp, der auf mögliche Probleme mit einem Virenscanner verweist. Könnte hier die Ursache liegen?
Ein Virenscanner dürfte in diesem Fall nicht die Ursache sein. Vielmehr hat wahrscheinlich irgendein Anwender irgendwann einmal eine Datenbank über Datei-Öffnen geöffnet und im Dateiauswahl-Dialog die Option Exklusiv öffnen (ab Access 2000) bzw. Exklusiv (Access 97) aktiviert. Diese Einstellung hält Access dauerhaft fest, so dass nun zum Beispiel beim Öffnen einer Datenbank per Doppelklick im Windows-Explorer oder auf eine Verknüpfung jede Datenbank wieder mit der Einstellung Exklusiv öfnen geöffnet wird. Sie müssen sich nun einmal an jede Arbeitsstation begeben, von der aus die betreffende Datenbank genutzt wird, dort in Access Datei-Öffnen anwählen, irgendeine Datenbank auswählen die Option Exklusiv öffnen ggf. deaktivieren, die Datenbank öffnen, schließen und Access wieder beenden.
Wenn Sie dieses Problem häufiger haben und den Ursachen schneller auf die Spur kommen möchten, hilft der Total Access Admin, um jederzeit kontrollieren zu können, wer eine Datenbank gerade nutzt:
http://www.add-in-world.com/katalog/ta_admin/