Autor
|
Thema: zeilen verschieben (2993 mal gelesen)
|
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 07. Okt. 2009 15:24 <-- editieren / zitieren --> Unities abgeben:
hallo, über eine bedingte formatierung lasse ich die ganze zeile "durchstreichen" wenn eine zelle in der zeile "erledigt" stehen hat. die ganze durchgestrichene zeile soll jetzt aber aus dem tabellenblatt verschwinden und in ein anderes tabellenblatt übertragen werden. wie bekomme ich das hin? danke schonmal im voraus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 07. Okt. 2009 16:20 <-- editieren / zitieren --> Unities abgeben: Nur für thato
|
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 07. Okt. 2009 19:11 <-- editieren / zitieren --> Unities abgeben: Nur für thato
Die bedingte Formatierung hat ja auch nur das Hilfswort woran sie sich klammert ;-) Code: Für jede Zeile im Quellblatt von der letzten bis zur ersten also rückwärts Guck, ob der Suchbegriff in der Zeile steht wenn ja dann kopier die Zeile, geh zum Zielblatt füg sie dort in die erste freie Zeile ein lösch die Zeile aus dem Quellblatt und mach mit der nächsten Zeile weiter
die .Find-Methode kann auch mit Platzhaltern arbeiten------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... System-Info | Excel -Suche | RuA-Suche | FAQ-ACAD | CAD.de-Hilfe | Sei eine Antilope Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 07. Okt. 2009 20:13 <-- editieren / zitieren --> Unities abgeben:
|
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 07. Okt. 2009 20:17 <-- editieren / zitieren --> Unities abgeben:
danke runkelruebe. so in etwa hab ich mir das vorgestellt. jetzt muss ich nur noch den quellcode schreiben mal sehen ob ich das morgen hinbekomme... gehts eigentlich auch ohne makro??? wie kann ich denn die abfrage ob das makro aktiviert werden soll beim öffnen der datei ausstellen? kann ich das makro aktivieren durch drücken der enter-taste? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 07. Okt. 2009 20:58 <-- editieren / zitieren --> Unities abgeben: Nur für thato
N'Abend, >> so in etwa hab ich mir das vorgestellt. jetzt muss ich nur noch den quellcode schreiben mal sehen ob ich das morgen hinbekomme... Fang mal an, das Gerüst steht ja oben. >> gehts eigentlich auch ohne makro??? ohne Makro weiß ich nicht, ich hab's aber auch nicht versucht ;-) >> wie kann ich denn die abfrage ob das makro aktiviert werden soll beim öffnen der datei ausstellen? es ist nicht das Makro, sondern die Makros und zwar alle, die in den zukünftig zu öffnenden Datei drin sind. Es ist also eine Systemeinstellung, nicht dateiabhängig. Die Makrosicherheitsstufe auf niedrig zu setzen, empfehle ich daher ausdrücklich nicht, fremde Makros können böse Dinge tun ;-) Du könntest es aber in den Excel-Optionen einstellen. >> kann ich das makro aktivieren durch drücken der enter-taste? Dafür könntest Du das SelectionChange-Ereignis nutzen, nicht empfohlen, da es bei jedem Wechsel der Selection anspringt, es sei denn, man schränkt den Bereich (Target) ein. Du kannst Makros ein Tastenkürzel zuweisen oder sie mit (vorher anzulegende) buttons verknüpfen oder Du suchst Dir ein anderes Ereignis aus, das Dir besser paßt oder Du rufst den MakroDialog mit ALT+F8 auf. ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... System-Info | Excel -Suche | RuA-Suche | FAQ-ACAD | CAD.de-Hilfe | Sei eine Antilope Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 08. Okt. 2009 09:06 <-- editieren / zitieren --> Unities abgeben:
oje...hab mich mal an der find methode probiert... Dim suchtext As String For i = 1 To 250 Sheets("LOP").Select Range("E" & i).Select If suchtext = "erledigt" Then Do Cells.Find(What:=suchtext, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:= _ xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False) _ .Activate Loop End If Next bin ich zu blöde, oder warum findet er "erledigt" nicht???
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 08. Okt. 2009 09:07 <-- editieren / zitieren --> Unities abgeben:
|
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 08. Okt. 2009 09:45 <-- editieren / zitieren --> Unities abgeben: Nur für thato
Moin, for i = 250 to 1 step -1 Dann hast Du If suchtext = "erledigt" Wie soll das wahr werden, wenn Du die Variable suchtext ja nirgendwo zuweist? Sheets.Activate tut's auch, ist aber nicht zwingnd erforderlich, das aktivieren mußt Du erst bei dem Teil mit dem Einfügen. .Paste geht nur ins aktive sheet. Geh mal den code schrittweise mit F8 durch, blend Dir das Lokalfenster mit ein, dann wirst Du schnell dazu kommen, wo was nicht läuft und warum. Versuch als ersten Schritt damit anzufangen, von unten nach oben zu laufen und Dir den Zellinhalt ausgeben zu lassen. Da bei Dir ja scheinbar die Spalte feststeht, ist es einfacher. (Cells haben ein Value) Ich hab in der ganzen Zeile gesucht, daher das .Find als Vorschlag. Außerdem suche ich mir die letzte belegte Zeile mit .Find. Das sind beides "nice-to-have-Dinge", nicht zwingend notwendig Grundsätzliches: Ganz oben ein Option Explicit rein, dann fallen Schreibfehler und Nichtdeklartionen besser auf. Bis später ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... System-Info | Excel -Suche | RuA-Suche | FAQ-ACAD | CAD.de-Hilfe | Sei eine Antilope Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 08. Okt. 2009 10:42 <-- editieren / zitieren --> Unities abgeben:
so jetzt ist später... ;o) habe versucht mal deine hinweise umzusetzen. leider ist es bei dem versuch geblieben. habe das suchwort jetzt mal explizit in eine zelle geschrieben und versucht so den suchtext zuzuweisen. allerdings bekomme ich ne fehlermeldung. was ist falsch??? Option Explicit Dim suchtext, i Public Sub test() Sheets("LOP").Select suchtext = Range(1, 9).Value For i = 25 To 1 Step -1 If Worksheets("LOP").Cells(i, 5).Value = suchtext Then End If Next Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 08. Okt. 2009 10:55 <-- editieren / zitieren --> Unities abgeben: Nur für thato
|
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 08. Okt. 2009 11:10 <-- editieren / zitieren --> Unities abgeben:
|
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 08. Okt. 2009 11:26 <-- editieren / zitieren --> Unities abgeben:
habs nochmal einfacher probiert. mein problem ist, dass ich nicht cells(i,5) auswählen möchte, sindern die ganze zeile i wie mache ich das denn? Sub test() Sheets("LOP").Select For i = 25 To 1 Step -1 If Cells(i, 5).Value = "erledigt" Then Cells(i, 5).Select End If Next End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 08. Okt. 2009 11:26 <-- editieren / zitieren --> Unities abgeben: Nur für thato
|
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 08. Okt. 2009 11:28 <-- editieren / zitieren --> Unities abgeben: Nur für thato
|
MWN Mitglied Dipl.-Ing.
Beiträge: 492 Registriert: 14.02.2007
|
erstellt am: 08. Okt. 2009 11:30 <-- editieren / zitieren --> Unities abgeben: Nur für thato
Will ja kein Spielverderber sein, aber bei mir funktioniert es so: Code: Sub test() pos = 1 For i = 1 To ActiveSheet.Cells(Rows.Count, 5).End(xlUp).Row If Cells(i, 5).Value = "erledigt" Then Cells(i, 5).Select Cells(i, 5).EntireRow.Copy Worksheets("Tabelle2").Select ActiveSheet.Cells(pos, 1).Select ActiveSheet.Paste Worksheets("LOP").Activate Worksheets("LOP").Select pos = pos + 1 End If Next i End Sub
Grüße Tobias PS: Bitte nicht schlagen, manchmal überkommt es mich einfach so! ------------------ Besucht mich doch mal in meiner Tischlerei [Diese Nachricht wurde von MWN am 08. Okt. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 08. Okt. 2009 11:31 <-- editieren / zitieren --> Unities abgeben:
|
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 08. Okt. 2009 11:33 <-- editieren / zitieren --> Unities abgeben:
|
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 08. Okt. 2009 12:16 <-- editieren / zitieren --> Unities abgeben:
nicht schön, aber selten Sheets("LOP").Select j = 2 For i = 1 To 25 If Cells(i, 5).Value = "erledigt" Then Rows(i).Select Selection.Cut Sheets("done").Select ActiveSheet.Cells(j, 1).Select If Cells(j, 1) <> "" Then j = j + 1 End If ActiveSheet.Paste Sheets("LOP").Select Rows(i).Select Selection.Delete Shift:=xlUp End If Next funktioniert soweit. ABER leider wird im tabellenblatt "done" immer die gleiche zeile überschrieben. ich prüfe doch ab ob die zelle leer ist, falls nicht, nächste zeile auswählen. tut er aber nicht. wo is denn mein denkfehler??? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 08. Okt. 2009 12:29 <-- editieren / zitieren --> Unities abgeben: Nur für thato
|
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 08. Okt. 2009 12:40 <-- editieren / zitieren --> Unities abgeben:
hab meinen fehler gefunden. jetzt muss ich nur noch das problem lösen, dass ich im blatt "lop" nach dem ausschneide auch wieder an die oberste stelle kommen. durch die schleife werden zeilen übergangen. wie funktioniert es denn mit der find methode? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 08. Okt. 2009 12:43 <-- editieren / zitieren --> Unities abgeben: Nur für thato
|
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 08. Okt. 2009 12:44 <-- editieren / zitieren --> Unities abgeben:
so, das ist meine lösung, falls es jemanden interessiert. bin an verbesserungen durchaus interessiert! Sheets("LOP").Select j = 2 For i = 1 To 25 If Cells(i, 5).Value = "erledigt" Then Rows(i).Cut Sheets("done").Select If Cells(j, 1) <> "" Then j = j + 1 End If ActiveSheet.Cells(j, 1).Select ActiveSheet.Paste Sheets("LOP").Select Rows(i).Select Selection.Delete Shift:=xlUp i = 0 End If Next
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 09. Okt. 2009 12:05 <-- editieren / zitieren --> Unities abgeben: Nur für thato
Mahlzeit thato, läuft . Hier (Wie gewünscht?) ein Verbesserungsvorschlag, etwas kürzer, schneller, übersichtlicher, ohne Select. Code: Sub Kurz_Schieberei() Dim i As Integer Dim intLast As Integer 'Nummer der letzten belegten Zeile in "done" intLast = Worksheets("done").UsedRange.Rows.Count 'falls keine Spalteueberschriften: + 1!!! For i = 1 To 25 If Sheets("LOP").Cells(i, 5).Value = "erledigt" Then Sheets("LOP").Rows(i).Cut Sheets("done").Cells(intLast, 1).Insert Shift:=xlDown Sheets(1).Rows(i).Delete Shift:=xlUp i = i - 1 'sonst wird eine Zeile uebersprungen End If Next Application.CutCopyMode = False '"Esc", falls kopieren noch aktiv End Sub
Hier ließe sich evtl. noch mit With-Schachteln arbeiten, wobei das bei zwei Zeilen kaum Sinn macht. Auch die Register (Worksheets) könntest Du in Variablen schreiben und darauf zugreifen. Falls ein Benutzer eines der Blätter umbenennt, ist diese Routine für die Katz'.Eine wasserdichte Bezeichnung wäre z. B. für "LOP": Sheets(1), der VBA-Projekt-Explorer (Strg+R) zeigt die Nummern an: TabelleX (Name). Diese Nummer bleibt auch erhalten, wenn wild Blätter hinzugefügt und/oder gelöscht werden. Application.Screenuptdating = False am Anfang und = True am Ende bringt auch noch ein bisschen was, wobei sich die Steigerung bei 25 Zeilen kaum bemerkbar macht. Hier nochmal Deine Variante, auskommentiert: Code: Sub Schieberei() Dim i As Integer 'Dim j As Integer Dim intLast As Integer 'Nummer der letzten belegten Zeile in "done" intLast = Worksheets("done").UsedRange.Rows.Count 'falls keine Spalteueberschriften: + 1!!! ' j = 2 For i = 1 To 25 If Sheets("LOP").Cells(i, 5).Value = "erledigt" Then Sheets("LOP").Rows(i).Cut ' Sheets("done") '.Select ' If .Cells(j, 1) <> "" Then ' j = j + 1 ' End If ' ActiveSheet.Cells(j, 1).Select ' ActiveSheet.Paste Sheets("done").Cells(intLast, 1).Insert Shift:=xlDown ' Sheets("LOP").Select ' Rows(i).Select ' Selection.Delete Shift:=xlUp 'Zeile loeschen Sheets("LOP").Rows(i).Delete Shift:=xlUp 'i = 0 'WARUM? Schleife beginnt wieder ab Zeile 1, unnoetig i = i - 1 'eleganter und erforderlich, sonst wird eine Zeile uebersprungen End If Next Application.CutCopyMode = False '"Esc", falls kopieren noch aktiv End Sub
------------------ DIN1055.de | Lastannahmen für Anwender NEU: Foren zu DIN 1055 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-User2 Mitglied
Beiträge: 31 Registriert: 13.03.2006
|
erstellt am: 14. Okt. 2009 12:30 <-- editieren / zitieren --> Unities abgeben: Nur für thato
Hallo, hier mein Entwurf ohne VBA. Die erledigten Zeilen werden auf dem ersten Blatt mit einem Filter ausgeblendet. Die Formeln auf dem 2. Blatt mit Strg + Shift + Enter abschließen. Bei der Datei bitte erst die Endung .txt entfernen. Viele Grüße CAD-User2
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
thato Mitglied
Beiträge: 66 Registriert: 20.04.2007
|
erstellt am: 21. Okt. 2009 11:10 <-- editieren / zitieren --> Unities abgeben:
|