trotz längerer Google-Recherche bin ich leider nicht nach einer Lösung
für mein Problem fündig geworden: ich möchte automatisch alle Zeilen,
in denen in Spalte D der Wert "weihnachtsmann" oder "heuschrecke" oder
"abwrackprämie" steht, komplett löschen lassen.
Leider bin ich absoluter Neuling auf dem VBA / Makroterrain.. bin für
jeden Tipp dankbar!
Krisovice
> trotz längerer Google-Recherche bin ich leider nicht nach einer Lösung
> für mein Problem fündig geworden: ich möchte automatisch alle Zeilen,
> in denen in Spalte D der Wert "weihnachtsmann" oder "heuschrecke" oder
> "abwrackprämie" steht, komplett löschen lassen.
Hallo Krisovice,
probier's mal hiermit:
Sub Zeilen_löschen()
With Columns("D")
.Replace What:="weihnachtsmann", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
.Replace What:="heuschrecke", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
.Replace What:="abwrackprämie", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
.SpecialCells(xlCellTypeBlanks).Select
End With
Selection.EntireRow.Delete
End Sub
--
Mit freundlichen Grüssen Eberhard
XP home XL 2000
Eberhard(punkt)W(punkt)Funke(at)t-online.de
Ich gehe davon aus, dass diese Worte jeweils allein in den Zellen stehen
sollen.
E2: =ODER(D2={"abwrackprämie";"heuschrecken";"weihnachtsmann"})
Wenn nicht so (sondern noch mehr Worte oder Zeichen in der Zelle), dann:
E2:
=ODER(ISTZAHL(SUCHEN({"abwrackprämie";"heuschrecken";"weihnachtsmann"};D2;1)))
Autofiltere nun E2 nach FALSCH und kopiere das Filtrat in eine neue Tab.
Das Ganze kannst du in VBA natürlich auch aufzeichnen.
--
Moin+Gruss Alexander - MVP for MS Excel - www.xxcl.de - mso2000sp3 --7-2
"Krisovice" schrieb:
>>>
trotz längerer Google-Recherche bin ich leider nicht nach einer Lösung
für mein Problem fündig geworden: ich möchte automatisch alle Zeilen,
in denen in Spalte D der Wert "weihnachtsmann" oder "heuschrecke" oder
"abwrackprämie" steht, komplett löschen lassen.
<<<
hier ist noch ein Prozedur-Vorschlag:
Public Sub ZeilenLöschen()
Dim rngData As Range
Dim rngCell As Range
Dim rngUnion As Range
Const strFind As String = "{""weihnachtsmann"";""heuschrecke"";""abwrackprämie""}"
With ActiveSheet
' Suchbereich
Set rngData = Intersect(.Columns("D"), .UsedRange)
End With
For Each rngCell In rngData
' Überprüfung Zellwert mit Suchwörtern
If Evaluate("=Max(CountIf(" & rngCell.Address & "," & strFind & "))=1") Then
If rngUnion Is Nothing Then
Set rngUnion = rngCell
Else
Set rngUnion = Application.Union(rngUnion, rngCell)
End If
End If
Next rngCell
'Zeilen mit gefundenen Wörtern löschen
If Not rngUnion Is Nothing Then rngUnion.EntireRow.Delete
End Sub
Nachtrag:
wenn z. B. Heuschrecke oder HEUSCHRECKE nicht gefunden werden sollen, dann
ändere MatchCase:=False in MatchCase:=True
wenn z. B. Scheuschrecke oder heuschreckengesang (also Wörter mit
"heuschrecke" nur als Teil des Wortes) nicht gefunden werden sollen, dann
ändere LookAt:=xlPart in LookAt:=xlWhole
Na da will ich Dir mal eine sehr simple Lösung schreiben, die Du
anhand der Kommentare auch nachvollziehen kannst.
Wie Du den folgenden Code in ein Modul bekommst weißt Du?
Andreas.
'Diese Option besagt das nicht zwischen
'Groß-/Kleinschreibung unterschieden werden soll
Option Compare Text
Sub Test()
Dim Y As Long, Löschen As Boolean
'Beginne in Zeile 1
Y = 1
'Durchlaufe Spalte D zeilenweise bis eine Zelle leer ist
Do While Range("D" & Y) <> ""
'Erstmal nicht löschen
Löschen = False
'Ist es eins der Wörter?
If Range("D" & Y) = "weihnachtsmann" Then Löschen = True
If Range("D" & Y) = "heuschrecke" Then Löschen = True
If Range("D" & Y) = "abwrackprämie" Then Löschen = True
'Soll gelöscht werden?
If Löschen Then
'Zeile löschen
Range("D" & Y).EntireRow.Delete
Else
'Nächste Zeile
Y = Y + 1
End If
Loop
End Sub
Hallo Andreas,
Wenn es wenig Daten sind, mag das ok sein. Bei vielen Daten lohnt sich aber
entweder
Filtern und Kopierte Neuausgabe oder gleich
Behandlung der gesamten Daten in einem Variant-Array.
Ein 100stel der Zeit ist dabei keine Seltenheit.
Dein Code aber bewegt von den n Zeilen bis zu maximal n^2/2 Daten nach vorn
durch Einzel-Löschung von Zeilen, was teilweise sehr langsam ist.
Dafür kann man ihn aber sehr gut verstehen :-)
> Dein Code aber bewegt von den n Zeilen bis zu maximal n^2/2 Daten nach vorn
> durch Einzel-Löschung von Zeilen, was teilweise sehr langsam ist.
Das ist korrekt, aber IMHO irrelevant. Ich halte es nicht für sehr
wahrscheinlich das dieser Code öfter als 5x ausgeführt wird. Wie oft
genau weiß nur der OP.
> Dafür kann man ihn aber sehr gut verstehen :-)
Ebend genau das ist mein Anliegen.
Denn den Code von Melanie ist ein "Superhack" im VBA-Code mit Formeln
rumzumachen und Eberhards löscht Dir auch gleich ungefragt alle Zeilen
mit weg die von schon vorher keinen Inhalt hatten.
Für einen VBA-Neuling IMHO völlig ungeeignet, noch dazu wenn der Code
nicht dokumentiert ist.
Andreas.
man kann doch eurer beider Code kombinieren, dann hat man die bessere
Laufzeit und keinen "Hack" (s.u.)
Grüße
- Michael -
P.S.: sicher kann man auch die schlechtere Laufzeit mit schlechteren
Verständlichkeit kombinieren, aber das kann gerne jemand anderes vormachen.
---------------------------------
Public Sub ZeilenLöschen()
Dim rngData As Range
Dim rngCell As Range
Dim rngUnion As Range
Dim löschen As Boolean
With ActiveSheet
' Suchbereich
Set rngData = Intersect(.Columns("D"), .UsedRange)
End With
For Each rngCell In rngData
löschen = False
If rngCell = "weihnachtsmann" Then löschen = True
If rngCell = "heuschrecke" Then löschen = True
If rngCell = "abwrackprämie" Then löschen = True
If löschen Then
If rngUnion Is Nothing Then
Set rngUnion = rngCell
Else
Set rngUnion = Application.Union(rngUnion, rngCell.EntireRow)
"Michael v. Fondern" schrieb:
> man kann doch eurer beider Code kombinieren, dann hat man die bessere
> Laufzeit und keinen "Hack" (s.u.)
Formeln in VBA Code zu verwenden hat nichts mit Hack zu tun.
Eine Formelberechnung ist immer schneller als VBA Code und was
spricht dagegen die Tabellenblatt-Funktionen in VBA einzubinden?
Sorry, aber mir tun die Augen weh, wenn ich sehe was du aus meiner Prozedur
gemacht hast :-(
Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
www.melanie-breden.de
Ribbon-Programmierung für Office 2007 http://tinyurl.com/59awla
> Formeln in VBA Code zu verwenden hat nichts mit Hack zu tun.
> Eine Formelberechnung ist immer schneller als VBA Code und was
> spricht dagegen die Tabellenblatt-Funktionen in VBA einzubinden?
ich war nicht derjenige, der das Wort "Hack" ursprünglich ins Spiel
gebracht hat, das war Andreas.
> Sorry, aber mir tun die Augen weh, wenn ich sehe was du aus meiner
> Prozedur gemacht hast :-(
Dein Code-Konstrukt ist IMHO unzweifelhaft äußerst clever, kurz und
elegant. Aber ich verstehe ihn nicht auf Anhieb - dazu bin ich leider zu
dumm oder zu unerfahren oder beides. Wenn er Fehler enthielte (was er
sicher nicht tut) fiele es mir daher schwer, den Code zu debuggen. Das
buche ich als Pluspunkt für meinen Code.
Viele Grüße
- Michael -
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by
definition, not smart enough to debug it." (Brian Kernighan)
Am Thu, 2 Apr 2009 00:16:47 -0700 (PDT) schrieb Andreas Killer:
>> Dein Code aber bewegt von den n Zeilen bis zu maximal n^2/2 Daten nach vorn
>> durch Einzel-Löschung von Zeilen, was teilweise sehr langsam ist.
> Das ist korrekt, aber IMHO irrelevant. Ich halte es nicht für sehr
> wahrscheinlich das dieser Code öfter als 5x ausgeführt wird. Wie oft
> genau weiß nur der OP.
Es ist IMO irrelevant, wie oft der Code ausgeführt wird. Man sollte immer
versuchen, das zeitliche Optimum herauszuholen.
>> Dafür kann man ihn aber sehr gut verstehen :-)
> Ebend genau das ist mein Anliegen.
> Denn den Code von Melanie ist ein "Superhack" im VBA-Code mit Formeln
Was heißt denn hier "Superhack"? Melanie verwendet lediglich Formeln, die
nun mal in Excel zur Verfügung stehen. Sehr oft sind diese um ein
vielfaches schneller als in VBA nachgebaute.
In diesem Fall ist aber ein schlichter Stringvergleich etwa 20% schneller.
' Suchstring ="1", "2", "3". Tilde als Trennzeichen
Const strFind As String = "~1~3~5 "
Dim strValue As String
For Each rngCell In rngData
strValue = rngCell.Value
' Überprüfung Zellwert mit Suchwörtern
If Len(strValue) Then
If InStr(1, strFind, "~" & strValue) Then
Elegant ist auf jeden Fall, dass der zu löschende Bereich erst komplett
zusammengesetzt und dann in einem Rutsch gelöscht wird. Das spart wirklich
Zeit!
> rumzumachen und Eberhards löscht Dir auch gleich ungefragt alle Zeilen
> mit weg die von schon vorher keinen Inhalt hatten.
>
> Für einen VBA-Neuling IMHO völlig ungeeignet, noch dazu wenn der Code
> nicht dokumentiert ist.
Der ist doch dokumentiert, oder übersehe ich da was?
BTW, glaubst du im Ernst, dass ein VBA-Neuling deinen Code besser versteht?
Für den stellt sich doch erst einmal die Frage, wohin der Code überhaupt
soll und wie dieser ausgeführt wird.
viele Grüße
Michael
--
http://michael-schwimmer.de
Masterclass Excel VBA ISBN-10: 3827325250
Das Excel-VBA Codebook ISBN-10: 3827324718
Microsoft Office Excel 2007-Programmierung ISBN-10: 3866454139
>> Denn den Code von Melanie ist ein "Superhack" im VBA-Code mit Formeln
> Was heißt denn hier "Superhack"? Melanie verwendet lediglich Formeln, die
> nun mal in Excel zur Verfügung stehen. Sehr oft sind diese um ein
> vielfaches schneller als in VBA nachgebaute.
Kein Problem, sag ich Dir was ich mit "Superhack" meine:
Ja, ist schon richtig, das das schneller ist. Es geht bestimmt noch
schneller wenn ich mit C++ eine DLL schreibe und dann das Teil via
Declare Function in Excel aufrufe.
Aber ganz ehrlich, es ist sch... kompliziert und ich tacker nun auch
schon einige Jahre.
BTW, es geht nicht nur mir so, Michael v. Fondern zähle ich mal auch
mind. zu den erfahrenen Usern und er sagt: "Aber ich verstehe ihn
nicht auf Anhieb - dazu bin ich leider zu dumm oder zu unerfahren oder
beides." Und mit der Ausssage ist er nicht alleine.
Jetzt frag ich mal 'ne blöde Frage: Wie kriege ich Melanie's Code dazu
das er Groß-/Kleinschreibung unterscheidet?
Weil irgendwie hatte ich "als Neuling" mal was gelesen das man mit
"Option Compare ..." da was drehen kann. Tja...
Versteh mich richtig, alle Speziallösungen in Ehren, super Code, ich
bin immer wieder erstaunt auf was für tolle Dinger man kommen kann,
aber sie bleiben ein Hack.
> In diesem Fall ist aber ein schlichter Stringvergleich etwa 20% schneller.
Ist bestimmt für den OP interessant, könntest Du mal einen lauffähigen
Code daraus machen den ein VBA-Anfänger auch zum laufen bekommt und
ihm direkt antworten? Der freut sich bestimmt. ;-))
> Elegant ist auf jeden Fall, dass der zu löschende Bereich erst komplett
> zusammengesetzt und dann in einem Rutsch gelöscht wird. Das spart wirklich
> Zeit!
Ja das stimmt, geb ich Dir 100% recht und ist auch nicht sonderlich
kompliziert, wie Michael es in seinem Beispiel gut gezeigt hat.
>> Für einen VBA-Neuling IMHO völlig ungeeignet, noch dazu wenn der Code
>> nicht dokumentiert ist.
> Der ist doch dokumentiert, oder übersehe ich da was?
Ah ja, "Überprüfung Zellwert mit Suchwörtern" macht mal also mit
Evaluate("=Max(CountIf(" & rngCell.Address & "," & strFind & "))=1")
Super, der Kommentar hilft echt viel. :-)))
Ich hab Dein Buch ja nicht gelesen, aber ich rate mal und sage das in
dem Kapitel bei Dir etwas anderes steht, oder? Sei ehrlich. ;-)
> BTW, glaubst du im Ernst, dass ein VBA-Neuling deinen Code besser versteht?
Weiß ich nicht, ich hab (für's erste) mein bestes gegeben und er hat
sich leider noch zu keiner Lösung geäußert. Und falls ich Mist
geschrieben hab: Meckert mich aus. :-)
Aber ich stell mal 'ne Gegenfrage: Der Autor von uns beiden bist Du,
welche der verschiedenen Lösungen die sich nun angesammelt haben
würdest Du für Deine Leser als geeignet erachten?
> Für den stellt sich doch erst einmal die Frage, wohin der Code überhaupt
> soll und wie dieser ausgeführt wird.
Deswegen hatte ich ihm genau diese Frage gestellt. .-)
Andreas.
> Deswegen hatte ich ihm genau diese Frage gestellt. .-)
Also ich finde mein Autofiltrat (oder Spezialfiltrat) leichter verständlich
als die (sicherlich lobenswerte) UNION-Geschichte. Denn jeder kennt die
Filter vom händischen Arbeiten. Wahrscheinlich ist es auch schneller.
Excel-Formeln in VBA: Unbedingt ja, wo es geht! Und der "rückwärts
löschen"-Hinweis, den ich erst vor kurzem hier gelesen, aber erinnert, habe,
ist sehr wertvoll, um die Performance von Vorgängen bei Excel zu verstehen.
Am Fri, 03 Apr 2009 18:55:04 +0200 schrieb Andreas Killer:
>>> Denn den Code von Melanie ist ein "Superhack" im VBA-Code mit Formeln
>> Was heißt denn hier "Superhack"? Melanie verwendet lediglich Formeln, die
>> nun mal in Excel zur Verfügung stehen. Sehr oft sind diese um ein
>> vielfaches schneller als in VBA nachgebaute.
> Kein Problem, sag ich Dir was ich mit "Superhack" meine:
> Ja, ist schon richtig, das das schneller ist. Es geht bestimmt noch
> schneller wenn ich mit C++ eine DLL schreibe und dann das Teil via
> Declare Function in Excel aufrufe.
nicht unbedingt, du musst immer noch die Parameter auf den Stack legen und
das Funktionsergebnis von dort zurückholen. Außerdem werden die Inhalte von
Stringvariablen, welche in VB(A) als Unicode vorliegen, vor der Übergabe
intern in eine Ansi Kopie umgewandelt und diese wird letzendlich übergeben.
Nach der Ausführung werden die möglicherweise geänderten Strings wieder in
Unicode umgewandelt und der ursprünglichen Variablen zugewiesen.
Schließlich muss die DLL auch noch in den Prozessarbeitsraum eingeblendet
werden. Kostet alles Zeit!
> Aber ganz ehrlich, es ist sch... kompliziert und ich tacker nun auch
> schon einige Jahre.
> BTW, es geht nicht nur mir so, Michael v. Fondern zähle ich mal auch
> mind. zu den erfahrenen Usern und er sagt: "Aber ich verstehe ihn
> nicht auf Anhieb - dazu bin ich leider zu dumm oder zu unerfahren oder
> beides." Und mit der Ausssage ist er nicht alleine.
Fremden Code versteht man grundsätzlich NICHT auf Anhieb! Dazu muss man
nicht zu dumm oder zu unerfahren sein.
> Jetzt frag ich mal 'ne blöde Frage: Wie kriege ich Melanie's Code dazu
> das er Groß-/Kleinschreibung unterscheidet?
Da musst du Melanie fragen, ich habe mich nicht damit beschäftigt.
> Weil irgendwie hatte ich "als Neuling" mal was gelesen das man mit
> "Option Compare ..." da was drehen kann. Tja...
>
> Versteh mich richtig, alle Speziallösungen in Ehren, super Code, ich
> bin immer wieder erstaunt auf was für tolle Dinger man kommen kann,
> aber sie bleiben ein Hack.
Das hat doch nichts mit Speziallösungen oder Hack zu tun. Erst einmal
sollte man das benutzen, was Excel so standardmäßig drauf hat. Dazu gehören
eben Formeln, Arrayformeln, diverse Assistenten, Pivot usw. Wenn man damit
nicht hinkommt, oder gar alles automatisieren will, kommt VBA ins Spiel.
Aber auch da sehe ich zu, dass erst einmal die Excel-Helferlein verwendet
werden. Dazu gehören dann noch zusätzlich die Excel4 Makros. Warum sollte
ich nachbauen, was bereits verfügbar ist?
>> In diesem Fall ist aber ein schlichter Stringvergleich etwa 20% schneller.
> Ist bestimmt für den OP interessant, könntest Du mal einen lauffähigen
> Code daraus machen den ein VBA-Anfänger auch zum laufen bekommt und
> ihm direkt antworten? Der freut sich bestimmt. ;-))
Ich wollte dem OP eigentlich gar nicht antworten, da er bereits genug
zufriedenstellende Antworten bekommen hat und mich das Thema auch nicht
besonders interessiert hat. Ich habe lediglich dir geantwortet, weil du das
Einsetzen von Formeln in VBA als "Superhack" bezeichnet hast.
Der Code, den ich zum Testen verwendet habe, ist im Prinzip Melanies Code,
lediglich der Vergleich wurde anders durchgeführt. Der Unterschied macht
etwa 20% aus, dagegen dauert deine Prozedur 3 mal so lange, wie Melanies.
Public Sub ZeilenLöschen1()
Dim rngData As Range
Dim rngCell As Range
Dim rngUnion As Range
With Worksheets(2)
' Suchbereich
Set rngData = Intersect(.Columns("A"), .UsedRange)
End With
' Suchstring ="1", "2", "3". Tilde als Trennzeichen
Const strFind As String = "~1~3~5 "
Dim strValue As String
For Each rngCell In rngData
strValue = rngCell.Value
' Überprüfung Zellwert mit Suchwörtern
If Len(strValue) Then
If InStr(1, strFind, "~" & strValue) Then
If rngUnion Is Nothing Then
Set rngUnion = rngCell
Else
Set rngUnion = Application.Union(rngUnion, rngCell)
End If
End If
End If
Next rngCell
'Zeilen mit gefundenen Wörtern löschen
If Not rngUnion Is Nothing Then rngUnion.EntireRow.Delete
End Sub
>> Elegant ist auf jeden Fall, dass der zu löschende Bereich erst komplett
>> zusammengesetzt und dann in einem Rutsch gelöscht wird. Das spart wirklich
>> Zeit!
> Ja das stimmt, geb ich Dir 100% recht und ist auch nicht sonderlich
> kompliziert, wie Michael es in seinem Beispiel gut gezeigt hat.
Er bremst aber den Code mit seinen drei Ifs genauso aus, wie du. Was ist,
wenn auf einmal mit hundert oder tausend Wörtern verglichen werden soll? Es
werden bei euch ja immer alle Vergleiche durchgeführt, egal, ob der erste
bereits ein positives Ergebnis gebracht hat. Auch bei Select case muss man,
um wirklich Zeit zu sparen, die Häufigkeit vorausahnen, in der die Wörter
vorkommen. Diesen Nachteil erspart man sich beispielsweise durch den
Einsatz solch einer Formel.
>>> Für einen VBA-Neuling IMHO völlig ungeeignet, noch dazu wenn der Code
>>> nicht dokumentiert ist.
>> Der ist doch dokumentiert, oder übersehe ich da was?
> Ah ja, "Überprüfung Zellwert mit Suchwörtern" macht mal also mit
> Evaluate("=Max(CountIf(" & rngCell.Address & "," & strFind & "))=1")
> Super, der Kommentar hilft echt viel. :-)))
> Ich hab Dein Buch ja nicht gelesen, aber ich rate mal und sage das in
> dem Kapitel bei Dir etwas anderes steht, oder? Sei ehrlich. ;-)
Ein Fachbuch ist ein Fachbuch, diese Gruppe ist etwas ganz anderes. Jemand
möchte Hilfe, weil er mit einer Sache nicht weiterkommt. Man kann ihm nun
Denkanstöße geben, wenn er genug Informationen geliefert hat und gewisse
Spielregeln engehalten hat, kann man auch schon mal eine funktionierende
Prozedur liefern. Je nach Lust und Laune. Das habt ihr getan, aber willst
du ihm jetzt auch noch VBA beibringen?
>> BTW, glaubst du im Ernst, dass ein VBA-Neuling deinen Code besser versteht?
> Weiß ich nicht, ich hab (für's erste) mein bestes gegeben und er hat
> sich leider noch zu keiner Lösung geäußert. Und falls ich Mist
> geschrieben hab: Meckert mich aus. :-)
Wenn er VBA nicht versteht, ist es egal, ob er deinen oder Melanies Code
nicht versteht.
> Aber ich stell mal 'ne Gegenfrage: Der Autor von uns beiden bist Du,
> welche der verschiedenen Lösungen die sich nun angesammelt haben
> würdest Du für Deine Leser als geeignet erachten?
Nach dem, was der OP in seinem ersten Posting geschrieben hat:
Die von Alexander mit den Formeln und dem Autofilter.
>> Für den stellt sich doch erst einmal die Frage, wohin der Code überhaupt
>> soll und wie dieser ausgeführt wird.
> Deswegen hatte ich ihm genau diese Frage gestellt. .-)
Löblich.
Viele Grüße
> Also ich finde mein Autofiltrat (oder Spezialfiltrat) leichter verständlich
> als die (sicherlich lobenswerte) UNION-Geschichte. Denn jeder kennt die
> Filter vom händischen Arbeiten. Wahrscheinlich ist es auch schneller.
Ja, das ist richtig, da stimme ich Dir uneingeschränkt zu.
> Excel-Formeln in VBA: Unbedingt ja, wo es geht! Und der "rückwärts
Wenn Du sagt "wo es geht", okay, stimme ich Dir zu.
Allerdings muss man sich doch auch mal fragen warum VBA gegenüber den
Formeln so langsam ist. Wäre dem nicht so bräuchte man auch keine
Klimmzüge machen.
Andreas.
>> Jetzt frag ich mal 'ne blöde Frage: Wie kriege ich Melanie's Code dazu
>> das er Groß-/Kleinschreibung unterscheidet?
> Da musst du Melanie fragen, ich habe mich nicht damit beschäftigt.
>> Weil irgendwie hatte ich "als Neuling" mal was gelesen das man mit
>> "Option Compare ..." da was drehen kann. Tja...
Die Frage war rhetorisch: Es geht nicht.
>>> In diesem Fall ist aber ein schlichter Stringvergleich etwa 20% schneller.
>> Ist bestimmt für den OP interessant, könntest Du mal einen lauffähigen
>> Code daraus machen den ein VBA-Anfänger auch zum laufen bekommt und
>> ihm direkt antworten? Der freut sich bestimmt. ;-))
> Ich wollte dem OP eigentlich gar nicht antworten, da er bereits genug
> zufriedenstellende Antworten bekommen hat und mich das Thema auch nicht
> besonders interessiert hat. Ich habe lediglich dir geantwortet, weil du das
> Einsetzen von Formeln in VBA als "Superhack" bezeichnet hast.
Aha, okay, dann ist das jetzt OT.
> Der Code, den ich zum Testen verwendet habe, ist im Prinzip Melanies Code,
> lediglich der Vergleich wurde anders durchgeführt. Der Unterschied macht
> etwa 20% aus, dagegen dauert deine Prozedur 3 mal so lange, wie Melanies.
Ja, ist richtig. Und warum ich das so gemacht habe hatte ich schon
geschrieben.
> Public Sub ZeilenLöschen1()
Ja, ganz nett und nebenbei: Diese Technik ist *mir* hinlänglich
bekannt. Leider kann der OP damit nix anfangen, weil sie für seinen
Fall nicht funktioniert.
> Er bremst aber den Code mit seinen drei Ifs genauso aus, wie du. Was ist,
> wenn auf einmal mit hundert oder tausend Wörtern verglichen werden soll? Es
Und was ist wenn ich Wörter mit einer ~ drin habe und Deine Lösung
verwenden möchte?
Ist doch wurscht, es gibt immer ein "und was ist..." und dann muss man
nach einer anderen Lösung suchen.
> Prozedur liefern. Je nach Lust und Laune. Das habt ihr getan, aber willst
> du ihm jetzt auch noch VBA beibringen?
Ja, genau das ist mein Anliegen.
Andreas.
Am Sat, 04 Apr 2009 09:24:48 +0200 schrieb Andreas Killer:
>> Public Sub ZeilenLöschen1()
> Ja, ganz nett und nebenbei: Diese Technik ist *mir* hinlänglich
Warum fängst du gleich an, zu bellen, habe ich je behauptet, dass dir die
dahinterstehende Technik unbekannt ist? Nur durch Diskussionen um die
Herangehensweise beim Lösen eines Problems lernt man hinzu, auch ich.
> bekannt. Leider kann der OP damit nix anfangen, weil sie für seinen
> Fall nicht funktioniert.
Du musst mir jetzt aber mal erklären, warum das nicht funktionieren soll,
ich lerne gerne hinzu!
>> Er bremst aber den Code mit seinen drei Ifs genauso aus, wie du. Was ist,
>> wenn auf einmal mit hundert oder tausend Wörtern verglichen werden soll? Es
> Und was ist wenn ich Wörter mit einer ~ drin habe und Deine Lösung
> verwenden möchte?
Kannst du doch machen, funzt ohne Einschränkungen. Wenn du noch das Finden
von Teilstrings wie "weihn" verhindern willst:
Const strFind As String = "~weihnachtsmann~weihnachtsm~ann~"
If InStr(1, strFind, "~" & strValue & "~") Then
Warum sollte dabei das Suchwort weihnachtsm~ann nicht funktionieren?
> Ist doch wurscht, es gibt immer ein "und was ist..." und dann muss man
> nach einer anderen Lösung suchen.
ACK
>> Prozedur liefern. Je nach Lust und Laune. Das habt ihr getan, aber willst
>> du ihm jetzt auch noch VBA beibringen?
> Ja, genau das ist mein Anliegen.
Das wirst du aber hier in der NG auf die Schnelle nicht hinbekommen.
>> Ja, ganz nett und nebenbei: Diese Technik ist *mir* hinlänglich
> Warum fängst du gleich an, zu bellen, habe ich je behauptet, dass dir die
Weil Du keine Lust hast dem OP zu helfen, aber mir... ach egal.
>> bekannt. Leider kann der OP damit nix anfangen, weil sie für seinen
>> Fall nicht funktioniert.
> Du musst mir jetzt aber mal erklären, warum das nicht funktionieren soll,
> ich lerne gerne hinzu!
Lies die Anfrage des OP und dann diese 3 Gründe:
1. Funktioniert dein Code nur mit der 2ten Tabelle:
With Worksheets(2)
2. Sucht er in Spalte A anstatt D
Set rngData = Intersect(.Columns("A"), .UsedRange)
3. Ist er kommentiert:
' Suchstring ="1", "2", "3". Tilde als Trennzeichen
aber programmiert ist:
Const strFind As String = "~1~3~5 "
Darf ich jetzt schlampig sagen? .-)
BTW, den Sinn des Leerzeichens nach der 5 darf man dann erraten? Bitte
nicht antworten, rein rhetorische Frage.
Das kriegt ein Anfänger nie für seinen Fall gerade gebogen, der machts
wie ich, kopiert den Code läßt ihn laufen, bekommt eine Fehlermeldung,
kuckt nochmal drüber, zuckt mit dem Achseln und tut ihn in die Tonne.
Ich sags nochmal: Wenn Du Dir schon die Mühe machst, schreibs dem OP
so das er es einfach nur kopieren muss und das es so funktioniert wie
er es angefragt hat.
Und schreibs nicht mir, sondern ihm, (nich erschrecken ich bell
nochmal ja? ;-)) *ich* weiß wie das geht.
>>> Prozedur liefern. Je nach Lust und Laune. Das habt ihr getan, aber willst
>>> du ihm jetzt auch noch VBA beibringen?
>> Ja, genau das ist mein Anliegen.
> Das wirst du aber hier in der NG auf die Schnelle nicht hinbekommen.
Da bin ich anderer Meinung. Ich führe mal den Willy Steffen an, der
vor einigen Wochen sich hier das erste(?) Mal gemeldet hatte und der
schreib für diese kurze Lernphase mittlerweile sehr beachtliche Codes
und macht Dinge die definitiv über den "Status eines Anfängers" weit
hinausgehen. Da hat diese Newsgroup richtig gute Arbeit geleistet.
So, ich muss jetzt wieder auf meinen Balkon, Frühjahrsputz machen.
Meine Frau ist grad nicht da, da kann ich mal kurz die dreckigen
Stühle ins Wohnzimmer stellen ohne gleich Mecker zu kriegen. :-)))
Andreas.
m Sat, 04 Apr 2009 15:41:03 +0200 schrieb Andreas Killer:
>>> Ja, ganz nett und nebenbei: Diese Technik ist *mir* hinlänglich
>> Warum fängst du gleich an, zu bellen, habe ich je behauptet, dass dir die
> Weil Du keine Lust hast dem OP zu helfen, aber mir... ach egal.
willkommen im Usenet!
>>> bekannt. Leider kann der OP damit nix anfangen, weil sie für seinen
>>> Fall nicht funktioniert.
>> Du musst mir jetzt aber mal erklären, warum das nicht funktionieren soll,
>> ich lerne gerne hinzu!
> Lies die Anfrage des OP und dann diese 3 Gründe:
> 1. Funktioniert dein Code nur mit der 2ten Tabelle:
> With Worksheets(2)
> 2. Sucht er in Spalte A anstatt D
> Set rngData = Intersect(.Columns("A"), .UsedRange)
> 3. Ist er kommentiert:
> ' Suchstring ="1", "2", "3". Tilde als Trennzeichen
> aber programmiert ist:
> Const strFind As String = "~1~3~5 "
> Darf ich jetzt schlampig sagen? .-)
Klar kannst du "schlampig" sagen, so ist das eben, wenn man auf die
Schnelle was testet, ändert und postet.
Momentan führe ich aber nicht mit dem OP, sondern mit dir eine Diskussion
und ich nehme doch stark an, dass du den Code richtig interpretieren
kannst, selbst wenn ich Spalte A im Worksheet 2 anspreche und der Kommentar
auch nicht ganz passt.
> BTW, den Sinn des Leerzeichens nach der 5 darf man dann erraten? Bitte
> nicht antworten, rein rhetorische Frage.
Das Leerzeichen als übersehenes Überbleibsel vorangegangener Tests darfst
du gerne behalten und auch kommerziell verwerten! Du hast es schließlich
auch gefunden.
> Das kriegt ein Anfänger nie für seinen Fall gerade gebogen, der machts
> wie ich, kopiert den Code läßt ihn laufen, bekommt eine Fehlermeldung,
> kuckt nochmal drüber, zuckt mit dem Achseln und tut ihn in die Tonne.
Vogel, friss oder stirb.
> Ich sags nochmal: Wenn Du Dir schon die Mühe machst, schreibs dem OP
> so das er es einfach nur kopieren muss und das es so funktioniert wie
> er es angefragt hat.
Noch einmal ganz langsam. Ich habe nie dem OP direkt geantwortet und werde
es auch nicht. Geantwortet hast du, Eberhard, Melanie und Alexander.
Es ging mir in meiner Antwort auf dein Posting lediglich darum, dir
klarzumachen, dass Formeln in VBA nicht böse sind, sondern im Gegenteil ein
wertvolles, schnelles und legitimes Hilfsmittel erster Wahl sind.
Außerdem habe ich darauf hingewiesen, dass das Ausführen deines Codes um
ein vielfaches länger dauert. Ich habe dir auch dargelegt, dass ein Grund
dafür ist, dass du in deinem Code immer alle Vergleiche durchführst, obwohl
vielleicht schon beim ersten If die Bedingung erfüllt ist, so dass die
anderen Vergleiche unnötig wie ein Kropf sind. Darf ich dazu "schlampig"
sagen?
Dein Code funktioniert, wie er soll, keine Frage. Du machst ihn aber
künstlich langsamer als nötig.
> Und schreibs nicht mir, sondern ihm, (nich erschrecken ich bell
> nochmal ja? ;-)) *ich* weiß wie das geht.
Nöö, warum sollte ich?
>>>> Prozedur liefern. Je nach Lust und Laune. Das habt ihr getan, aber willst
>>>> du ihm jetzt auch noch VBA beibringen?
>>> Ja, genau das ist mein Anliegen.
>> Das wirst du aber hier in der NG auf die Schnelle nicht hinbekommen.
> Da bin ich anderer Meinung. Ich führe mal den Willy Steffen an, der
> vor einigen Wochen sich hier das erste(?) Mal gemeldet hatte und der
> schreib für diese kurze Lernphase mittlerweile sehr beachtliche Codes
> und macht Dinge die definitiv über den "Status eines Anfängers" weit
> hinausgehen. Da hat diese Newsgroup richtig gute Arbeit geleistet.
Jetzt wird es aber wirklich OT und ich beende hiermit diesen Thread.
Scheint wirklich am Wetter zu liegen.
Gibt es jetzt noch eine Möglichkeit, den Workflow zu vereinfachen? Ich
stelle mir das so vor, dass ich betreffende Excel-Listen öffne und
dann nur noch auf einen Button klicken brauche, um die Moduldatei bas
durchlaufen zu lassen, statt jedes Mal umständlich über den visual
basic editor, Import usw. gehen zu müssen.
Beste Grüße,
Krisovice
> Vielen Dank für die vielen Anregungen! Ich habe mich für die für mich
> leicht nachvollziehbare Lösung von Andreas entschieden und bin sehr
> gut damit gefahren! Nochmals danke!
Wow, das druck ich mir jetzt aus und hängs mir über's Bett. :-)))
> Gibt es jetzt noch eine Möglichkeit, den Workflow zu vereinfachen? Ich
> stelle mir das so vor, dass ich betreffende Excel-Listen öffne und
> dann nur noch auf einen Button klicken brauche, um die Moduldatei bas
> durchlaufen zu lassen, statt jedes Mal umständlich über den visual
> basic editor, Import usw. gehen zu müssen.
Ja, das geht, aber wenn Du verschiedene Excel-Files öffnen möchtest,
ist das ein bißchen Tricki.
Also Du brauchst eine PERSONL.XLS in dem richtigen Verzeichnis, denn
diese wird immer beim Start von Excel unsichtbar geladen und da gehört
das Makro rein.
Wie Du zu der PERSONL.XLS kommst ist hier gut beschrieben und sehr
easy, auch wie Du das Makro da reinkriegst, usw.:
http://www.online-excel.de/excel/singsel_vba.php?f=113
In dem Abschnitt "Wie ruft man ein Makro der personl.xls aus einer
anderen Datei heraus auf?" empfehle ich die "Möglichkeit 3".
Ich find es etwas blöde das das Makro in der Liste der ausführbaren
Makros drin ist, kannst Du sehen wenn Du Alt-F8 drückst. Wenn Deine
PERSONL.XLS wächst, wird das irgendwann fürchterlich unübersichtlich.
BTW, wenn Du functions in Deine PERSONL.XLS (oder in einer Mappe hast)
dann kann man diese wie eine Formel aufrufen.
Kleiner Trick: Geh zurück in die PERSONL.XLS in das Modul und schreib
als erste Zeile "Option Private Module" rein. Damit ist das Makro nun
unsichtbar, aber immer noch ausführbar. Auch über Alt-F8 wenn man den
Namen der Sub eingibt. .-)
BTW, ein Icon kann man sich easy von einem anderen Knopf kopieren, in
Paint einfügen, dort bearbeiten, markieren, kopieren und wieder in
Excel auf dem Knopf einfügen.
Andreas.