Excel-Makro-Befehl für das "Ersetzen"-Popup

  • #1
K

klexy

Bekanntes Mitglied
Themenersteller
Dabei seit
04.05.2002
Beiträge
802
Reaktionspunkte
0
Ort
Bayern
Ich möchte mittels eines Makros das Popup aufrufen, in dem man suchen und ersetzen kann (Strg+H).
Dies soll im Suchen nach-Feld schon mit einem zu suchenden Begriff gefüllt sein. Das Ersetzen durch-Feld soll erst vom Anwender befüllt werden.
Geht das?

Konkret:
In der Datei sind 31 Tabellenblätter (für jeden Tag des Monats eines). Darin sind Formeln wie
=WERT('C:\Blabla\[tagesreport_xxxxx.xls]Tabelle1'!C6)
tagesreport_xxxxx.xls ist ein Dummy-Verweis auf eine leere Datei.
Am 26.05.04 soll die Formel im Tabellenblatt 26 auf folgendes geändert werden:
=WERT('C:\Blabla\[tagesreport_26.05.04.xls]Tabelle1'!C6)
Da durch das Makro noch andere Sachen erledigt werden, soll zu einem bestimmten Zeitpunkt dieses Popup erscheinen, das oben immer xxxxx haben soll, unten aber jeden Tag ein anderes Datum.
 
  • #2
Hallo klexy,

hab dir ein Makro-Beispiel zusammengestellt, welches die gewollte Funktion erfüllen sollte.

Es öffnet keinen Ersetzen-Dialog, sondern ...

Sub xxxxx_gegen_Tagesdatum_InFormelnErsetzen()
' 0. Abfrage, ob xxxxx in Formeln gegen DD.MM.YY erstzt werden soll
' Nein -> Abbruch
' 1. Blatt mit dem Tagesnamen öffen
' 1.1 Wenn Blatt nicht vorhanden ist, erfolgt eine entsprechende Meldung
' 2. xxxxx in Formeln diese Tabellenblattes durch DD.MM.YY ersetzen

Dieses Makro kannst Du beim Öffnen der Arbeitsmappe aufrufen.
Dann wird automatisch auf dem Tagesblatt das Ersetzen durchgeführt.
Dazu mußt Du die Kommentarzeichen vor
'Private Sub Workbook_Open()
' Call xxxxx_gegen_Tagesdatum_InFormelnErsetzen
'End Sub
entfernen.

Das Makro soll im Code-Fenster->DieseArbeitsmappe' deiner Arbeitsmappe liegen.

Beispiel-Datei ist per mail unterwegs.

Gruß Matjes :)

Code:
Option Explicit
'Private Sub Workbook_Open()
'  Call xxxxx_gegen_Tagesdatum_InFormelnErsetzen
'End Sub

Sub xxxxx_gegen_Tagesdatum_InFormelnErsetzen()
' _xxxxx auf dem Tagesblatt gegen _TT.MM.YY in Formeln ersetzen
' Blattnamen sind zweistellig mit führender 0
' Werte sind zulässig von 01 bis 31
'
' 0.  Abfrage, ob _xxxxx in Formeln gegen _DD.MM.YY erstzt werden soll
'     Nein -> Abbruch
' 1.  Blatt mit dem Tagesnamen öffen
' 1.1 Wenn Blatt nicht vorhanden ist, erfolgt eine entsprechende Meldung
' 3.  xxxxx in Formeln diese Tabellenblattes durch DD.MM.YY ersetzen

  Dim ws As Worksheet, zelle As Range, ret As Integer, s_tmp As String
  Dim s_BN_Heute As String, s_Datum_Heute, pos1 As Integer
  Const c_Suchstring = xxxxx
  
 ->Tage zweistellig mit führender 0 für Namen des Tagesblattes
  s_BN_Heute = Format(Now, Dd)->Tage zweistellig mit führender 0
 ->Ersetzenstring DD.MM.YY
  s_Datum_Heute = Format(Now(), Dd.mm.yy)
  
 -> 0.  Abfrage, ob _xxxxx in Formeln gegen _DD.MM.YY erstzt werden soll
 ->     Nein -> Abbruch
  If 6 <> MsgBox(Soll auf Tabellenblatt  & Format(Day(Now()), 00) & _
          vbLf & in den Formeln der Defaultstring-> & c_Suchstring &->  & _
          vbLf & durch das Tagesdatum ersetzt werden ? & _
          vbLf & vbLf & c_Suchstring &  -->  & s_Datum_Heute, _
          vbQuestion + vbDefaultButton1 + vbYesNo) Then Exit Sub
  
 ->1. Blatt des aktuellen Tages öffnen
  On Error GoTo ws_NichtVorhanden
  Set ws = ActiveWorkbook.Worksheets(s_BN_Heute)
  On Error GoTo 0
  ws.Activate
  
 ->2. _xxxxx in Formeln diese Tabellenblattes durch _TT.MM.YY ersetzen
  With ws.UsedRange
    Set zelle = .Find(c_Suchstring, LookIn:=xlFormulas, MatchCase:=True)
      Do While Not zelle Is Nothing
         ->gefundene Formel auslesen
          s_tmp = zelle.Formula
          pos1 = InStr(1, s_tmp, c_Suchstring)
          s_tmp = Left(s_tmp, pos1 - 1) & s_Datum_Heute & _
                  Right(s_tmp, Len(s_tmp) - (pos1 + Len(c_Suchstring) - 1))
 ->Wenn die Formel einen Dateiverweis enthält der durch das Ersetzen
 ->auf eine nicht vorhandene Datei verweist, öffnet sich der Auswahldialog
 ->zur Auswahl eine andere Datei.
 ->!!! Dieser Alarm wird abgeschalten                     !!!
 ->!!! und damit die Änderung ohne Nachfrage durchgeführt !!!
 ->In der Zelle erscheint #BEZUG!, wenn der Verweis ins Leere zeigt
          Application.DisplayAlerts = False
         ->geänderte Formel zuweisen
          zelle.Formula = s_tmp
          Application.DisplayAlerts = False
          Set zelle = .FindNext(zelle)
      Loop
    On Error Resume Next: Set zelle = Nothing: On Error GoTo 0
  End With
  Set ws = Nothing
Exit Sub

ws_NichtVorhanden:
  MsgBox (Es werden Blattnamen->01' bis->31' erwartet! & _
          vbLf & vbLf & _
          Blatt-> & s_BN_Heute &-> konnte nicht geöffnet werden.)
End Sub
 
  • #3
Spät aber doch:
Danke für das Makro.
Richtig kapiert hab ich es nicht, aber es funktioniert nur am aktuellen Tag. Übers Wochenende macht keiner die Einträge, so daß am Montag 3 Abfragen eingespielt werden müsen, also unterschiedliche Daten eingegeben werden müssen.
Kann aber auch sein, daß die Daten mal nicht korrekt waren und am Nachmittag neu eingespielt werden müssen - oder so.
Daher brauch ich nur den Aufruf mit Strg+H und die Befüllung des zu ersetzenden Ausdrucks, damit der neu einzufügened Ausdruck ganz nach Belieben gemacht werden kann.

Ich lass die Leute jetzt das Strg+H ganz unelegant selbst von Hand machen und hab das eigentliche Makro in eine Schaltfläche davor und eine Schaltfläche danach aufgeteilt. Das können sich auch bei uns die meisten noch merken ;)
 
  • #4
Hallo klexy,

hab nochmal gegrübelt, ob ich deiner ursprünglichen Frage näher kommen kann. Dabei ist folgendes herausgekommen:
Code:
Public Sub ErsetzenDialogAufrufen()
  Const c_Suchstring = xxxxx
  
 ->Ersetzen-Dialog öffnen (STRG+H)
  ActiveWorkbook.Application.SendKeys (^h)
 ->Feld->Suchen' mit Suchbegriff füllen
  ActiveWorkbook.Application.SendKeys (c_Suchstring)
 ->mit Tab auf Feld->Ersetzen' weiterschalten
  ActiveWorkbook.Application.SendKeys ({TAB})
 ->Feld->Ersetzen' mit aktuellem Datum füllen
  ActiveWorkbook.Application.SendKeys (Format(Now(), Dd.mm.yy))
End Sub

Gruß Matjes :)
 
  • #5
Hi klexy,

noch ein Hinweis zum Suchen und Ersetzen in Formeln:

Eigentlich ist es Zufall, daß es in den meisten Fällen klappt, da im Dialog->Suchen und Ersetzen' im Gegensatz zum Dialog->Suchen' die Einstellmöglichkeit->In Formeln, In Werten, In Kommentaren' fehlt.

Die eigentlich von von MS vorgesehene Aufruffunktion (siehe unten) geht für Formeln schief, da ihr der Parameter look_in fehlt. Sie ist deshalb ungeeignet.

Code:
Public Sub ErsetzenDialogAufrufen2()
  Const c_Suchstring = xxxxx
  
 ->Dialog ersetzen aufrufen
 ->Aufrufparameter (Stellungsparameter):
 ->find_text, replace_text, look_at, look_by, active_cell, match_case, match_byte
  Application.Dialogs.Item(xlDialogFormulaReplace).Show _
      c_Suchstring, Format(Now(), Dd.mm.yy), , , , True
End Sub


Eine Liste aller aufrufbaren eingebauten Dialog ist in der VB-Hilfe unter->Dialogs' zu finden.

Auf MSN ist es leichter zu finden, beispielsweise für Excel 2000 unter

Gruß Matjes ;)
 
Thema:

Excel-Makro-Befehl für das "Ersetzen"-Popup

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.966
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben