{"id":55000045,"date":"2002-02-01T00:00:00","date_gmt":"2021-02-10T20:00:17","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=45"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Tipps_und_Tricks_72001","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/","title":{"rendered":"Tipps und Tricks 7\/2001"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/5b5745ab55004dd1be12ea78c2a9f153\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Autor: Christoph Spielmann, D&uuml;sseldorf<\/b><\/p>\n<p><b>Auf den folgenden Seiten versorgt Sie unser Autor Christoph Spielmann mit einigen Tipps und Tricks rund um VBA, die Sie sofort in Betrieb nehmen k&ouml;nnen. Hier finden Sie beispielsweise eine M&ouml;glichkeit, die Bildschirmaufl&ouml;sung zu ermitteln. Das kann u. a. f&uuml;r die Auslegung der Gr&ouml;&szlig;e von For-mularen sehr interessant sein. Sie lernen, wie Sie Dateien entg&uuml;ltig l&ouml;schen (ohne doppelten Boden, direkt in den Rei&szlig;wolf) und wie Sie dem Anwender von Ihrer Applikation aus eine M&ouml;glichkeit zur Verf&uuml;gung stellen, mal eben eine Diskette zu formatieren. Falls Sie einmal ein bestimmtes Systemverzeichnis auf Ihrer Festplatte vermissen &#8211; keine Sorge, hier finden Sie die richtige Funktion, um es wiederzufinden. Die nachfolgend beschriebenen Funktionen packen Sie am besten gut an eine sichere Stelle &#8211; Sie werden sie immer wieder ben&ouml;tigen.<\/b><\/p>\n<p>Einige Office-Anwendungen stellen Ihnen die aktuelle Bildschirmgr&ouml;&szlig;e direkt zur Verf&uuml;gung. So finden Sie beispielsweise in den Eigenschaften HorizontalResolution und VerticalResolution des System-Objekts der Word-Bibliothek die Breite und die H&ouml;he des Bildschirms in Pixel:<\/p>\n<pre>Breite = System.HorizontalResolution\r\nH&ouml;he = System.VerticalResolution\r\nPrivate Declare Function GetDC Lib \"user32\" _\r\n    (ByVal hwnd As Long) As Long\r\nPrivate Declare Function GetDeviceCaps Lib \"gdi32\" _\r\n    (ByVal hdc As Long, ByVal nIndex As Long) As Long\r\nPrivate Declare Function ReleaseDC Lib \"user32\" _\r\n    (ByVal hwnd As Long, ByVal hdc As Long) As Long\r\nPrivate Const HORZRES = 8\r\nPrivate Const VERTRES = 10\r\nPublic Property Get ScreenHeightPixels() As Long\r\n    Dim nDC As Long\r\n    nDC = GetDC(0)\r\n    ScreenHeightPixels = GetDeviceCaps(nDC, VERTRES)\r\n    ReleaseDC 0, nDC\r\nEnd Property\r\nPublic Property Get ScreenWidthPixels() As Long\r\n    Dim nDC As Long\r\n    nDC = GetDC(0)\r\n    ScreenWidthPixels = GetDeviceCaps(nDC, HORZRES)\r\n    ReleaseDC 0, nDC\r\nEnd Property<\/pre>\n<p>Doch in der Access-Bibliothek fehlt diese M&ouml;glichkeit. Und in keiner der Bibliotheken der Office-Anwendungen finden Sie eine direkte oder indirekte M&ouml;glichkeit, die aktuelle Bildschirmaufl&ouml;sung in Erfahrung zu bringen (die Bildschirmaufl&ouml;sung h&auml;ngt davon ab, ob der Anwender in den Bildschirmeinstellungen gro&szlig;e oder kleine Bildschirmschriften oder eine beliebige Schriftgr&ouml;&szlig;e eingestellt hat).<\/p>\n<p>Die gesuchten Werte liefert dagegen immer aktuell die API-Funktion GetDeviceCaps. Sie wird f&uuml;r den Ger&auml;tekontext (DC) eines bestimmten Ger&auml;ts aufgerufen, etwa eines Druckers oder eben des Bildschirms.<\/p>\n<pre>Private Const LOGPIXELSX = 88\r\nPrivate Const LOGPIXELSY = 90\r\nPublic Property Get dpiX() As Long\r\n    Dim nDC As Long\r\n    nDC = GetDC(0)\r\n    dpiX = GetDeviceCaps(nDC, LOGPIXELSX)\r\n    ReleaseDC 0, nDC\r\nEnd Property\r\nPublic Property Get dpiY() As Long\r\n    Dim nDC As Long\r\n    nDC = GetDC(0)\r\n    dpiY = GetDeviceCaps(nDC, LOGPIXELSY)\r\n    ReleaseDC 0, nDC\r\nEnd Property\r\nPublic Property Get TwipsPerPixelX() As Single\r\n    Dim nDC As Long\r\n    nDC = GetDC(0)\r\n    TwipsPerPixelX = 1440 \/ _        GetDeviceCaps(nDC, LOGPIXELSX)\r\n    ReleaseDC 0, nDC\r\nEnd Property\r\nPublic Property Get TwipsPerPixelY() As Single\r\n    Dim nDC As Long\r\n    nDC = GetDC(0)\r\n    TwipsPerPixelY = 1440 \/ _        GetDeviceCaps(nDC, LOGPIXELSY)\r\n    ReleaseDC 0, nDC\r\nEnd Property\r\nPublic Property Get ScreenHeightTWIPS() As Single\r\n    Dim nDC As Long\r\n    nDC = GetDC(0)\r\n    ScreenHeightTWIPS = GetDeviceCaps(nDC, VERTRES) * _\r\n     (1440 \/ GetDeviceCaps(nDC, LOGPIXELSY))\r\n    ReleaseDC 0, nDC\r\nEnd Property\r\nPublic Property Get ScreenWidthTWIPS() As Single\r\n    Dim nDC As Long\r\n    nDC = GetDC(0)\r\n    ScreenWidthTWIPS = GetDeviceCaps(nDC, HORZRES) * _\r\n        (1440 \/ GetDeviceCaps(nDC, LOGPIXELSX))\r\n    ReleaseDC 0, nDC\r\nEnd Property<\/pre>\n<p>Den Ger&auml;tekontext des Bildschirms erhalten Sie &uuml;ber die API-Funktion GetDC, der Sie als Fenster-Handle f&uuml;r den ganzen Bildschirm den Wert 0 &uuml;bergeben.<\/p>\n<p>Nach der Verwendung des Ger&auml;tekontextes m&uuml;ssen Sie daran denken, ihn wieder mit der API-Funktion ReleaseDC freizugeben.<\/p>\n<p>Neben dem Ger&auml;tekontext &uuml;bergeben Sie der Funktion GetDeviceCaps den jeweiligen Index, zu dem Sie den gew&uuml;nschten Wert erhalten wollen. &uuml;ber die beiden Hilfs-funktionen ScreenHeightPixels und ScreenWidthPixels erhalten Sie auf diese Weise z. B. die Bildschirmh&ouml;he und die Bildschirmbreite. <\/p>\n<p>In Quellcode 1 finden Sie zun&auml;chst die erforderlichen Deklarationen der ben&ouml;tigten API-Funktionen sowie der dazugeh&ouml;renden Konstanten.<\/p>\n<p>Die fehlende Information &uuml;ber die Bildschirmaufl&ouml;sung erhalten Sie &uuml;ber die Funktion GetDeviceCaps (Beispiele s. Quellcode 2). Sie liefert Ihnen direkt die vertikale und die horizontale Bildschirmaufl&ouml;sung in dpi (Dots per Inch).<\/p>\n<p>Scheinbar sind die vertikale und die horizontale Aufl&ouml;sung immer gleich. Doch sollten Sie sich nicht darauf verlassen &#8211; es kann durchaus das eine oder andere Bildschirmger&auml;t mit unterschiedlicher horizontaler und vertikaler Aufl&ouml;sung geben.<\/p>\n<p>Aus der Bildschirmaufl&ouml;sung in dpi k&ouml;nnen Sie zus&auml;tzlich noch den vertikalen und den horizontalen Umrechnungsfaktor f&uuml;r die Ma&szlig;einheit TWIPS ermitteln.<\/p>\n<pre>Private Type SHFILEOPSTRUCT\r\n    hWnd As Long\r\n    wFunc As Long\r\n    pFrom As String\r\n    pTo As String\r\n    fFlags As Integer\r\n    fAnyOperationsAborted As Long\r\n    hNameMappings As Long\r\n    lpszProgressTitle As String\r\nEnd Type\r\nQuellcode 5\r\nPrivate Declare Function SHFileOperation Lib _\r\n    \"Shell32.dll\" Alias \"SHFileOperationA\" (lpFileOp _\r\n    As SHFILEOPSTRUCT) As Long\r\nQuellcode 6\r\nPublic Function Kill(Files As Variant, Optional ByVal _    AllowUndo As Boolean, Optional ByVal ShowProgress _    As Boolean, Optional ByVal Confirmation As _    Boolean,  Optional ByVal Simple As Boolean, _\r\n    Optional ByVal SysErrors As Boolean, Optional _    ByVal hWnd As Long, Optional UserAborts As Variant _\r\n    ) As Boolean\r\n    Dim l As Long\r\n    Dim nFileOperations As SHFILEOPSTRUCT\r\n    Const FO_DELETE = &H3\r\n    Const FOF_ALLOWUNDO = &H40\r\n    Const FOF_SILENT = &H4\r\n    Const FOF_NOCONFIRMATION = &H10\r\n    Const FOF_SIMPLEPROGRESS = &H100\r\n    Const FOF_NOERRORUI = &H400<\/pre>\n<p>Diese ist ein bei vielen externen Steuerelementen (wie etwa den Microsoft Common Controls) verwendeter Standard f&uuml;r bildschirmbezogene Abmessungen. Diese Ma&szlig;einheit errechnet sich als 1440stel der horizontalen bzw. vertikalen Bildschirmaufl&ouml;sung, wie sie von GetDeviceCaps geliefert wird (s. Quellcode 3).<\/p>\n<p>Die Bildschirmgr&ouml;&szlig;e in TWIPS erhalten Sie dementsprechend &uuml;ber die Funktionen ScreenWidthTWIPS und ScreenHeightTWIPS (s. Quellcode 4)<\/p>\n<p>Eine Datei zu l&ouml;schen ist in VBA ein Kinderspiel &#8211; zum Beispiel mit folgender Anweisung:<\/p>\n<pre>Kill \"c:\\autoexec.bat\"<\/pre>\n<p>&#8211; und schon ist die Datei weg. Und zwar unrettbar verloren.<\/p>\n<p>Vor allem bei vom Anwender ausgel&ouml;sten Dateil&ouml;schungen sollten Sie ihm die Windows-&uuml;bliche M&ouml;glichkeit einr&auml;umen, gel&ouml;schte Dateien und Ordner aus dem Papierkorb wieder herstellen zu k&ouml;nnen.<\/p>\n<p>Verwenden Sie in solchen F&auml;llen die API-Funktion SHFileOperation (s. Quellcode 6). Bei dieser k&ouml;nnen Sie w&auml;hlen, ob die Datei(en) im Papierkorb landen, oder ob sie wie bei der VBA-Kill-Anweisung gleich vollst&auml;ndig gel&ouml;scht werden.<\/p>\n<p>Au&szlig;erdem k&ouml;nnen Sie die ge-wohnte Fortschrittsanzeige bieten und einige zus&auml;tzliche Einstellungen festlegen (SHFILEOPSTRUCT, Aussehen der Definition s. Quellcode 5).<\/p>\n<p>Ebenso k&ouml;nnen Sie mit ihr komplette Ordner auf einen Schlag l&ouml;schen &#8211; ein komplizierter, rekursiver Mechanismus mit den VBA-Anweisungen Kill und RmDir entf&auml;llt, da mit diesem Mechanismus alle untergeordneten Ordner geleert und einzeln gel&ouml;scht werden m&uuml;ssten.<\/p>\n<pre>    With nFileOperations\r\n    If IsArray(Files) Then\r\n        For l = LBound(Files) To UBound(Files)\r\n            .pFrom = .pFrom & Files(l) & vbNullChar\r\n        Next ''l\r\n        .pFrom = .pFrom & vbNullChar\r\n    ElseIf VarType(Files) = vbObject Then\r\n        If TypeOf Files Is Collection Then\r\n            For l = 1 To Files.Count\r\n                .pFrom = .pFrom & Files(l) & vbNullChar\r\n            Next ''l\r\n            .pFrom = .pFrom & vbNullChar\r\n        End If\r\n    ElseIf VarType(Files) = vbString Then\r\n        .pFrom = Files\r\n        If Right$(.pFrom, 1) &lt;&gt; vbNullChar Then\r\n            .pFrom = .pFrom & vbNullChar\r\n        End If\r\n        If Mid$(.pFrom, Len(.pFrom) - 1, 1) &lt;&gt; _            vbNullChar Then\r\n            .pFrom = .pFrom & vbNullChar\r\n        End If\r\n    End If\r\n    If AllowUndo Then \r\n      .fFlags = FOF_ALLOWUNDO\r\n    End If\r\n    If Not ShowProgress Then\r\n      .fFlags = .fFlags Or FOF_SILENT\r\n    End If\r\n    If Not Confirmation Then\r\n      .fFlags = .fFlags Or FOF_NOCONFIRMATION\r\n    End If\r\n    If Simple Then\r\n      .fFlags = .fFlags Or FOF_SIMPLEPROGRESS\r\n    End If\r\n    If Not SysErrors Then\r\n      .fFlags = .fFlags Or FOF_NOERRORUI\r\n    End If\r\n    .wFunc = FO_DELETE\r\n    .hWnd = hWnd\r\n    Kill = Not CBool(SHFileOperation(nFileOperations))\r\n    If Not IsMissing(UserAborts) Then\r\n      UserAborts = CBool(.fAnyOperationsAborted)\r\n    End If\r\n    End With\r\nEnd Function<\/pre>\n<p>Die hier vorgestellte Ersatzfunktion Kill (s. Quellcode 7) verh&auml;lt sich wie das VBA-Original, wenn Sie ihr wie gewohnt lediglich den gew&uuml;nschten Dateinamen &uuml;bergeben.<\/p>\n<p>Sie k&ouml;nnen dieser Ersatzfunktion aber auch ein dimensioniertes oder aktuell mit der Array-Funktion zusammengestelltes Array oder eine Collection aus einzelnen Datei- und Ordnerpfaden &uuml;bergeben. Und Sie k&ouml;nnen Wildcards (etwa &#8222;*.*&#8220; oder &#8222;*.bas&#8220;) verwenden.<\/p>\n<p>Die gew&uuml;nschte Funktionalit&auml;t legen Sie in den einzelnen optionalen Parametern fest. Sollen die Dateien in den Papierkorb verschoben werden, setzen Sie AllowUndo gleich True. Soll der Windows-&uuml;bliche Fortschrittsdialog mit der M&ouml;glichkeit zum Abbrechen des Vorgangs angezeigt werden, setzen Sie ShowProgress gleich True.<\/p>\n<p>Die R&uuml;ckfrage, ob wirklich gel&ouml;scht werden soll, legen Sie mit Confirmation gleich True fest. Eine etwas vereinfachte Fortschrittsanzeige, bei der die Anzeige der gerade bearbeiteten Dateinamen unterbleibt, w&auml;hlen Sie mit Simple gleich True. Wenn Sie im Fall eines Fehlers die Windows-Anzeige dieses Fehlers beibehalten wollen, setzen Sie SysErrors gleich True.<\/p>\n<p>Unabh&auml;ngig davon, wie Sie den letztgenannten Parameter setzen, gibt die Funktion Kill den Wert True zur&uuml;ck, wenn ein Fehler aufgetreten ist. Allerdings l&auml;sst sich der Fehler nicht n&auml;her spezifizieren &#8211; Sie m&uuml;ssen auf andere Weise pr&uuml;fen, was schief gegangen sein k&ouml;nnte, z. B. Datei nicht vorhanden, gesperrt u. &auml;. <\/p>\n<p>Hat der Anwender bei den gelegentlichen R&uuml;ckfragen des Systems (wie etwa L&ouml;schen einer Systemdatei o. &auml;.) beispielsweise einzelne Dateien &uuml;bersprungen, k&ouml;nnen Sie diese Information &uuml;ber den Parameter UserAborts erhalten, in der Sie dazu eine Variable &uuml;bergeben m&uuml;ssen. Allerdings bleibt Ihnen auch hierbei nur &uuml;brig, selbst herausfinden, welche Dateien &uuml;bersprungen worden sind.<\/p>\n<pre>Private Declare Function GetDesktopWindow _    Lib \"user32\" () As Long\r\nPrivate Declare Function SHFormatDrive Lib \"shell32\" _    (ByVal hWnd As Long, ByVal Drive As Long, ByVal _    fmtID As Long, ByVal Options As Long) As Long\r\nPublic Enum fdReturnConstants\r\n  fdRetSuccess = 0\r\n  fdRetError = -1\r\n  fdRetCancelled = -2\r\n  fdRetNotFormattable = -3\r\n  fdRetInvalidDrive = -4\r\nEnd Enum<\/pre>\n<p>Das VBA-Original der Kill-Anweisung k&ouml;nnen Sie anstelle dieser erweiterten Kill-Funktion weiterhin jederzeit aufrufen. Dazu setzen Sie einfach den Herkunftsbezeichner (Qualifizierer) davor: &#8222;VBA.Kill &#8230;&#8220;.<\/p>\n<p>Sie m&ouml;chten es dem Anwender erm&ouml;glichen, in Ihrem Programm eine Diskette frisch zu formatieren Dann sollten Sie sich nicht lange mit der Entwicklung eigener Formatier-Routinen und Formatier-Dialoge aufhalten, sondern dem Anwender den entsprechenden Standard-Dialog anzeigen.<\/p>\n<p><!--30percent--><\/p>\n<p>Zum einen ist die dahinter stehende Operation des Betriebssystems als ausgereift und stabil zu betrachten. Zum anderen ist der Standard-Dialog dem Anwender in der Regel vertraut. Au&szlig;erdem hat er die M&ouml;glichkeit, sich zwischen der vollst&auml;ndigen Formatierung und der Schnellformatierung des Datentr&auml;gers zu entscheiden, und er kann auch einen Datentr&auml;gernamen angeben bzw. einen vorhandenen Namen &auml;ndern.<\/p>\n<p>Diesen Standard-Dialog, der unter den verschiedenen Windows-Versionen unterschiedlich aussieht, aber dennoch im Wesentlichen die gleiche Funktionalit&auml;t bietet, erreichen Sie &uuml;ber die API-Funktion SHFormatDrive. Die Funktion ist allerdings weder in im Windows-SDK dokumentiert noch sind Deklaration und Konstanten in den C-Header-Dateien enthalten.<\/p>\n<p>Dennoch sollten Sie die Funktion bedenkenlos und auch zukunftssicher verwenden k&ouml;nnen, da Microsoft selbst in einem Artikel der Knowledge-Base die dokumentations&uuml;blichen Informationen dazu liefert.<\/p>\n<p>Die Funktion FormatDriveDlg vereinfacht den Aufruf der API-Funktion und bietet zugleich die M&ouml;glichkeit, das gew&uuml;nschte Laufwerk sowohl &uuml;ber den Laufwerksbuchstaben als auch &uuml;ber die MS-DOS-&uuml;bliche Nummer (beginnend ab 0, also Laufwerk A: gleich 0) zu spezifizieren.<\/p>\n<p>Da der besagte Knowledge-Base-Artikel anmahnt, immer ein Fenster als Bezug zu &uuml;bergeben, sollten Sie das entsprechende Fenster-Handle eines Forms (hWnd-Eigenschaft) verwenden. <\/p>\n<p>Da im Grunde das Handle des Desktops genauso geeignet ist, k&ouml;nnen Sie im optionalen Parameter hWnd der Funktion FormatDriveDlg auch 0 &uuml;bergeben oder ihn ganz weglassen. In der Funktion wird dann &uuml;ber die API-Funktion GetDesktopWindow automatisch das Handle des Desktops ermittelt und verwendet.<\/p>\n<p>Den Erfolg der Aktion meldet die Funktion in ihrem R&uuml;ckgabewert. Die m&ouml;glichen Werte sind hier als enumerierte Konstanten bereitgestellt. Bricht der Anwender selbst den Dialog ab (Schaltfl&auml;che &#8222;Schlie&szlig;en&#8220;), ohne die Formatierung gestartet zu haben, wird fdRetCancelled zur&uuml;ckgegeben. <\/p>\n<p>Wurde versehentlich die Kennung eines nicht-formatierbaren Laufwerks &uuml;bergeben (etwa ein CD-ROM-Laufwerk), wird fdRetNotFormattable zur&uuml;ckgegeben. Alle &uuml;brigen Fehler auf Betriebssystemebene werden als fdRetError unspezifiziert gemeldet.<\/p>\n<p>W&auml;hrend f&uuml;r diese R&uuml;ckgabewerte die API-Funktion SHFormatDrive zust&auml;ndig ist, wird der R&uuml;ckgabewert fdRetInvalidDrive von der Funktion FormatDriveDlg selbst generiert, wenn ein &#8222;unm&ouml;glicher&#8220; Laufwerksbuchstabe oder eine entsprechende Laufwerksnummer &uuml;bergeben worden ist.<\/p>\n<pre>Public Function FormatDriveDlg(Drive As Variant, _\r\n   Optional ByVal hWnd As Long) As fdReturnConstants\r\n   Dim nDriveNumber, nWnd As Long\r\n   Const SHFMT_ID_DEFAULT = &HFFFF&\r\n   Const SHFMT_OPT_FULL = 1\r\n   If IsNumeric(Drive) Then\r\n       Select Case CLng(Drive)\r\n            Case 0 To 25\r\n                nDriveNumber = CLng(Drive)\r\n            Case Else\r\n                FormatDriveDlg = fdRetInvalidDrive\r\n                Exit Function\r\n       End Select\r\n   ElseIf VarType(Drive) = vbString Then\r\n       Select Case UCase$(Left$(Drive, 1))\r\n           Case \"A\" To \"Z\"\r\n               nDriveNumber = _                   Asc(UCase$(Left$(Drive, 1))) - 65\r\n           Case Else\r\n               FormatDriveDlg = fdRetInvalidDrive\r\n               Exit Function\r\n       End Select\r\n   End If\r\n   If hWnd = 0 Then\r\n       nWnd = GetDesktopWindow()\r\n   Else\r\n       nWnd = hWnd\r\n   End If\r\n   FormatDriveDlg = SHFormatDrive(nWnd, nDriveNumber, _\r\n        SHFMT_ID_DEFAULT, SHFMT_OPT_FULL)\r\nEnd Function<\/pre>\n<p>F&uuml;r die meisten Systemordner gibt es zwar Standardnamen und sie befinden sich meistens auch an Standardpl&auml;tzen im Dateisystem.<\/p>\n<p>Doch Ihre Programme sollten sich niemals darauf verlassen, dass etwa der Windows-Ordner unter C:\\Windows zu finden ist &#8211; das Laufwerk kann ein anderes sein, ebenso kann der Ordnername anders lauten (unter Windows NT\/2000 hei&szlig;t dieser Ordner beispielsweise WINNT).<\/p>\n<p>Doch &uuml;ber die API-Funktionen GetWindowsDirectory, GetSystemDirectory und GetTempPath k&ouml;nnen Sie jederzeit den tats&auml;chlichen Pfad des Windows-, System- und des Temp-Ordners ermitteln.<\/p>\n<p>Diese API-Funktionen geben jedoch &#8211; entgegen der VBA-Funktion &#8211; keinen String zur&uuml;ck. Sie erwarten stattdessen als Parameter einen vorbereiteten String, einen so genannten Puffer, in dem Sie das gew&uuml;nschte Ergebnis ablegen k&ouml;nnen.<\/p>\n<pre>Private Declare Function GetSystemDirectory Lib _    \"kernel32\" Alias \"GetSystemDirectoryA\" (ByVal _    lpBuffer As String, ByVal nSize As Long) As Long\r\nPrivate Declare Function GetTempPath Lib \"kernel32\" _\r\n    Alias \"GetTempPathA\" (ByVal nBufferLength As Long, _    ByVal lpBuffer As String) As Long\r\nPrivate Declare Function GetWindowsDirectory Lib _    \"kernel32\" Alias \"GetWindowsDirectoryA\" (ByVal _    lpBuffer As String, ByVal nSize As Long) As Long\r\nPrivate Const kLength = 255&\r\nQuellcode 10\r\nPublic Function GetSysDir(Optional ByVal AddBackslash _    As Boolean) As String\r\n    Dim nBuffer As String\r\n    Dim nReturn As Long\r\n    e(kLength)\r\n    nReturn = GetSystemDirectory(nBuffer, kLength)\r\n    If nReturn &gt; 0 Then\r\n        If AddBackslash Then\r\n            GetSysDir = Left(nBuffer, nReturn) & \"\\\"\r\n        Else\r\n            GetSysDir = Left(nBuffer, nReturn)\r\n        End If\r\n    End If\r\nEnd Function\r\nPublic Function GetTempDir(Optional ByVal AddBackslash _    As Boolean) As String\r\n    Dim nBuffer As String\r\n    Dim nReturn As Long\r\n    nBuffer = Space(kLength)\r\n    nReturn = GetTempPath(kLength, nBuffer)\r\n    If nReturn &gt; 0 Then\r\n        If AddBackslash Then\r\n            GetTempDir = Left(nBuffer, nReturn)\r\n        Else\r\n            GetTempDir = Left(nBuffer, nReturn - 1)\r\n        End If\r\n    End If\r\nEnd Function<\/pre>\n<p>Die L&auml;nge dieses Strings ist ausreichend zu w&auml;hlen, damit Windows nicht &uuml;ber das Ende des Strings hinaus ins &#8222;Speicher-Outback&#8220; schreibt, was zu schweren Systemabst&uuml;rzen f&uuml;hren kann. Im R&uuml;ckgabewert dieser API-Funktionen erhalten Sie die tats&auml;chliche L&auml;nge des im Puffer abgelegten Strings.<\/p>\n<p>Die beiden Funktionen GetWindowsDirectory und GetSystemDirectory gleichen sich von der Syntax her. Im ersten Parameter wird der Puffer-String &uuml;bergeben, im zweiten dessen L&auml;nge. Bei GetTempPath ist die Parameter-Reihenfolge genau umgekehrt &#8211; warum das so ist, wei&szlig; wohl niemand mehr so genau (Deklaration der Funktionen s. Quellcode 10).<\/p>\n<p>Ebenfalls unterschiedlich ist der Abschluss des zur&uuml;ckgegebenen Pfades. GetTempPath schlie&szlig;t den im Puffer zur&uuml;ckgegebenen Pfad mit einem Backslash (&#8222;\\&#8220;) ab, GetWindowsDirectory und GetSystemDirectory hingegen tun dies nicht.<\/p>\n<p>Damit Sie sich die ganze Pufferei samt den Parameter- und R&uuml;ckgabe-Unterschieden sparen k&ouml;nnen, verpacken wir die drei API-Funktionen in einem Standard-Modul modWinSysDirs in handliche, VB-gewohnte Funktionen (s. Quellcode 11-13). Ob der von diesen Funktionen zur&uuml;ckgegebene Pfad mit einem Backslash abschlie&szlig;t, legen Sie mit dem optionalen Parameter AddBackslash fest. <\/p>\n<pre>Public Function GetWinDir(Optional ByVal AddBackslash _    As Boolean) As String\r\n    Dim nBuffer As String\r\n    Dim nReturn As Long\r\n    nBuffer = Space(kLength)\r\n    nReturn = GetWindowsDirectory(nBuffer, kLength)\r\n    If nReturn &gt; 0 Then\r\n        If AddBackslash Then\r\n            GetWinDir = Left(nBuffer, nReturn) & \"\\\"\r\n        Else\r\n            GetWinDir = Left(nBuffer, nReturn)\r\n        End If\r\n    End If\r\nEnd Function\r\nPublic Function GetTempDir2(Optional ByVal _    AddBackslash  As Boolean) As String\r\n    Dim nTempDir As String\r\n    On Error Resume Next\r\n    nTempDir = Environ$(\"temp\")\r\n    If Len(nTempDir) = 0 Then\r\n        nTempDir = Environ$(\"tmp\")\r\n    End If\r\n    If Len(nTempDir) Then\r\n        If AddBackslash Then\r\n            GetTempDir2 = nTempDir & \"\\\"\r\n        Else\r\n            GetTempDir2 = nTempDir\r\n        End If\r\n    End If\r\nEnd Function<\/pre>\n<p>Ist dieser False oder fehlt er, schlie&szlig;t der zur&uuml;ckgegebene Pfad nicht mit einem Backslash ab. Schl&auml;gt der Aufruf der jeweiligen API-Funktion fehl, wird einfach ein leerer String zur&uuml;ckgegeben.<\/p>\n<p>Die drei Funktionen GetSysDir, GetTempDir und GetWinDir machen sich die API-Funktionen zunutze, um die entsprechenden Verzeichnisse zu ermitteln.<\/p>\n<p>Eine Alternative zur Ermittlung des Temp-Ordners &uuml;ber die API-Funktion soll hier nicht verschwiegen werden. In der Regel ist der Temp-Ordner auch in den Umgebungs-variablen des Systems abgelegt und kann daher &uuml;ber die VB-Funktion Environ$ ausgelesen werden.<\/p>\n<p>&#8222;Alte Hasen&#8220; wissen allerdings, dass man den Temp-Ordner in zwei verschieden lautenden Umgebungsvariablen finden kann &#8211; meistens unter TEMP, gelegentlich aber auch unter TMP.<\/p>\n<p>Das liegt daran, dass sich die Entwicklerwelt nie ganz einig dar&uuml;ber war, unter welcher dieser beiden Umgebungsvariablen der Temp-Ordner ordnungsgem&auml;&szlig; anzugeben und zu finden sein sollte.<\/p>\n<p>Manche Anwendungen verwenden die eine, manche die andere Bezeichnung. Es kann aber auch sein, dass auf einem System gerade die falsche, oder gar keine Angabe festgelegt worden ist.<\/p>\n<p>Falls Ihnen das Hantieren mit API-Funktionen suspekt erscheinen sollte, k&ouml;nnen Sie den Temp-Ordner auch &uuml;ber die Funktion GetTempDir2 ermitteln.<\/p>\n<p>Anders als VBA kennen die meisten Programmiersprachen (und auch andere Basic-Dialekte) inkrementierende und dekrementierende Operatoren oder Anweisungen und auch eine Anweisung zum Vertauschen der Inhalte zweier Variablen.<\/p>\n<pre>Private Declare Sub InterlockedIncrement Lib _    \"kernel32\" (lpAddend As Long)\r\nPrivate Declare Sub InterlockedDecrement Lib _    \"kernel32\" (lpAddend As Long)\r\nQuellcode 15\r\nPublic Sub Inc(Var As Variant, Optional ByVal _    Increment As Long = 1)\r\n    Var = CLng(Var) + Increment\r\nEnd Sub\r\nPublic Sub IncI(Var As Integer, Optional ByVal _    Increment As Integer = 1)\r\n    Var = Var + Increment\r\nEnd Sub\r\nPublic Sub IncL(Var As Long, Optional ByVal Increment _    As Long = 1)\r\n    If Increment = 1 Then\r\n        InterlockedIncrement Var\r\n    Else\r\n        Var = Var + Increment\r\n    End If\r\nEnd Sub\r\nPublic Sub IncS(Var As Single, Optional ByVal _    Increment As Single = 1)\r\n    Var = Var + Increment\r\nEnd Sub\r\nPublic Sub IncD(Var As Double, Optional ByVal _    Increment As Double = 1)\r\n    Var = Var + Increment\r\nEnd Sub\r\nPublic Sub Dec(Var As Variant, Optional Decrement _    As Long = -1)\r\n    Var = CLng(Var) + Decrement\r\nEnd Sub\r\nPublic Sub DecI(Var As Integer, Optional Decrement As _    Integer = -1)\r\n    Var = Var + Decrement\r\nEnd Sub\r\nPublic Sub DecL(Var As Long, Optional Decrement As _    Long = -1)\r\n    If Decrement = 1 Then\r\n        InterlockedDecrement Var\r\n    Else\r\n        Var = Var + Decrement\r\n    End If\r\nEnd Sub\r\nQuellcode 16 (Teil 1)<\/pre>\n<p>VBA erwartet dagegen von Ihnen zum Inkrementieren bzw. Dekrementieren eine etwas umst&auml;ndliche Schreibweise, etwa:<\/p>\n<pre>A = A + 1\r\nB = B - 1<\/pre>\n<p>Und zum Vertauschen ist eine Hilfsvariable notwendig:<\/p>\n<pre>H = A\r\nA = B\r\nB = H<\/pre>\n<p>Das Windows-API bietet hierbei keine brauchbare Unterst&uuml;tzung oder Verk&uuml;rzung. Es gibt zwar Funktionen wie InterlockedIncrement, InterlockedDecrement und InterlockedExchange (Deklaration s. Quellcode 15), die zwar etwas schneller sind,  als der Weg in reinem VBA, jedoch sind sie lediglich f&uuml;r Werte des Datentyps Long geeignet. Au&szlig;erdem sind sie eigentlich gar nicht in erster Linie f&uuml;r diesen Zweck vorgesehen, wie aus den  Dokumentationen hervorgeht.<\/p>\n<p>Zur Einsparung der umst&auml;ndlichen Schreibweisen k&ouml;nnen Sie diese in Hilfsfunktionen verpacken und in ein Standard-Modul auslagern. Die Funktionen aus Quellcode 16 enthalten Implementierungen f&uuml;r alle Datentypen &#8211; jeweils einmal in der allgemeinen Form f&uuml;r Variants (jedoch wegen der Variant-Verwendung etwas langsamer) und in spezialisierten Formen f&uuml;r die Datentypen Integer, Long, Single und Double.<\/p>\n<pre>Public Sub DecS(Var As Single, Optional Decrement As _    Single = -1)\r\n    Var = Var + Decrement\r\nEnd Sub\r\nPublic Sub DecD(Var As Double, Optional Decrement As Double = -1)\r\n  Var = Var + Decrement\r\nEnd Sub\r\nPublic Function IncTo(Var As Variant, ToVar As _    Variant, Optional ByVal Increment As Long = 1) As _    Boolean\r\n    Dim nVar As Variant\r\n    nVar = CLng(Var) + Increment\r\n    If nVar &lt;= CLng(ToVar) Then\r\n        Var = nVar\r\n        IncTo = True\r\n    End If\r\nEnd Function\r\nPublic Function IncToI(Var As Integer, ToVar As _    Integer, Optional ByVal Increment As Integer = 1) _    As Boolean\r\n    Dim nVar As Integer\r\n    nVar = Var + Increment\r\n    If nVar &lt;= ToVar Then\r\n        Var = nVar\r\n        IncTo = True\r\n    End If\r\nEnd Function\r\nPublic Function IncToL(Var As Long, ToVar As Long, _\r\n    Optional ByVal Increment As Long = 1) As Boolean\r\n    Dim nVar As Long\r\n    nVar = Var + Increment\r\n    If nVar &lt;= ToVar Then\r\n        Var = nVar\r\n        IncTo = True\r\n    End If\r\nEnd Function\r\nPublic Function IncToS(Var As Single, ToVar As Single, _\r\n    Optional ByVal Increment As Single = 1) As Boolean\r\n    Dim nVar As Single\r\n    nVar = Var + Increment\r\n    If nVar &lt;= ToVar Then\r\n        Var = nVar\r\n        IncTo = True\r\n    End If\r\nEnd Function<\/pre>\n<p>Die Funktionen &uuml;bergeben den Sub-Prozeduren die zu inkrementierende bzw. dekrementierende Variable als Parameter und optional den Wert des Inkrements bzw. Dekrements (Voreinstellung 1 bzw. -1).<\/p>\n<p>Beispiele:<\/p>\n<pre>Dim A As Variant\r\nA = 10\r\nInc A<\/pre>\n<p>ergibt A = 11;<\/p>\n<pre>Dim B As Long\r\nB = 100\r\nDec B<\/pre>\n<p>ergibt 99;<\/p>\n<pre>Dim C As Single\r\nC = 5,5\r\nInc C, 0,5<\/pre>\n<p>ergibt 6.<\/p>\n<p>Die Prozeduren dazu finden Sie in Quellcode 16.<\/p>\n<p>Ein wenig spezialisierter sind die Funktionen IncTo und DecTo bzw. deren datentypspezifische Varianten. Sie inkrementieren oder dekremen-tieren einen Wert um einen bestimmten Wert, solange er unter einer vorgegebenen Obergrenze bzw. &uuml;ber einer vorgegebenen Untergrenze liegt. Im Prinzip beruhen For-Schleifen auf diesem Prinzip. IncTo und DecTo haben jedoch den Vorteil, dass die vorgegebenen Ober- bzw. Untergrenzen nicht exakt getroffen werden m&uuml;ssen, um die Schleife zu beenden, wenn der Grenzwert nicht durch das Inkrement bzw. das Dekrement teilbar ist.<\/p>\n<pre>Public Function IncToD(Var As Double, ToVar As Double, _\r\n    Optional ByVal Increment As Double = 1) As Boolean\r\n    Dim nVar As Double\r\n    nVar = Var + Increment\r\n    If nVar &lt;= ToVar Then\r\n        Var = nVar\r\n        IncTo = True\r\n    End If\r\nEnd Function\r\nQuellcode 17 (Teil 2)\r\nPublic Function DecTo(Var As Variant, Optional ToVar _    As Variant, Optional ByVal Increment As Long = 1) _    As Boolean\r\n    Dim nVar As Variant\r\n    nVar = CLng(Var) + Increment\r\n    If nVar &gt;= CLng(ToVar) Then\r\n        Var = nVar\r\n        DecTo = True\r\n    End If\r\nEnd Function\r\nQuellcode 18\r\nPrivate Declare Function InterlockedExchange Lib _    \"kernel32\" (lpVar1 As Long, ByVal Var2 As Long) _    As Long\r\nPublic Sub Swap(Var1 As Variant, Var2 As Variant)\r\n    Dim nVar As Variant\r\n    If IsObject(Var1) And IsObject(Var2) Then\r\n        Set nVar = Var1\r\n        Set Var1 = Var2\r\n        Set Var2 = nVar\r\n    ElseIf IsObject(Var1) Then\r\n        Set nVar = Var1\r\n        Var1 = Var2\r\n        Set Var2 = nVar\r\n    ElseIf IsObject(Var2) Then\r\n        nVar = Var1\r\n        Set Var1 = Var2\r\n        Var2 = nVar\r\n    Else\r\n        nVar = Var1\r\n        Var1 = Var2\r\n        Var2 = nVar\r\n    End If\r\nEnd Sub\r\nQuellcode 19<\/pre>\n<p>So k&ouml;nnen Sie mit IncTo beispielsweise den Ausgangswert 2 in einer Do&#8230;Loop-Schleife um 5 erh&ouml;hen, bis die Obergrenze von 30 erreicht wird. So lange eine Inkrementierung erfolgt, gibt die Funktion IncTo den R&uuml;ckgabewert True zur&uuml;ck. Bei der letzten Inkrementierung beim Stand von 27 w&uuml;rde der Grenzwert 30 &uuml;berschritten &#8211; der Wert wird nun nicht mehr erh&ouml;ht und die Funktion gibt den Wert False zur&uuml;ck, sodass die Schleife verlassen wird:<\/p>\n<pre>Dim A As Integer\r\nA = 2\r\nDo While IncTo(A, 30, 5)\r\n  ''...\r\nLoop<\/pre>\n<p>Die Funktionen IncTo und deren Varianten finden Sie in Quellcode 17, die Funktion DecTo in Quellcode 18. Die datentypspezifischen Varianten der Funktion DecTo lassen sich leicht anhand der entsprechenden Varianten der Funktion IncTo ableiten.<\/p>\n<p>&auml;hnlich wie Inc und Dec kapseln die Prozeduren zum Vertauschen der Inhalte zweier Variablen die umst&auml;ndliche VBA-Syntax (nur beim Datentyp Long wird die schnellere API-Funktion InterlockedExchange verwendet). Bei der allgemeinen Variante wird sogar ber&uuml;cksichtigt, dass einer der beiden Werte oder beide Werte Objekte sein k&ouml;nnen, bei denen die Zuweisungen mit der Set-Anweisung erfolgen m&uuml;ssen. Ebenso kommt dementsprechend die spezialisierte Variante SwapObj dazu. Und f&uuml;r Datumswerte gibt es schlie&szlig;lich noch die Variante SwapDate. In den folgenden Prozeduren setzen Sie statt &lt;Tausch-Algoritmus&gt; jeweils die drei folgenden Zeilen ein:<\/p>\n<pre>nVar = Var1\r\nVar1 = Var2\r\nVar2 = nVar\r\nPublic Sub SwapI(Var1 As Integer, _    Var2 As Integer)\r\n    Dim nVar As Integer\r\n    &lt;Tausch-Algoritmus&gt;\r\nEnd Sub\r\nPublic Sub SwapL(Var1 As Long, _    Var2 As Long)\r\n    Var2 = InterlockedExchange(Var1, _    Var2)\r\nEnd Sub\r\nPublic Sub SwapS(Var1 As Single, _    Var2 As Single)\r\n    Dim nVar As Single\r\n    &lt;Tausch-Algoritmus&gt;\r\nEnd Sub\r\nPublic Sub SwapD(Var1 As Double, _    Var2 As Double)\r\n    Dim nVar As Double\r\n    &lt;Tausch-Algoritmus&gt;\r\nEnd Sub\r\nPublic Sub SwapDate(Var1 As Date, _    Var2 As Date)\r\n    Dim nVar As Date\r\n    &lt;Tausch-Algoritmus&gt;\r\nEnd Sub<\/pre>\n<p>Da es keine Funktion gibt, die den Nachkomma-Anteil einer Zahl zur&uuml;ckgibt, k&ouml;nnen Sie diesen auf einem kleinen Umweg erhalten. Sie subtrahieren einfach den ganzzahligen Anteil von der Zahl. Den ganzzahligen Anteil erhalten Sie &uuml;ber die relativ unbekannte VBA-Funktion Fix. Die Funktion Fix schneidet tats&auml;chlich nur den Nachkommaanteil ab, im Gegensatz zu Funktionen wie Int, CInt oder CLng, die stattdessen automatisch runden.<\/p>\n<pre>Decimals = Number - Fix(Number)<\/pre>\n<p>Eine weitere M&ouml;glichkeit besteht mit den praktischen datentypspezifischen Hilfsfunktionen (Double als Standard-Ausf&uuml;hrung):<\/p>\n<pre>Public Function GetDecimals(ByVal _    Number As Double) As Double\r\n    GetDecimals = Number - Fix(Number)\r\nEnd Function\r\nPublic Function GetDecimalsS(ByVal _    Number As Single) As Single\r\n    GetDecimalsS = Number - Fix(Number)\r\nEnd Function\r\nPublic Function GetDecimalsC(ByVal _    Number As Currency) As Currency\r\n    GetDecimalsC = Number - Fix(Number)\r\nEnd Function<\/pre>\n<p>In den Umgebungsvariablen ist eine einfache M&ouml;glichkeit verborgen, die aktuelle Windows-Version zu ermitteln. Unter Windows NT und Windows 2000 enth&auml;lt die Umgebungsvariable OS  die Kennung Windows_NT, w&auml;hrend diese Umgebungsvariable unter Windows 9x unbekannt ist. Zur weiteren Unterscheidung zwischen Windows NT und Windows 2000 k&ouml;nnen Sie die Umgebungsvariable PROGRAMFILES heranziehen, die wiederum unter Windows NT unbekannt ist, w&auml;hrend sie unter Windows 2000 den Pfad des Programm-Ordners liefert.<\/p>\n<pre>Public Enum WinVersionConstants\r\n  wvWin9x\r\n  wvWinNT\r\n  wvWin2000\r\nEnd Enum\r\nPublic Function WindowsVersion() _    As WinVersionConstants\r\n    Select Case True\r\n        Case Len(Environ$(\"OS\")) = 0\r\n            WindowsVersion = wvWin9x\r\n        Case Len(Environ$ _            (\"PROGRAMFILES\")) = 0\r\n            WindowsVersion = wvWinNT\r\n        Case Else\r\n            WindowsVersion = wvWin2000\r\n    End Select\r\nEnd Function<\/pre>\n<p>Der interne Zufallszahlengenerator in Visual Basic, der &uuml;ber die Funktion Rnd Zufallszahlen liefern soll, ist eigentlich gar keiner. Er geht bei der Generierung von Zufallszahlen immer vom gleichen Ursprung aus und liefert immer wieder die gleiche Zahlenfolge.<\/p>\n<p>Zufall kommt erst dann ins Spiel, wenn Sie mindestens vor dem ersten Aufruf der Rnd-Funktion zus&auml;tzlich noch die Funktion Randomize aufrufen. Ihr k&ouml;nnen Sie einen beliebigen Initialisierungswert als Parameter &uuml;bergeben.<\/p>\n<p>Um dem Zufall einigerma&szlig;en auf die Spr&uuml;nge zu helfen, sollte dieser Wert auch m&ouml;glichst zuf&auml;llig sein, etwa der aktuelle Wert, den die Timer-Funktion zur&uuml;ckgibt (z. B. die Anzahl der seit Mitternacht vergangenen Sekunden).<\/p>\n<p>Eine ganzzahlige Zufallszahl innerhalb eines gegebenen Zahlenbereichs erhalten Sie &uuml;ber die Rnd-Funktion nach folgender Formel:<\/p>\n<pre>Zahl = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)<\/pre>\n<p>Die folgende Funktion RndNum liefert nach dieser Formel und optionaler Initialisierung der Zufallsbasis eine ganze Zahl innerhalb der Grenzen von LBnd und UBnd:<\/p>\n<pre>Public Function RndNum(ByVal LBnd As _    Long, ByVal UBnd As Long, Optional _    ByVal DoRandomize As Boolean) As Long\r\n    If DoRandomize Then\r\n        Randomize Timer\r\n    End If\r\n    RndNum = Int((UBnd - LBnd + 1) * _        Rnd + LBnd)\r\nEnd Function<\/pre>\n<p>Falls Sie gleich mehrere Zufallszahlen aus einem Zahlenbereich ben&ouml;tigen, k&ouml;nnen Sie die Funktion RndSet verwenden. Sie geben die gew&uuml;nschte Anzahl an und bekommen die Zahlen wahlweise in einer Collection (Voreinstellung) oder als Array geliefert.<\/p>\n<pre>Public Function RndSet(ByVal Count As _    Long, ByVal LBnd As Long, ByVal _    Ubnd As Long, Optional ByVal _    DoRandomize As Boolean = True, _\r\n    Optional ByVal AsArray As Boolean) _    As Variant\r\n    Dim nNumbers As Collection\r\n    Dim nRnd, nRndTest As Long\r\n    Dim nRndSetArray() As Long\r\n    Dim l As Long\r\n    If DoRandomize Then\r\n        Randomize Timer\r\n    End If\r\n    Set nNumbers = New Collection\r\n    With nNumbers\r\n        On Error Resume Next\r\n        Do\r\n            nRnd = RndNum(LBnd, UBnd)\r\n            nRndTest = _                nNumbers(CStr(nRnd))\r\n            If Err.Number Then\r\n                Err.Clear\r\n                .Add nRnd, CStr(nRnd)\r\n            End If\r\n        Loop Until .Count = Count\r\n    End With\r\n    If AsArray Then\r\n        ReDim nRndSetArray(1 To Count)\r\n        For l = 1 To Count\r\n            nRndSetArray(l) = nNumbers(l)\r\n        Next\r\n        RndSet = nRndSetArray\r\n    Else\r\n        Set RndSet = nNumbers\r\n    End If\r\nEnd Function<\/pre>\n<p>Zahlengruppen nach dem Muster 6 aus 49 f&uuml;r Ihren Lottoschein ermitteln Sie beispielsweise folgenderma&szlig;en:<\/p>\n<pre>Dim nLotto As Collection\r\nDim i As Integer\r\nSet nLotto = RndSet(6, 1, 49)\r\nFor i = 1 To 6\r\n  Debug.Print nLotto(i)\r\nNext ''i\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Diese Zusammenstellung von Tipps und Tricks behandelt die folgenden Themen:<br \/>\n&#8211; Bildschirm nach Ma&szlig;<br \/>\n&#8211; L&ouml;schen, aber nicht richtig<br \/>\n&#8211; Disketten mit Format<br \/>\n&#8211; Ordner mit System<br \/>\n&#8211; Wechselspiel<br \/>\n&#8211; Nachz&uuml;gler getrennt<br \/>\n&#8211; Blick &uuml;ber den Tellerrand<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662001,66072001,44000004],"tags":[],"class_list":["post-55000045","post","type-post","status-publish","format-standard","hentry","category-662001","category-66072001","category-Tipps_und_Tricks"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Tipps und Tricks 7\/2001 - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tipps und Tricks 7\/2001\" \/>\n<meta property=\"og:description\" content=\"Diese Zusammenstellung von Tipps und Tricks behandelt die folgenden Themen: - Bildschirm nach Ma&szlig;  - L&ouml;schen, aber nicht richtig  - Disketten mit Format  - Ordner mit System  - Wechselspiel  - Nachz&uuml;gler getrennt  - Blick &uuml;ber den Tellerrand\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-10T20:00:17+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/5b5745ab55004dd1be12ea78c2a9f153\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"23\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Tipps und Tricks 7\\\/2001\",\"datePublished\":\"2021-02-10T20:00:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/\"},\"wordCount\":2879,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/5b5745ab55004dd1be12ea78c2a9f153\",\"articleSection\":[\"2001\",\"7\\\/2001\",\"Tipps und Tricks\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/\",\"name\":\"Tipps und Tricks 7\\\/2001 - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/5b5745ab55004dd1be12ea78c2a9f153\",\"datePublished\":\"2021-02-10T20:00:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/5b5745ab55004dd1be12ea78c2a9f153\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/5b5745ab55004dd1be12ea78c2a9f153\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_72001\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tipps und Tricks 7\\\/2001\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Tipps und Tricks 7\/2001 - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/","og_locale":"de_DE","og_type":"article","og_title":"Tipps und Tricks 7\/2001","og_description":"Diese Zusammenstellung von Tipps und Tricks behandelt die folgenden Themen: - Bildschirm nach Ma&szlig;  - L&ouml;schen, aber nicht richtig  - Disketten mit Format  - Ordner mit System  - Wechselspiel  - Nachz&uuml;gler getrennt  - Blick &uuml;ber den Tellerrand","og_url":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-02-10T20:00:17+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/5b5745ab55004dd1be12ea78c2a9f153","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"23\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Tipps und Tricks 7\/2001","datePublished":"2021-02-10T20:00:17+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/"},"wordCount":2879,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/5b5745ab55004dd1be12ea78c2a9f153","articleSection":["2001","7\/2001","Tipps und Tricks"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/","url":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/","name":"Tipps und Tricks 7\/2001 - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/5b5745ab55004dd1be12ea78c2a9f153","datePublished":"2021-02-10T20:00:17+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/5b5745ab55004dd1be12ea78c2a9f153","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/5b5745ab55004dd1be12ea78c2a9f153"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_72001\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Tipps und Tricks 7\/2001"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000045","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000045"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000045\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000045"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000045"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000045"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}