thommescan Geschrieben 29. Juli 2009 Teilen Geschrieben 29. Juli 2009 Hallo zusammen, bin ein blutiger Programmier-Anfänger würde aber gerne mit VBA ein paar kleine Programme programmieren. Leider wurden mir schon bei meinen ersten Schritten große Steine in den Weg geworfen. Jetzt zu meinem Problem: Ich habe folgende Liste gegeben: Fuß Fuß Fuß Schuh Fuß Schuh Fuß Fuß Schuh Fuß Ich würde jetzt gerne alle Zellen markieren in denen Schuh steht. Am besten zeig ich euch jetzt erstmal meine Gehversuche. Sub Makro1() Dim zellen As Object For Each zellen In Selection 'Ich hab also alle Zellen markiert. If zellen = Schuh Then zellen.Select End If Next zellen End Sub Leider scheinen mir schon die ersten kleinen Programme zu schwer zu sein. Bei mir markiert es bei diesem Programm leider immer nur diese Zelle mit Schuh drin, die am weitesten unten in der Liste steht. Hat mir vielleicht irgendjemand einen Tipp wie es mir alle Zellen mit Schuh drin auswählt? oder wie ich dann gleich die ganzen Zeilen in denen Schuh steht markieren kann? Wär wirklich super, wenn ihr mir helfen könntet. Bin nämlich ziemlich montiviert meine Kreativität im Excel ein bißchen auszuleben. Liebe Grüße Thomas Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lupo49 Geschrieben 29. Juli 2009 Teilen Geschrieben 29. Juli 2009 Das liegt vermutlich daran, dass er bei einem erneuten Anwenden von "zellen.Select", die vorherige Markierung wieder entfernt. Bitte bei den nächsten Mal die CODE-Tags für Quellcode nutzen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
streffin Geschrieben 29. Juli 2009 Teilen Geschrieben 29. Juli 2009 mhm mhm mhm das erste is, das dir wie gesagt deine ursprüngliche Selection flöten geht wenn du ne neue Zelle selectest. Imo ist es nicht sinnvoll, die Zellen die du suchst in eine Selection zu packen, du schreibst da grad ein makro, also mach doch gleich was du im hinterkopf hast mit den entsprechenden Zellen. Als nächstes ist deine if schlicht murks. If ltrim(rtrim(zellen.Value)) = "Schuh" Then müsst das heissen wenn das funktionieren soll. Die trims sind optional, aber der Erfahrung nach is das eine beliebte Fehlerquelle. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
thommescan Geschrieben 29. Juli 2009 Autor Teilen Geschrieben 29. Juli 2009 Hallo Lupo49, danke für deine schnelle Antwort. Wusste leider nicht wie ich meine Quellcodes richtig reinstelle, habs aber gerade gefunden. Bei mir wird also jede Zelle mit Schuh einzelnd markiert und dann wieder gelöscht und bei der letzten Zelle bleibt dann die Auswahl stehen? Oder habe ich das falsch verstanden? Was muss ich dann ändern, damit alle Zellen mit Schuh markiert werden? Liebe Grüße Thomas Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
streffin Geschrieben 29. Juli 2009 Teilen Geschrieben 29. Juli 2009 nein, bei dir wird nichts selektiert. Die if passt nicht. Wenn du nen String vergleichen willst, müssen da " " rein. Desweiteren musst du auf das Attribut .Value der Zelle zugreifen wenn du irgendwas vergleichen willst vom Inhalt. Wenn die if passt, würde dir die erste Zelle markiert wo Schuh drinsteht. Du hast ne Schleife : "für jedes Element in meiner aktuellen Selektion mach das" Das heist, sobald du da eine Zelle Selektierst, ist DAS deine aktuelle Selektion. Bei dem was du da vorhast, wenn überhaupt, dann musst du anders rum rangehn, alle Zellen wo NICHT "Schuh" drinsteht, aus der Selektion entfernen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
thommescan Geschrieben 29. Juli 2009 Autor Teilen Geschrieben 29. Juli 2009 Hi Streffin, auf die Idee bin ich ja noch gar nicht gekommen, dass man gar nicht nach den zellen fragt wo schuh drin steht, sondern nur die Zellen nichtmehr markiert in denen Schuh nicht drin steht Wie sollte aber dann meine If-Anweisung aussehen? Meine war ja scheinbar ein richtiger griff ins klo. gibt es auch einen Befehl um die Auswahl aufzuheben? Liebe Grüße Thomas Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
streffin Geschrieben 29. Juli 2009 Teilen Geschrieben 29. Juli 2009 (bearbeitet) Hm, du hast dir da was doofes rausgesucht muss ich sagen .... Mir wäre nicht bekannt, dass es da eine Methode giebt, mit der man einzellne Zellen zu einer Selektion hinzufügen oder entfernen kann. Aber, du kannst eines machen : du nimmst dir ein Array (redim preserve brauchste hier dann), oder eine Arraylist (String), gehst zuerst deine Selektion durch, und schreibst dir jede Zelladresse in das String array. Die Adresse einer Zelle bekommste for each cell in Selection cell.row cell.column Allerdings brauchst du noch eine kleine Funktion dafür, mit der du dir den Spaltennamen von 1,2,3,4 in A,B,C,D übersetzt. In dein Array schreibst du dann die Zelleadresse im Format "A1", "B1" usw. So, dann haste erstmal alle Zellen deiner Selektion in dem Array. soweit, so gut. Wenn du jetzt alle Elemente deines Arrays durchgehst, prüfst ob die Zellen den gesuchten String enthalten, und dir dann daraus eine neue Selektion baust, haste was du haben willst : dim sRange as String = "" for i = 0 to ubound(arr) - 1 range(arr(i)).select if activecell.value = "irgendwas" then sRange = sRange & arr(i) & "," end if i = i + 1 next sRange = left(sRange, len(sRange) -1) range(sRange).select Is nen dirty workarround, aber .... naja, is halt vba Hoff du hast ungefähr ne Vorstellung wie ich das mein. Allgemein gesagt, Selection is immer was doofes, was du aber auch nicht wirklich oft brauchst in makros. Makros schreibst du ja primär zur automatisierung von Arbeitsschritten die oft vorkommen, oder wenn du sachen vor hast, die Excel in der Form nicht ohne weiteres hinbekommt (Ich sag nur Datenbank Excel reporting, ein weites Feld). D.h. du gehst im Makro eher hin, und kopierst, löschst, oder sonst was mit den Zellen die du am suchen bist. Das ist auch weit einfacher zu programmieren dann. mfg Sven Bearbeitet 29. Juli 2009 von streffin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
streffin Geschrieben 29. Juli 2009 Teilen Geschrieben 29. Juli 2009 Bah gott, vergiss n grossteil, ich brauch urlaub .... prinzip bleibts gleiche, aber einfacher : sub selektieren dim sRange as String For Each cell in Selection if ltrim(rtrim(cell.Value)) = "irgendwas" then sRange = sRange & "Cells(" & cell.row & "," & cell.column & ")," end if next sRange = Left(sRange , len(sRange) - 1 ) Range(sRange).select end sub mir ist enfallen das man ne Range auch per Range(Cells(i,j), Cells(x,y)) bilden kann, is so natürlich um einiges einfacher ..... vergiss den Beitrag eins drüber am besten Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
thommescan Geschrieben 29. Juli 2009 Autor Teilen Geschrieben 29. Juli 2009 Wenn ich das lese brauch ich glaube ich auch Urlaub Wenn ich das jetzt richtig verstanden habe, dann markiert deine Prozedur jetzt aus einer Auswahl alle Zellen wo irgendwas drin steht oder? wenn ich das aber teste funktioniert das bei mir nicht, da bei Range(sRange).Select immer ein Laufzeitfehler kommt. Mit dem Ausdruck sRange = sRange & "Cells(" & cell.Row & "," & cell.Column & ")" kann ich leider auch nicht so viel anfangen, da ich das in der Klammer nicht versteh. Formuliert das die allgemeine Position meiner bestimmten Zellen, d.h. die Reihe und die Zeile? Ist mir fast schon peinlich, dass ich da nicht durchsteig, aber jeder fängt einmal klein an. Liebe Grüße Thomas Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
streffin Geschrieben 30. Juli 2009 Teilen Geschrieben 30. Juli 2009 des kommt von wenn man nichts zum debuggen da hat .... Sub selektieren() Dim sRange As String For Each cell In Selection If LTrim(RTrim(cell.Value)) = "irgendwas" Then sRange = sRange & GetColName(cell.Column) & CStr(cell.Row) & " ," End If Next If Len(sRange) > 0 Then sRange = Left(sRange, Len(sRange) - 1) Range(sRange).Select End If End Sub Function GetColName(lcol As Long) Dim s As String If lcol > 26 Then s = Chr(64 + (lcol - 1) \ 26) & Chr(64 + (lcol - 1) Mod 26 + 1) Else s = Chr(64 + lcol) End If GetColName = s End Function so, dat tut. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.