Herbers Excel-Forum - das Archiv
Suche/Finde-VBA-> Vorbelegung ?

|
Betrifft: Suche/Finde-VBA-> Vorbelegung ?
von: Fabio
Geschrieben am: 04.01.2007 09:55:05
Hallo zusammen,
Anfang des letzen Jahres habe ich ein "Suche/finde" VBA hier im Forum bekommen. Wird aufgerufen mit "Call" - und zwar das folgende Script :
Sub SuchenNachAA()
finde = Cells(ActiveSheet.UsedRange.SpecialCells(xlLastCell).Row, 27)
Application.Dialogs(xlDialogFormulaReplace).Show finde
End Sub
Nun öffnet sich der Dialog "Suchen/Ersetzen", nur ist das Feld "suchen nach" nicht mehr vorbelgt (vermutlich weil ich andere Dateien habe).
Soweit ich das in Erinnerung habe, sucht der damit die letzte Zeile :
finde = Cells(ActiveSheet.UsedRange.SpecialCells(xlLastCell).Row, 27)
-> nur - mit welchem "Befehl" ist definiert, das er das "suchen nach" Feld vorbelegt ?
Anders gesagt : Ich suche eine Lösung für :
1. Markiere die Letzte Zeile
2. Öffene das "suchen/ersetzen" Feld
3. Belege das "suche" Feld mit dem Wert vor, der in "der letzen Reihe in der Spalte "AA" steht.
Danke für Tipps, Hinweise - und/oder auch Lösungen.
Fabio
Betrifft: AW: Suche/Finde-VBA-> Vorbelegung ?
von: Ramses
Geschrieben am: 04.01.2007 10:02:24
Hallo
SuchenNachAA()
'Variable "finde" für den Dialogbegriff füllen
'Dafür wird der Inhalt der letzten Zelle ("xlLastCell") in Spalte 27 verwendet
finde = Cells(ActiveSheet.UsedRange.SpecialCells(xlLastCell).Row, 27)
'Hier wird der Begriff übergeben
'Wenn allerdings die letzte Zelle in Spalte 27 leer ist
'... dann ist auch das "Suchen"-Feld im Dialog leer :-)
Application.Dialogs(xlDialogFormulaReplace).Show
finde
Sub
Gruss Rainer
Betrifft: Vielen Dank !
von: Fabio
Geschrieben am: 04.01.2007 10:46:58
Hallo,
Danke für die Aufteilung. Jetzt habe ich es auch wieder verstanden !
Fabio
Betrifft: AW: Suche/Finde-VBA-> Vorbelegung ?
von: Peter Feustel
Geschrieben am: 04.01.2007 10:10:54
Hallo Fabio,
das sollte so funktionieren:
Sub SuchenNachAA()
Dim finde As String
Range("AA" & Range("AA65536").End(xlUp).Row).Select
finde = Cells(ActiveSheet.UsedRange.SpecialCells(xlLastCell).Row, 27)
Application.Dialogs(xlDialogFormulaReplace).Show finde
End Sub
Mit der 27 am Ende ist die 27. Spalte - also AA - bezeichnet.
Viele Grüße Peter
Eine kurze Nachricht, ob es läuft, wäre nett - danke.
Betrifft: AW: Suche/Finde-VBA-> Vorbelegung ?
von: Ramses
Geschrieben am: 04.01.2007 10:25:07
Hallo Peter
Sei mir nicht böse,... aber wozu ?
Wenn "SpecialCells(xlLastCell).Row" leer ist,... dann ist sie nun mal leer.
LEER Heisst ja nciht LEER,... sondern vielleicht eine Formel die KEINEN Wert ausgibt !!!
ODER NUR eine Zelle die formatiert wurde !!!
Ganz abgesehen davon wird die Variable bei Dir ja nicht geändert.
Also ist nicht davon auszugehen, dass es irgendeine Besserung gibt.
Gruss Rainer
Betrifft: Nochmals offen weil Problem -zuviel wird ersetzt
von: Fabio
Geschrieben am: 04.01.2007 10:55:39
Danke nochmals für die Tipps.
Ich kopiere mittels VBA die "letzte" Zeile
-> dann wird wird per Call das "Suchen/Ersetzen" Script ausgeführt (siehe unten).
Das Problem: Er ersetzt nicht nur die Werte in der letzten Zeile - sondern auch in der Zeile darüber (also die Zeile, die ich kopierte). Weiss jemand warum ? Der soll nur die "letzte" Zeile ersetzen.. ?
a) VBA zum Kopieren der "letzten" zeile :
Sub letzte_zeile_kopieren()
Rows(Range("A65535").End(xlUp).Row).Copy
Rows(Range("A65535").End(xlUp).Row + 1).Insert
Rows(Range("A65535").End(xlUp).Row).Select
Call SuchenNachAA
End Sub
b) VBA zum "Suchen/Ersetzen" :
Sub SuchenNachAA()
ActiveSheet.Range("A65536").End(xlUp).EntireRow.Select
finde = Cells(ActiveSheet.UsedRange.SpecialCells(xlLastCell).Row, 27)
Application.Dialogs(xlDialogFormulaReplace).Show finde
End Sub
Danke
Fabio
Betrifft: AW: Nochmals offen weil Problem -zuviel wird erset
von: Ramses
Geschrieben am: 04.01.2007 12:43:53
Hallo
"...Er ersetzt nicht nur die Werte in der letzten Zeile -..."
Ist doch klar,... dieser Dialog funktioniert auf Worksheet bzw. Workbook-Ebene.
Schau dir mal die Funktionen Replace oder Substitute in der VBA Hilfe an.
Damit kannst du in einer Schleife einen definierten Bereich abfragen
Sub StartWechsel(srcRow As Integer, srcString As String, newText)
Dim myc As Range
Dim myCounter As Integer
For Each myc In Range(Cells(srcRow, 1), Cells(srcRow, 255))
If InStr(1, myc, srcString, vbTextCompare) > 0 Then
myc = Application.WorksheetFunction.Substitute(myc, srcString, newText)
myCounter = myCounter + 1
End If
Next
MsgBox myCounter & " Ersetzungen durchgeführt"
End Sub
Sub Test()
Call StartWechsel(6, "Alter Text", "Neuer Text")
End Sub
Gruss Rainer
Betrifft: Danke - aber
von: Fabio
Geschrieben am: 04.01.2007 14:25:56
Hallo Rainer,
Danke für Deine Arbeit. Blöde Frage aber dazu: Füge ich Deine beiden Scripte einfach "extra" ein -> wenn ja - wie starte ich die dann ?
Weil...
a) führe ich "mein" Script "letzte Zeile kopieren" aus
b) Dann Dein "Test"
kommt nur eine "Meldung, das "0" zeichen ersetzt wurden
Fabio
Betrifft: AW: Danke - aber
von: Ramses
Geschrieben am: 04.01.2007 14:59:43
Hallo
"...wie starte ich die dann ..."
Siehe
Sub Test()
Ich dachte das wäre eigentlich klar
Sub letzte_zeile_kopieren()
Dim lastRow as long
Dim findStr as String
Rows(Range("A65535").End(xlUp).Row).Copy Rows(Range("A65535").End(xlUp).Row + 1)
'Nur zur Vereinfachung der Parameterübergabe
lastRow = Range("A65535").End(xlUp).Row
'ICH würde nicht mit SpecialCells arbeiten
'Weil UsedRange keinen klaren Wert zurückliefert !!!!
'sondern den Wert direkt auslesen
'Dein Code
'findStr = Cells(ActiveSheet.UsedRange.SpecialCells(xlLastCell).Row, 27)
'Mein Code
findStr = Cells(lastRow,27).Value
Call StarteWechsel( lastRow, findStr, "Der text mit dem du ersetzen willst")
End Sub
Gruss Rainer
Betrifft: Fehlermeldung:Argummenttyp unverträglich
von: Fabio
Geschrieben am: 05.01.2007 09:23:23
Hallo Rainer,
nochmals Danke für die Arbeit, die Du Dir machtest.
Das "unten stehende" habe ich nun eingefügt - allerdings kommt eine Fehlermeldung bei der Zeile "Call StarteWechsel(lastRow" (Er markiert das "lastRow") - mit dem Hinweis Argumenttyp ByRef unverträglich.
Hmm - und nun ?
Danke auf jeden Fall !
Fabio
das Script im Wortlaut :
Sub letzte_zeile_kopieren_0001()
Dim lastRow As Long
Dim findStr As String
Rows(Range("A65535").End(xlUp).Row).Copy Rows(Range("A65535").End(xlUp).Row + 1)
'Nur zur Vereinfachung der Parameterübergabe
lastRow = Range("A65535").End(xlUp).Row
'ICH würde nicht mit SpecialCells arbeiten
'Weil UsedRange keinen klaren Wert zurückliefert !!!!
'sondern den Wert direkt auslesen
'Dein Code
'findStr = Cells(ActiveSheet.UsedRange.SpecialCells(xlLastCell).Row, 27)
'Mein Code
findStr = Cells(lastRow, 27).Value
Call StarteWechsel(lastRow, findStr, "Der text mit dem du ersetzen willst")
End Sub
Sub StarteWechsel(srcRow As Integer, srcString As String, newText)
Dim myc As Range
Dim myCounter As Integer
For Each myc In Range(Cells(srcRow, 1), Cells(srcRow, 255))
If InStr(1, myc, srcString, vbTextCompare) > 0 Then
myc = Application.WorksheetFunction.Substitute(myc, srcString, newText)
myCounter = myCounter + 1
End If
Next
MsgBox myCounter & " Ersetzungen durchgeführt"
End Sub
Sub Test()
Call StartWechsel(6, "Alter Text", "Neuer Text")
End Sub
Betrifft: AW: Fehlermeldung:Argummenttyp unverträglich
von: Ramses
Geschrieben am: 05.01.2007 12:37:14
Hallo
Sorry, die Zeile muss lauten
Sub StarteWechsel(srcRow As Integer, srcString As String, newText
As String)
Gruss Rainer
Betrifft: AW: Fehlermeldung:Argummenttyp unverträglich
von: yps
Geschrieben am: 05.01.2007 12:46:30
Sub StarteWechsel(srcRow As
Long , srcString As String, newText As String)
Betrifft: Sicherheitsoption :-)
von: Ramses
Geschrieben am: 05.01.2007 13:10:57
Hallo
Danke für dne Hinweis, aber ich glaube/hoffe nicht, dass er mehr als 32000 Einträge hat.
Gruss Rainer
Betrifft: nicht nur Sicherheitsoption ;-)
von: yps
Geschrieben am: 05.01.2007 13:20:00
hi Rainer,
in der
Sub letzte_zeile_kopieren_0001()
ist der Übergabewert als long deklariert und genau das ergibt seine hübsche Fehlermeldung ;-)
cu Micha
Betrifft: AW: nicht nur Sicherheitsoption ;-)
von: Ramses
Geschrieben am: 05.01.2007 15:04:42
Hallo
Das kommt davon, wenn man schnell was zusammenschustert :-)
Danke
Gruss Rainer