Sahanya » VBA http://www.sahanya.perun.net Photoshop, Bücher, Filme, VB ... Wed, 23 Mar 2011 13:48:11 +0000 de hourly 1 http://wordpress.org/?v=3.1.1 Makro zeitlich einschränken http://www.sahanya.perun.net/archiv/2006/12/17/makro-zeitlich-einschraenken/ http://www.sahanya.perun.net/archiv/2006/12/17/makro-zeitlich-einschraenken/#comments Sun, 17 Dec 2006 08:42:16 +0000 Sahanya http://www.sahanya.perun.net/archiv/2006/12/17/makro-zeitlich-einschraenken/ Manchmal möchte man ein Makro zeitlich einschränken, also ein Datum angeben ab oder bis wann das Makro aktiviert werden soll, eventuell auch einen bestimmten Zeitraum. Dafür umschließt man die Prozedur einfach mit einer Datumseinschränkung:

Ab einem bestimmten Datum:

StartDatum = #12/31/2006#
If Now() > StartDatum Then
    ...
End If

Bis zu einem bestimmten Datum:

EndDatum= #12/31/2006#
If Now() < EndDatum Then
    ...
End If

Während eines bestimmten Zeitraumes:

StartDatum = #12/1/2006#
EndDatum = #1/1/2007#
If Now() >= StartDatum And Now() < EndDatum Then
    ...
End If

Via ExcelTips

]]>
http://www.sahanya.perun.net/archiv/2006/12/17/makro-zeitlich-einschraenken/feed/ 0
FaceID http://www.sahanya.perun.net/archiv/2006/02/26/faceid/ http://www.sahanya.perun.net/archiv/2006/02/26/faceid/#comments Sun, 26 Feb 2006 14:19:36 +0000 Sahanya http://www.sahanya.perun.net/archiv/2006/02/26/faceid/ FaceID Viewer

Wer beim Schreiben von Makros seine selbst erstellten Menüleisten mit kleinen Bildchen oder Symbolen aufpeppen möchte, muss dafür auf die sog. FacIDs zurückgreifen. In der einschlägigen Literatur findet man dazu seitenweise Listen. Das Excel-Addin FaceID Viewer von Doug Glancy erleichtert da die Arbeit sehr und hat auch noch die komfortable Funktion, dass die letzten benutzten IDs in einer separaten Liste abgelegt werden, wo man sie dann einfach wiederfinden kann. Zudem kann man sich die IDs auch thematisch auflisten lassen.

]]>
http://www.sahanya.perun.net/archiv/2006/02/26/faceid/feed/ 0
Versteckte Zeilen und Spalten http://www.sahanya.perun.net/archiv/2005/12/24/versteckte-zeilen-und-spalten/ http://www.sahanya.perun.net/archiv/2005/12/24/versteckte-zeilen-und-spalten/#comments Sat, 24 Dec 2005 11:04:21 +0000 Sahanya http://www.sahanya.perun.net/archiv/2005/12/24/versteckte-zeilen-und-spalten/ Versteckte bzw. ausgeblendete Zeilen und Spalten in Excel-Dokumenten können, insbesondere nach der Speicherung als Textdatei zu unschönen Überraschungen führen. Oft werden diese Zellen nämlich versteckt, weil ihr Inhalt nicht mehr benötigt wird. Dabei wird entweder die Excel-interne Methode „Ausblenden” benutzt oder aber (alles schon gesehen) Zeilen bzw. Spalten manuell verkleinert, so dass ihr Inhalt nicht mehr sichtbar ist.

Bei umfangreichen Dokumenten, die man nun weiterverarbeiten möchte, können solche Zeilen und Spalten leicht übersehen werden oder aber das Einblenden und anschließende Löschen zu einer Sisyphusarbeit ausarten. Ein VBA-Makro kann diese Arbeit allerdings leicht übernehmen:

Sub versteckte_loeschen()
    Dim r As Range
    For Each r In Rows(1).Cells
        If r.Width < 1 Then r.EntireColumn.Delete
    Next
    For Each r In Columns(1).Cells
        If r.Height < 1 Then r.EntireRow.Delete
    Next
End Sub

Versteckte löschen

]]>
http://www.sahanya.perun.net/archiv/2005/12/24/versteckte-zeilen-und-spalten/feed/ 0
Index für Excel http://www.sahanya.perun.net/archiv/2005/11/02/index-fur-excel/ http://www.sahanya.perun.net/archiv/2005/11/02/index-fur-excel/#comments Wed, 02 Nov 2005 18:19:14 +0000 Sahanya http://www.sahanya.perun.net/archiv/2005/11/02/index-fur-excel/ Index Gerade bei umfangreichen Excel-Dokumenten kann es schnell passieren, dass man bei einer hohen Anzahl von Tabellenblättern den Überblick verliert. Ein Makro kann da Abhilfe schaffen. Es erstellt ein neues Tabellenblatt mit dem Namen „Index” als erstes Tabellenblatt und listet dort die Namen der anderen Tabellenblätter auf. Diese sind verlinkt, so dass man mit einem Klick auf dem gewünschten Tabellenblatt landet. Auf den einzelnen Tabellenblättern wird ein Link zum Index-Tabellenblatt eingefügt. Hier sollte man allerdings aufpassen, denn dieser wird (hier im Beispiel) in die Zelle „H1” eingefügt und überschreibt somit den ursprünglichen Inhalt. Man sollte dies also evtl. anpassen. Das Makro selbst habe ich bei Lockergnome gefunden und erweitert um die Mitteilung, dass bereits ein Index existiert. Außerdem habe ich das ganze ergänzt um ein Makro, das den Index und sämtliche Links dorthin wieder löscht.

Sub Index()
Dim wSheet As Worksheet
Dim M As Long
M = 1

On Error Resume Next
If Worksheets(1).Name = "Index" Then
MsgBox "Ein Index besteht bereits."
Else
Worksheets.Add Before:=ActiveWorkbook.Worksheets(1)
Worksheets(1).Name = "Index"
End If

With ActiveWorkbook.Worksheets(1)
.Columns(1).ClearContents
.Cells(1, 1) = "INDEX"
.Cells(1, 1).Name = "Index"
End With

For Each wSheet In Worksheets
If wSheet.Name <> ActiveWorkbook.Worksheets(1).Name Then
M = M + 1
With wSheet
.Range("H1").Name = "Start" & wSheet.Index
.Hyperlinks.Add Anchor:=.Range("H1"), Address:="", SubAddress:="Index", TextToDisplay:="Zurück zum Index"
End With
ActiveWorkbook.Worksheets(1).Hyperlinks.Add Anchor:=ActiveWorkbook.Worksheets(1).Cells(M, 1), Address:="", _
SubAddress:="Start" & wSheet.Index, TextToDisplay:=wSheet.Name
End If
Next wSheet
End Sub

Wenn man diesen Index nicht mehr benötigt, kann man ihn mit folgendem Makro wieder löschen:

Sub Index_entfernen()
Dim wSheet As Worksheet

On Error GoTo Fehlermeldung
Application.DisplayAlerts = False 'Unterdrückt Sicherheitsabfrage
Worksheets("Index").Delete
Application.DisplayAlerts = True

For Each wSheet In ActiveWorkbook.Worksheets
wSheet.Activate
Range("H1").Select
Selection.ClearContents
Next wSheet

Exit Sub
Fehlermeldung:
MsgBox ("Es gibt kein Index.")

End Sub

]]>
http://www.sahanya.perun.net/archiv/2005/11/02/index-fur-excel/feed/ 0
Leere Zellen http://www.sahanya.perun.net/archiv/2005/07/16/leere-zellen/ http://www.sahanya.perun.net/archiv/2005/07/16/leere-zellen/#comments Sat, 16 Jul 2005 12:14:18 +0000 Sahanya http://www.sahanya.perun.net/archiv/2005/07/16/leere-zellen/ Leere Tabellenzellen in Word

Wenn man in Word viel mit Tabellen arbeitet, bzw. diese bearbeiten muss, kann es manchmal nötig sein alle leeren Zellen zu entfernen. Der Trick dabei ist, dass die leeren Tabellenzellen in Wahrheit überhaupt nicht leer sind, sondern zwei Zeichen beinhalten: Chr(13) und Chr(7). Deswegen muss man dies beim Löschen per VBA berücksichtigen. Ein Makro, das die leeren Zellen der Tabelle löscht, in der sich gerade der Cursor befindet könnte dann so aussehen:

Sub LeereZellen()
Dim oCell As Cell
Dim oRow As Row
On Error GoTo TabellenFM
For Each oRow In Selection.Tables(1).Rows
    For Each oCell In oRow.Cells
        If oCell.Range.Text = Chr(13) & Chr(7) Then
        oCell.Delete ShiftCells:=wdDeleteCellsShiftLeft
        End If
    Next oCell
Next oRow
Exit Sub
TabellenFM: MsgBox ("Fehler: Der Cursor befindet sich nicht in einer Tabelle.")
End Sub

Noch mehr Beispiele gibt es bei Word MVP

Die Angabe ShiftCells:=wdDeleteCellsShiftLeft bedeutet dabei, dass die verbleibenden Zellen der Reihe nach links verschoben werden. Da dies auch die Standardeinstellung ist, kann man auf diese Angabe verzichten. Möchte man jedoch, dass sich die verbleibenden Zellen anders verhalten muss man hier Änderungen vornehmen:

wdDeleteCellsShiftUp entspricht: Zellen nach oben verschieben
wdDeleteCellsEntireRow entspricht: ganze Zeile löschen
wdDeleteCellsEntireColumn entspricht: ganze Spalte löschen

Noch ein kleiner Tipp am Rande. Wenn sich eine Tabelle in einem Worddokument ganz am Anfang (also am oberen Seitenrand befindet) und man über der Tabelle noch etwas einfügen möchte, kann das ganz schön nervenaufreibend sein, denn der Cursor läßt sich nur in die erste Tabellenzeile setzen. Um eine leere Zeile über der Tabelle zu erhalten muss man den Cursor in die oberste Tabellenzeile setzen und dann aus dem Menü „Tabelle” den Punkt „Tabelle teilen” wählen.

]]>
http://www.sahanya.perun.net/archiv/2005/07/16/leere-zellen/feed/ 0
Suche/Ersetze nach Abfrage http://www.sahanya.perun.net/archiv/2005/06/05/sucheersetze-nach-abfrage/ http://www.sahanya.perun.net/archiv/2005/06/05/sucheersetze-nach-abfrage/#comments Sun, 05 Jun 2005 10:11:38 +0000 Sahanya http://www.sahanya.perun.net/archiv/2005/06/05/sucheersetze-nach-abfrage/ Fußnoten Aufgabe: In einem Word-Dokument sind verschiedene Fußnoten (keine „echten” Fußnoten, sondern einfacher Text), die unterschiedliche Tags bekommen sollen. Also, die Fußnote 1) soll einen Tag mit der ID f1 bekommen, die Fußnote 2) einen Tag mit der ID f2, die Fußnote * soll den Tag mit der ID f3 bekommen usw. Dies kann durch einen simplen Suche/Ersetze-Vorgang in Word erreicht werden:

Suche: 1), ersetze mit: <FnR RefID=f1>1)</FnR>

Um diesen Vorgang auch für Benutzer, die im Umgang mit Word sehr unerfahren sind komfortabel zu gestalten und um sich das lästige Eintippen des kompletten Tags zu ersparen, habe ich ein Makro erstellt.


Die Userform beinhaltet folgendes:

Private Sub Abbrechen_Click()
    Unload Fussnoten
End Sub

Private Sub Ersetze_Change()
End Sub

Private Sub OK_Click()
    FussnotenTags
End Sub

Private Sub Suche_Change()
End Sub

Folgendes Makro ruft die Userform auf:

Sub FussnotenAbfrage()
    Fussnoten.Show vbModeless
End Sub

Dieses Makro verarbeitet die eingegebenen Angaben:

Sub FussnotenTags()

strSuche = Fussnoten.Suche.Text
strErsetze = Fussnoten.Ersetze.Text

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = strSuche & "^t"
        .Replacement.Text = "<FnR RefID=" & strErsetze & ">" & strSuche & "</FnR>"
        .Forward = True
        .Wrap = wdFindContinue
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
Unload Fussnoten
End Sub

Kritische Stellen (je nach Dokument) sind jedoch leider noch vorhanden:

Da man bei einer Suche nach Zahlen oder Zeichen, aus denen eine klassische Fußnote ja besteht, nicht die Option “ganzes Wort” aktivieren kann, bzw. die Einstellung .MatchWholeWord = True keine Auswirkung hat, muss zuerst nach zweistelligen Fußnoten gesucht werden und dann nach einstelligen.

Außerdem habe ich die Suche eingeschränkt, so dass nach dem gesuchten Zeichen ein Tabstopp folgen muss. Damit verhindere ich, dass das Makro die Fußnote „11)” noch einmal findet, wenn danach nach der Fußnote „1)” gesucht wird. Diese Abgrenzung könnte je nach Dokument natürlich auch ein Leerschritt, Punkt o. ä. sein.

]]>
http://www.sahanya.perun.net/archiv/2005/06/05/sucheersetze-nach-abfrage/feed/ 0
Tabellenblätter speichern http://www.sahanya.perun.net/archiv/2005/05/06/tabellenblaetter-speichern/ http://www.sahanya.perun.net/archiv/2005/05/06/tabellenblaetter-speichern/#comments Fri, 06 May 2005 06:54:54 +0000 Sahanya http://www.sahanya.perun.net/archiv/2005/05/06/tabellenblatter-speichern/ Tabellenblätter in Excel Wenn man in einem Excel-Dokument Tabellen auf mehreren Tabellenblättern eingefügt hat, kann man diese zwar im Gesamten ausdrucken, doch man kann sie nicht in einem anderen Format (z. B. als Textdatei) speichern, denn Excel speichert bei so einem Vorgang nur das erste Tabellenblatt. Um also den kompletten Dateiinhalt in eine Textdatei zu bekommen, muss man sich die Inhalte der Tabellenblätter auf ein einzelnes Tabellenblatt kopieren. Mit Hilfe von VBA kann man dies automatisieren:

Sub Tabellenblaetter()
Dim TabellenBlatt As Byte
Dim FreieZeile As Integer

Worksheets(1).Activate

For TabellenBlatt = 2 To Sheets.Count

FreieZeile = Worksheets(1).UsedRange.SpecialCells(xlCellTypeLastCell).Row
Worksheets(TabellenBlatt).UsedRange.Copy _
Destination:=Worksheets(1).Cells(FreieZeile + 1, 1)

Next TabellenBlatt

End Sub

]]>
http://www.sahanya.perun.net/archiv/2005/05/06/tabellenblaetter-speichern/feed/ 0
Makro in Word rückgängig machen http://www.sahanya.perun.net/archiv/2005/04/18/makro-in-word-rueckgaengig-machen/ http://www.sahanya.perun.net/archiv/2005/04/18/makro-in-word-rueckgaengig-machen/#comments Mon, 18 Apr 2005 18:01:42 +0000 Sahanya http://www.sahanya.perun.net/archiv/2005/04/18/makro-in-word-ruckgangig-machen/ Rückgängig Gerade bei umfangreichen Makros kann das Rückgängigmachen der einzelnen Schritte recht mühsam werden. Bei der Suche nach einer Lösung, die es ermöglicht ein komplettes Makro oder aber auch mehrere Makros, die in einem Schritt ablaufen, die man aber aus Gründen der Übersichtlichkeit im Code auf mehrere Makros verteilt hat, bin ich auf eine Lösung von Roemer Lievaart gestoßen. Diese ist zwar für Word97 ausgewiesen, funktioniert aber auch in Word2003.

Dazu setzt man die Zeile StartUndoSaver einfach an den Beginn eines Makros und die Zeile EndUndoSaver an das Ende, so dass man folgendes erhält:

Sub Irgendwas
StartUndoSaver

Hier kommt der Code.
EndUndoSaver
End Sub

Zusätlich muss man noch folgende Makros haben, die man am Besten in einem eigenen Modul einfügt:


Option Explicit

Sub StartUndoSaver()
On Error Resume Next
ActiveDocument.Bookmarks.Add "_InMacro_"
On Error GoTo 0
End Sub

Sub EndUndoSaver()
On Error Resume Next
ActiveDocument.Bookmarks("_InMacro_").Delete
On Error GoTo 0
End Sub

Sub EditUndo() ' Catches Ctrl-Z
If ActiveDocument.Undo = False Then Exit Sub
While BookMarkExists("_InMacro_")
If ActiveDocument.Undo = False Then Exit Sub
Wend
End Sub

Sub EditRedo() ' Catches Ctrl-Y
If ActiveDocument.Redo = False Then Exit Sub
While BookMarkExists("_InMacro_")
If ActiveDocument.Redo = False Then Exit Sub
Wend
End Sub

Private Function BookMarkExists(Name As String) As Boolean
On Error Resume Next
BookMarkExists = Len(ActiveDocument.Bookmarks(Name).Name) > -1
On Error GoTo 0
End Function

TextmarkeNach dem Ausführen eines Makros, das mit dem Code (StartUndoSaver und EndUndoSaver) umschlossen wurde, kann man jetzt mit Strg+Z das komplette Makro rückgängig machen und mit Strg+Y wieder herstellen.

In der Dropdownliste erkennt man das umschlossene Makro an den „Textmarken”.

So und jetzt bin ich noch auf der Suche nach einer ähnlichen Lösung für Excel-Makros. Eine Möglichkeit habe ich dazu bei J-Walk.com gefunden, werde aber nicht recht schlau daraus.

]]>
http://www.sahanya.perun.net/archiv/2005/04/18/makro-in-word-rueckgaengig-machen/feed/ 3
FreeWheel http://www.sahanya.perun.net/archiv/2005/04/06/freewheel/ http://www.sahanya.perun.net/archiv/2005/04/06/freewheel/#comments Wed, 06 Apr 2005 17:34:05 +0000 Sahanya http://www.sahanya.perun.net/archiv/2005/04/06/freewheel/ MausNichts ist nerviger als festzustellen, dass das Scrollrad der Maus in bestimmten Anwendungen nicht funktioniert, z. B. im VBA-Editor und in Excel während man Zellen markiert hat. FreeWheel kann ich daher allen empfehlen!

]]>
http://www.sahanya.perun.net/archiv/2005/04/06/freewheel/feed/ 0
Versalschrift http://www.sahanya.perun.net/archiv/2005/04/06/versalschrift/ http://www.sahanya.perun.net/archiv/2005/04/06/versalschrift/#comments Wed, 06 Apr 2005 17:18:00 +0000 Sahanya http://www.sahanya.perun.net/archiv/2005/04/06/versalschrift/ Wenn man mit Dokumenten arbeitet, die Text enthalten, der nicht mit der Shift-Taste GROSS geschrieben wurde, sondern mittels Formatierung in Word (Format – Zeichen – Schrift) in Großbuchstaben umgewandelt wurde, kann es zu überraschenden bzw. ärgerlichen Ergebnissen kommen, wenn man zusätzlichen Text einfügen möchte, der nicht in Versal geschrieben sein soll.

Außerdem kann es zu Problemen kommen, wenn man diesen Text in eine andere Anwendung exportieren oder kopieren möchte, wenn unterwegs die Formatierung verloren geht.

Das folgende Makro wandelt alle Absätze deren Text die Formatierung Großbuchstaben enthält in „richtige” Großbuchstaben um:

Sub VersalKonvertieren
Dim oPar As Paragraph
     For Each oPar In ActiveDocument.Paragraphs
        If (Len(oPar.Range.Text) > 1) And _
        (oPar.Range.Font.AllCaps = True) Then
        oPar.Range.Case = wdUpperCase
        End If
     Next oPar
End Sub

Handelt es sich um Text, der nicht als Großbuchstabe sondern als Kapitälchen formatiert wurde, muss man „AllCaps” mit „SmallCaps” ersetzen.

]]>
http://www.sahanya.perun.net/archiv/2005/04/06/versalschrift/feed/ 2
Blindtext http://www.sahanya.perun.net/archiv/2005/01/10/blindtext/ http://www.sahanya.perun.net/archiv/2005/01/10/blindtext/#comments Mon, 10 Jan 2005 21:09:33 +0000 Sahanya http://www.sahanya.perun.net/archiv/2005/01/10/blindtext/ Wenn man für VBA (aber auch für andere Gelegenheiten, z. B. um ein Schriftbild zu beurteilen) auf die Schnelle einen Blindtext benötigt, bietet es sich an, die dafür in Word vorhandene Funktion zu nutzen: einfach =rand() eingeben und Word schreibt in das geöffnete Dokument:

Franz jagt im komplett verwahrlosten Taxi quer durch Bayern.

Füllt man die Klammer (wie o. a.) nicht aus, erscheinen 3 Absatze mit jeweils 5 Sätzen dieses Textes. Man kann aber auch die Anzahl der Absätze und der darin enthaltenen Sätze bestimmen, wobei die erste Zahl die Anzahl der Absätze und die zweite Zahl die Anzahl der in einem Absatz vorkommenden Sätze bestimmt: =rand(1.2) ergibt also einen Absatz mit zwei Sätzen.

Eine umfangreiche Sammlung von Blindtexten findet man bei Newmediadesigner. Mein persönlicher Favorit:

Blind von Geburt an

Ich bin Blindtext. Von Geburt an. Es hat lange gedauert, bis ich begriffen habe, was es bedeutet, ein blinder Text zu sein: Man macht keinen Sinn. Man wirkt hier und da aus dem Zusammenhang gerissen. Oft wird man gar nicht erst gelesen. Aber bin ich deshalb ein schlechter Text? Ich weiss, dass ich nie die Chance haben werde, im Stern zu erscheinen. Aber bin ich darum weniger wichtig? Ich bin blind! Aber ich bin gerne Text. Und sollten Sie mich jetzt tatsächlich zu Ende lesen, dann habe ich etwas geschafft, was den meisten “normalen” Texten nicht gelingt.

]]>
http://www.sahanya.perun.net/archiv/2005/01/10/blindtext/feed/ 1
Shapes http://www.sahanya.perun.net/archiv/2004/12/25/shapes/ http://www.sahanya.perun.net/archiv/2004/12/25/shapes/#comments Sat, 25 Dec 2004 08:17:24 +0000 Sahanya http://www.sahanya.perun.net/archiv/2004/12/25/shapes/ Wenn man in einem Office-Dokument via VBA einzelne Objekt-Formen ansprechen möchte, die z. B. über das Menü „Einfügen” eingefügt wurden, muss man die jeweilige Shape bzw. Form einzeln ansprechen, da sonst sämtliche Formen betroffen wären.

Hier zwei Beispiele:


Sub Textboxen()
'Text in Textboxen wird grün

Dim Form As Shape

On Error Resume Next

For Each Form In ActiveDocument.Shapes
If Form.Type = msoTextBox Then
Form.TextFrame.TextRange.Font.Color = wdColorGreen
End If
Next

End Sub

Sub Linienloeschen()

'Linien werden gelöscht

Dim Form As Shape
For Each Form In ActiveDocument.Shapes
If Form.Type = msoLine Then
Form.Delete
End If
Next

End Sub

Bei René Probst gibt es eine Auflistung sämtlicher Shapes.

]]>
http://www.sahanya.perun.net/archiv/2004/12/25/shapes/feed/ 0
doc-Text in HTML konvertieren http://www.sahanya.perun.net/archiv/2004/12/12/doc-text-in-html-konvertieren/ http://www.sahanya.perun.net/archiv/2004/12/12/doc-text-in-html-konvertieren/#comments Sun, 12 Dec 2004 18:31:33 +0000 Sahanya http://www.sahanya.perun.net/archiv/2004/12/12/doc-text-in-html-konvertieren/ Möchte man einen längeren Text in einem Word-Dokument HTML-tauglich machen, müssen mehrere Schritte unternommen werden:

  1. Überflüssige Leerzeilen, -zeichen u. ä. löschen
  2. Sonderzeichen maskieren
  3. Internet- und E-Mail-Adressen „umsetzen”
  4. Absätze mit Tags umschließen
  5. Ungeordnete und Geordnete Listen kennzeichen

Um all diese Schritte automatisch vornehmen zu können, habe ich ein Makro zusammengestellt, das dies alles erledigt.


gezippte .txt-Datei
Text-Datei herunterladen und den Text in ein Modul kopieren.

gezipptes Modul
Die Datei herunterladen und dann im MS Script-Editor importieren.

Zum Anwenden das Makro „Struktur” aufrufen. Für die Listen einen Bereich markieren und dann das entsprechende Makro aufrufen.

]]>
http://www.sahanya.perun.net/archiv/2004/12/12/doc-text-in-html-konvertieren/feed/ 0
ASCII http://www.sahanya.perun.net/archiv/2004/11/12/ascii/ http://www.sahanya.perun.net/archiv/2004/11/12/ascii/#comments Fri, 12 Nov 2004 19:08:55 +0000 Sahanya http://www.sahanya.perun.net/archiv/2004/11/12/ascii/ Word hat einige Stolpersteine eingebaut, die das Suchen und Ersetzen von mehreren aufeinander folgenden Absatzmarken etwas erschweren. Durch das Ersetzen mit ASCII-Code und der Umwandlung eines Kommas in ein Semikolon wird es allerdings wieder machbar.


Möchte man in einem Word-Dokument nicht nur einfache Buchstaben, sondern evtl. mehrere Absatzmarken finden und auch ersetzen ist der einfachste Weg natürlich über Strg+H bzw. Bearbeiten –> Ersetzen. Dort muss man dann das Feld „Erweitern” anklicken. Man erhält dann folgendes Bild:

Suchen -- Ersetzen

Hier setzt man jetzt den Cursor in das Suchen-Feld und klickt anschließend auf „Sonstiges”. Man erhält eine Auswahlliste auf der man (für das jetzige Beispiel) auf „Absatzmarke” klickt. Im Suchenfeld wurde jetzt automatisch ^p eingefügt. Möchte man jedoch mehrere aufeinander folgende Absatzmarken suchen ist es sehr umständlich (und vor allen Dingen auch unnötig nun mehrere ^ps hintereinander einzugeben, insbesondere dann wenn im Dokument die Anzahl der aufeinander folgenden Absatzmarken variiert, d. h. an einer Stelle sind 3 Absatzmarken an einer anderen Stelle evtl. 17 Absatzmarken hintereinander.

Um all diese Fälle mit einem Suchgang, bzw. mit einer Suchprozedur im VBA-Code abzufangen muss man Platzhalter verwenden. Wenn man also ein Häkchen bei „Platzhalterzeichen verwenden” macht und dann erneut auf „Sonstiges” klickt erscheint eine völlig andere Liste als vorher – eben die Platzhalter. In diesem Beispiel würde man also den Platzhalter „Anzahl Vorkommen” wählen. Es erscheint { ; } im Suchen-Feld. Hier kann man nun zwei Zahlen im Sinne „von …. bis …” eingeben, also z. B. {2;100}.

Achtung: Hat man hier z. B. nachgeschaut, um diesen Code in eine VBA-Prozedur zu übernehmen muss man darauf achten, dass man ein Semikolon nimmt und nicht wie in der Übersicht angezeigt ein Komma!

Man kann jetzt meinen Word würde jetzt alle Stellen im Text finden an denen zwei bis hundert Absatzmarken aufeinander folgen, aber man erhält diese Fehlermeldung:

Fehlermeldung

Möchte man nämlich mit Hilfe von Platzhaltern suchen muss man diese Option vorher aktivieren und hat man dies getan, fällt einem schnell auf, dass die Abatzmarke (im Gegensatz zum z. B. Tabstopp) gar nicht als Möglichkeit angeführt wird. Um Word hier zu überlisten muss man also auf den ASCII-Code zurückgreifen, der ist für die Absatzmarke „13”. Eingeben muss man ihn allerdings sowohl im Suchfeld also auch im VBA-Code so: ^013. Die Suche nach mehreren Absatzmarken sieht also so aus:

^013{2;100}

Beim Ersetzen kann man allerdings wieder auf das ^p zurückgreifen.

Den entsprechenden Code findet man übrigens innerhalb von Word, wenn man auf Einfügen –> Symbol klickt.

Zeichencode

Innerhalb von Word kann man den Ascii-Code auch mit gedrückter Alt-Taste und der entsprechenden dreistelligen Nummer auf dem Zahlenblock eingeben, das Enterzeichen also als Alt+013.

Im Internet findet man sämtliche Unicode-Tabellen hier und eine übersichtliche ASCII-Code-Tabelle hier.

]]>
http://www.sahanya.perun.net/archiv/2004/11/12/ascii/feed/ 0
Suche und Ersetzen http://www.sahanya.perun.net/archiv/2004/10/22/suche-und-ersetzen/ http://www.sahanya.perun.net/archiv/2004/10/22/suche-und-ersetzen/#comments Fri, 22 Oct 2004 16:01:20 +0000 Sahanya http://www.sahanya.perun.net/archiv/2004/10/22/suche-und-ersetzen/ Mal was ganz einfaches zum Anfang. Wenn man Suche-Ersetze-Routinen mit dem Makro-Rekorder aufzeichnet, bekommt man einen Code, der ganz leicht ins uferlose wächst, insbesondere dann wenn man in Dokumenten sehr viel suchen und ersetzen möchte.

Kürzer geht es, wenn man sich ein Makro erstellt, das nur die Suchroutine enthält und dann ein Extra-Makro, innerhalb dessen dann die Suche-Ersetze-Begriffe „aufgelistet” sind, die dann auf das Suche-Ersetze-Makro zugreifen. Noch übersichtlicher wird das ganze, wenn man das Suche-Ersetze-Makro in ein eigenes Modul einfügt.


Beispiel für das Suche-Ersetze-Makro:

Sub SuErNo(FindText As String, ReplaceText As String)
'SuErNo = SucheErsetzeNormal

With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
löscht alles was in der Suche-Ersetze-Maske vorher war

.Text = FindText
.Replacement.Text = ReplaceText

.Forward = True ‘Suchrichtung: vom Anfang
.Wrap = wdFindContinue ‘ganzes Dokument ohne Nachfrage
.Format = False ‘Formatierung nicht beachten
.MatchCase = True ‘Groß-/Kleinschreibung beachten
.MatchWholeWord = True
.MatchWildcards = False ‘Platzhalter nicht beachten

.Execute Replace:=wdReplaceAll
End With
End Sub

Und so greift man auf dieses Makro zu:

Call SuErNo("i.H.v.", "i. H. v.")
Call SuErNo("i.V.m.", "i. V. m.")
Call SuErNo("p.a.", "p. a.")
Call SuErNo("u.a.", "u. a.")

]]>
http://www.sahanya.perun.net/archiv/2004/10/22/suche-und-ersetzen/feed/ 0