Excel Wenn Wert in Spalte dann kopieren Zelle Makros ?
Hallo liebe Leute,
ich hoffe mir kann jemand weiterhelfen mit meinem Problem.
Ich habe folgendes Problem:
Ich habe in verschiedenen Worksheets Tabellen in denen ein Wert X steht oder Y.
Ich würde hierfür einen Durchlaufmakros benötigen der die Tabellen durchsucht und mir immer bei Wert X die ganze Zeile zb. von B1 bis M1 in die erste Arbeitsmappe kopiert.
Veranschaulichung:
Mappe1 Mappe2 Mappe 3 Mappe4
In Mappe1 befinden sich von B34:M81 leere Zellen in denen später die kopien kommen sollen.
In den restlichen Mappen soll die Spalte M auf Wert U abgefragt werden, ist dieser U sollen die davorliegenden Zellen A:J in den Bereich der ersten Mappe kopiert werden.
Ich hoffe mir kann jemand helfen.
1 Antwort
Ist Dir klar, dass A:J in Mappe1 dann nur von B bis K erscheint, nicht bis M?
Teste mal diesen auf die Schnelle und ganz simpel gestrickten Code:
Sub KopierenNachMappe1()
Dim lZeileX As Long
Dim iZeileM1 As Integer
Dim lEnde As Long
lEnde = UsedRange.Rows.Count
For lZeileX = 1 To lEnde
If Cells(lZeileX, 13) = "U" Then
With Sheets("Mappe1")
For iZeileM1 = 34 To 81
If .Cells(iZeileM1, 2) = "" Then Exit For
Next iZeileM1
Range(Cells(lZeileX, 1), Cells(lZeileX, 10)).Copy .Cells(iZeileM1, 2)
End With
End If
Next lZeileX
End Sub
Der Code muss in das Modul jedes Tabellenblattes das kopiert werden soll.
Du kannst ihn natürlich auch zusammenfassen, oder ein Sub schreiben, dass alle anderen aufruft.
Hilft Dir das?
jedoch bleibt dieser bei lEnde = UsedRange.Rows.Count hängen.
Da müsstest Du mir schon genauer erklären, wie dieses "hängen" sich äußert.
Laufzeitfehler `424` Objekt erforderlich
Ups.
Das liegt wohl daran, dass ich den Code im Modul des Tabellenblattes stehen habe und Du in einem externen Modul.
Teste mal:
lEnde = ActiveSheet.UsedRange.Rows.Count
oder
lEnde = Sheets("Mappe2").UsedRange.Rows.Count
oder schreibe Deine Code auch ins Modul des Tabellenblattes.
Dankeschön der Makros arbeitet nun, jedoch aus unerklärlichen Gründen wird nichts kopiert.
Dim lZeileX As Long
Dim iZeileN1 As Integer
Dim lEnde As Long
lEnde = Sheets("Schlüsselmanagement").UsedRange.Rows.Count
For lZeileX = 1 To lEnde
If Cells(lZeileX, 14) = "S" Then
With Sheets("Startbildschirm")
For iZeileN1 = 34 To 81
If .Cells(iZeileN1, 2) = "" Then Exit For
Next iZeileN1
Range(Cells(lZeileX, 1), Cells(lZeileX, 10)).Copy .Cells(iZeileN1, 2)
End With
End If
Next lZeileX
Im Starbildschirm befinden sich die Buttons und das Feld in das Kopiert werden sollte. Dieses Feld ist von B34:M81.
In der Schlüsselmanagement Mappe sind die Werte von A6:J40, die ich auf den Startbildschirm kopieren möchte, wenn in der Spalte N jetzt zb. S steht oder in M zb. U steht, j nach Button.
Der Makros läuft jedoch kommen im Startbildschirm keine Werte zum Vorschein. Obwohl ich in N drei "S" stehen habe.
Wenn die Buttons im Sheet Stardbilschirm sind, brauchst Du DARAUF nicht zu referenzieren, aber Du musst genauestens auf Schlüsselmanagment referenzieren.
Teste mal ob es so klappt:
Private Sub CommandButton1_Click()
Dim lZeileX As Long
Dim iZeileN1 As Integer
Dim lEnde As Long
With Sheets("Schlüsselmanagement")
lEnde = .UsedRange.Rows.Count
For lZeileX = 1 To lEnde
If .Cells(lZeileX, 14) = "S" Then
For iZeileN1 = 34 To 81
If Cells(iZeileN1, 2) = "" Then Exit For
Next iZeileN1
.Range(.Cells(lZeileX, 1), .Cells(lZeileX, 10)).Copy Cells(iZeileN1, 1)
End If
Next lZeileX
End With
End Sub
Die führenden Punkte für das With sind hier wichtig.
Klappt es?
Es klappt :-) vielen Dank.
Es gibt nur einen kleinen Fehler.
Im Startbildschirm fängt er nicht in der B34 sondern in A34 zum reinkopieren an. Und irgendwie kopiert er mir nicht alle S markierten Spalten in den Startbildschirm. Es wird nur die 9te Zeile von Schlüsselmanagement kopiert.
Im Startbildschirm fängt er nicht in der B34 sondern in A34 zum reinkopieren an.
Stimmt, da habe ich nicht aufgepasst. Ändere das so:
... .Copy Cells(iZeileN1, 2)
Und irgendwie kopiert er mir nicht alle S markierten Spalten in den
Startbildschirm. Es wird nur die 9te Zeile von Schlüsselmanagement
kopiert.
Das kann ich so nicht nachvollziehen.
Wird denn nur diese EINE Zeile eingefügt? Oder fängt er dort erst an zu suchen? Ist das die erste Zeile mit einem S?
Beschreibe es vielleicht nochmal genauer.
Und gehe den Code mal mit F8 Step by Step durch, vielleicht erkennst Du den Fehler.
Wenn ich den Satz auf
... .Copy Cells(iZeileN1,2) ändere kommt Laufzeitfehler 1004 Kann Teil einer verbundenen Zelle nicht ändern.
Was das zweite angeht, ich habe den Code mit F8 überprüft. Die Abfrage von S funktioniert, jedoch wenn er kopiert kopiert er immer wieder über die erste Zeile im Startbildschirm. Er springt nicht eine Zelle weiter nach dem kopieren sonder kopiert einfach über die erste Zeile.
.Range(.Cells(lZeileX, 1), .Cells(lZeileX, 10)).Copy Cells(iZeileN1, 2)
... .Copy Cells(iZeileN1,2) ändere kommt Laufzeitfehler 1004 Kann Teil einer verbundenen Zelle nicht ändern.
Wenn Du VBA-Code ausführst, solltest Du auf keine Fall Verbundene Zellen in dem Bereich haben, das gibt fast immer Probleme.
Statt die Zellen zu verbinden, geh auf:
Zellen formatieren/ Ausrichtung/ Horizontal/ Über Auswahl zentrieren
Mit der Schleife
For iZeileN1 = 34 To 81
If Cells(iZeileN1, 2) = "" Then Exit For
Next iZeileN1
wird die Zeile, in die kopiert werden soll, so festgelegt, dass es die erste Zelle im Bereich B34:B81 ist, die leer ist.
Es wird also nur in der Spalte B nachgesehen, ob da schon was steht. Nur wenn nicht, wird dort etwas eingefügt.
Du musst also sicherstellen, dass nach dem ersten kopieren in B34 etwas steht, sonst wird wieder hier eingefügt.
Wenn nicht sichergestellt ist, dass in B (bzw. im kopierten Bereich in Spalte A) etwas steht, klappt das nicht.
Ich sehe gerade noch, dass Du einmal davon sprichst ab Spalte A zu kopieren und vorher in der Frage, ab Spalte B.
Falls also nur ab Spalte B kopiert werden soll, dann ändere den Code so (Sonst probiere mal selber mit den Spaltenangaben nach dem Komma bei Cells(Zeile , Spalte) herum :
.Range(.Cells(lZeileX, 2), .Cells(lZeileX, 10)).Copy Cells(iZeileN1, 2)
Perfekt, es war rein die Formatierung Schuld. Es funktioniert ohne Probleme. Vielen Danke für die tolle Hilfe.
Hallo Oubyi, vielen Dank für die rasche hilfe.
Ich habe nun den von dir geschriebnen Code probiert, jedoch bleibt dieser bei lEnde = UsedRange.Rows.Count hängen.
Zu dem Thema A:J in Mappe1 auf B:K kopieren,
ja ist mir bewusst ich möchte nur den Text der vorigen Spalten kopieren ab M ist es nur ein Wert der eben sagt du sollst kopiert werden oder nicht.
Um mein Problem nochmal genauer zu erläutern, ich habe auf der ersten Arbeitsmappe (Startbildschirm) einen Button und eine Fläche von B34:M81 in diese Fläche sollen später die kopierten Werte.
Auf den anderen 3 Arbeitsmappen sind Werte hinterlegt und dahinter in der Spalte M eine Buchstabe (U) der aussagt du wirst in den Startbildschirm kopiert oder nicht.