Ändern Sie die Schleife, um die Ergebnisse in zusätzliche Zellen zu schreiben

669
KAREN KENDALL

Ich habe den folgenden Code seit einiger Zeit verwendet, brauche jedoch Hilfe, um eine Änderung vorzunehmen. Ich habe es versucht und versucht, aber es funktioniert nicht. Wenn jemand einen Blick darauf werfen könnte, sagt meine Forschung, ich suche nach einer "Änderungsschleife, um Ergebnisse in zusätzliche Zellen zu schreiben". Bitte sehen Sie mein Excel-Bild unten.

Im Moment findet der Code alle übereinstimmenden Nummern, die in der A1-Zelle eingegeben wurden, und schreibt sie in die entsprechenden Zellen L1: I12. Ich brauche den Code, um die gleichen Informationen auch nur in einer der folgenden Zellen bereitzustellen: C17, C18, F17, F18. Wenn der Code die Nummer in der Zelle unterhalb der übereinstimmenden Nummer (aus Zelle A1) kopieren und einfügen kann (siehe Beispielergebnis unten), kann er in die Zelle links neben der obigen Änderungsschleifenpaste in den folgenden Zellen eingefügt werden: B17, B18, E17, E18.

Beispiel mit erwartetem Ergebnis gemäß dem Beispiel-Excel-Bild. Nummer 8 wurde in Zelle A1 eingegeben und in Zelle A34 gefunden. 8-15 würden also kopiert und in L8 und C17 eingefügt. Es würde auch die Nummer 7 von Zelle A35 (die folgende Nummer) in Zelle B17 kopieren. Der Code würde das gleiche für Zelle F20 und E21 tun. Nach dem Kopieren und Einfügen müssen alle Zellen B34, C34 und D34 gelöscht werden und wären daher leer. Gleiches für F20, G20 und H20. Ich hoffe das ist klar, wenn nicht, bitte beraten und ich werde klarstellen.

Mein Arbeitscode ist unten und mein Versuch ist unter diesem Code.

Excel-Tabelle

Arbeitscode:

Sub do_it()  Dim n, sht As Worksheet, cell As Range, num, tmp, rngDest As Range  Set sht = ActiveSheet  n = sht.Range("A1")  For Each cell In sht.Range("A20:A34,D20:D34,G20:G34").Cells  tmp = cell.Offset(0, 1).Value  If cell.Value = n And tmp Like "*#-#*" Then  'get the first number num = CLng(Trim(Split(tmp, "-")(0))) Debug.Print "Found a positive result in " & cell.Address 'find the next empty cell in the appropriate row Set rngDest = sht.Cells(num, sht.Columns.Count).End(xlToLeft).Offset(0, 1) 'make sure not to add before col L If rngDest.Column < 12 Then Set rngDest = sht.Cells(num, 12)  cell.Offset(0, 1).Copy rngDest  End If Next  End Sub 

Mein Versuch:

Sub do_it()  Dim n, sht As Worksheet, cell As Range, num, tmp, rngDest As Range  Set sht = ActiveSheet  n = sht.Range("A1")  For Each cell In sht.Range("A20:A34,D20:D34,G20:G34").Cells  tmp = cell.Offset(0, 1).Value  If cell.Value = n And tmp Like "*#-#*" Then  'get the first number num = CLng(Trim(Split(tmp, "-")(0))) Debug.Print "Found a positive result in " & cell.Address 'find the next empty cell in the appropriate row Set rngDest = (“ C17, C18, F17, F18’) cell.Offset(0, 1).Copy rngDest  End If Next  End Sub 
0

1 Antwort auf die Frage

0
Christofer Weber

Es ist vielleicht nicht hübsch oder skalierbar, aber da ich nicht genau weiß, was Sie auf lange Sicht erreichen wollen, sollte hier etwas funktionieren.

Erstens For Each cell In sht.Range("A20:A34,D20:D34,G20:G34").Cellsstimmt die Zeile nicht mit den in Ihrem Beispiel verwendeten Zellen überein, daher habe ich Folgendes geändert:

For Each cell In sht.Range("A20:A34,E20:E34,I20:I34").Cells 

Dann habe ich die tmp-Variable am Ende entführt, weil sie nicht mehr verwendet wird, und habe sie so eingestellt, dass sie die letzte Zelle der Spalte findet, in der sie eine Übereinstimmung gefunden hat, wie folgt:

Set tmp = sht.Cells(Cells(Rows.Count, cell.Column).End(xlUp).Row, cell.Column) 

Dann müssen wir die neuen Felder angeben und sicherstellen, dass wir nur jedes Mal füllen. Sie können dies tun, indem Sie prüfen, ob der erste leer ist oder einen Zähler hat. So oder so funktioniert es nur, wenn Sie weniger als 4 Übereinstimmungen finden.

Das Endergebnis war dies, ändern Sie es nach Bedarf.

Sub do_it()  Dim sht As Worksheet, n As String, cell, num, tmp, rngDest As Range, i As Integer Set sht = ActiveSheet n = sht.Range("A1").Value i = 0 For Each cell In sht.Range("A20:A34,E20:E34,I20:I34").Cells tmp = cell.Offset(0, 1).Value If cell.Value = n And tmp Like "*#-#*" Then 'get the first number num = CLng(Trim(Split(tmp, "-")(0))) 'find the next empty cell in the appropriate row Set rngDest = sht.Cells(num, sht.Columns.Count).End(xlToLeft).Offset(0, 1) 'make sure not to add before col L If rngDest.Column < 12 Then Set rngDest = sht.Cells(num, 12) cell.Offset(0, 1).Copy rngDest  ' This is getting the next number in A/E/I---- Set tmp = cell.Offset(1, 0)  ' This is filling up B17 - F18 in order until filled If sht.Range("B17").Value = "" Then sht.Range("C17").Value = cell.Offset(0, 1).Value sht.Range("B17").Value = tmp.Value ElseIf sht.Range("B18").Value = "" Then sht.Range("C18").Value = cell.Offset(0, 1).Value sht.Range("B18").Value = tmp.Value ElseIf sht.Range("E17").Value = "" Then sht.Range("F17").Value = cell.Offset(0, 1).Value sht.Range("E17").Value = tmp.Value ElseIf sht.Range("E18").Value = "" Then sht.Range("F18").Value = cell.Offset(0, 1).Value sht.Range("E18").Value = tmp.Value End If '---- This clears the BCD/FGH/JKL columns after using the value ---- 'cell.Offset(0, 1).Resize(, 3).Value = ""   End If Next cell End Sub 
Hallo Christofer Vielen Dank für deine Hilfe zu diesem Makro. Ich habe gerade den Zusatz getestet und das ist, was passiert: - Es scheint, dass das Makro die eingegebene Nummer in Zelle A1 nicht mehr verwendet. Es kopiert alles in die Zellen L1: L12 - Die Zahlen in den Zellen A20: A34, E20: E34, I20: I34 werden nicht kopiert, sie werden verschoben (nur der Kopierteil). Wenn also bei diesen beiden Fragen etwas helfen könnte, wäre das großartig. KAREN KENDALL vor 6 Jahren 0
Hoppla, ich habe eine Zeile verpfuscht. "Wenn n und tmp wie" * # - # * ", dann sollte" Wenn cell.Value = n und tmp wie "* # - # *" ​​"Dann" den Code aktualisieren. Dadurch wird es behoben, wenn A1 nicht ordnungsgemäß verwendet wird. Ich bin nicht sicher, was Sie unter "werden nicht kopiert, sie werden verschoben werden" bedeuten. Ich berühre die Werte in Spalte A, E und I nicht. Wenn Sie die Werte in "B, C, D" / "F, G, H" / "J, K, L" meinen, dann kopiere ich und löschen. Sie sagten, Sie wollten sie leer haben? Wenn Sie die Werte nicht entfernen möchten, kommentieren Sie den Teil 'cell.Offset (0, 1) .Resize (, 3) .Value = ""' aus. Christofer Weber vor 6 Jahren 0
Entschuldigung, es gibt einen anderen Fehler. Ich dachte, Sie wollten die "A35" -Nummer, wenn der Eintrag in Spalte A gefunden wurde, und E35, wenn Sie in Spalte E gefunden werden. Dies kann sehr einfach geändert werden, aber was soll passieren, wenn unten keine Zahl steht? Christofer Weber vor 6 Jahren 0
Entschuldigung, ich war nicht so klar, wie ich es hätte sein sollen. Für den Bereich: A20: A34, E20: E34, I20: I34 könnte sich die gefundene Nummer in einer dieser Zellen befinden und daher immer die nächste Zelle unten verwenden (es wird immer eine Zahl sein). Bitte beachten Sie das Excel-Musterblatt. Danke nochmal für all deine Hilfe. KAREN KENDALL vor 6 Jahren 0
Ok, so sollte es jetzt funktionieren, probieren Sie es aus. Christofer Weber vor 6 Jahren 0
Ein paar Probleme sind: Wenn die gefundene Nummer in E20 war, würde die Zelle E21 als Nummer zum Kopieren und Buchen verwendet. Die gefundene Anzahl könnte sich in einer oder zwei Zellen im Zellbereich befinden: A20: A34, E20: E34 und I20: I34 und die folgende Zelle würde als die Zahl verwendet, die in der entsprechenden Zelle B17, C17, E17 zu platzieren ist , E18. Das zweite Problem ist, wenn es die Nummer aus Zelle A1 findet, die nur kopiert und eingefügt werden soll. Wenn Sie das von mir gepostete Excel-Beispielblatt überprüfen, enthält es 2 Beispiele mit dem Ergebnis. Es kann hilfreich sein, einen visuellen Eindruck zu vermitteln. Wieder entschuldige mich für den Ärger. KAREN KENDALL vor 6 Jahren 0
Ich verstehe das Problem nicht. Wenn das erste Ergebnis in E20 gefunden wird, wird der Wert von E21 nach B17 kopiert. War es nicht das, was du wolltest? Denn so sehe ich aus ... Christofer Weber vor 6 Jahren 0
In deiner Frage sagst du, und ich zitiere; "Nach dem Kopieren und Einfügen müssen alle Zellen B34, C34 und D34 gelöscht werden und wären daher leer. Gleiches gilt für F20, G20 und H20." Also, was sagst du? Sie möchten sie nicht löschen? Dann kommentieren Sie einfach die letzte Zeile aus, die diese löscht. Christofer Weber vor 6 Jahren 0
Hallo, habe eine Idee. Wenn Sie sich das Beispiel-Excel-Arbeitsblatt anschauen, sehen Sie Zelle A1 mit einer 8. In diesem Beispiel ist dies die Suchnummer für die Zellen A20: A34, E20: E34, I20: I34. Die gefundenen Zellen A34 und E20 (Zelle rechts B34, G20) werden beide in Zelle L8 und L1 kopiert. Zelle B34 wird in Zelle C17 kopiert und F20 wird in Zelle C18 kopiert. Zelle A35 wird nach B17 und Zelle E21 nach B18 kopiert. Die Zellen B34, C34, D34 und F20, G20, H20 werden dann gelöscht. Dies würde für jede gefundene Nummer A1 erfolgen. Das Ende. Im Moment wird die gefundene Nummer gelöscht und nicht kopiert. Kommunikation kann schwierig sein. Danke nochmal für all deine Hilfe. KAREN KENDALL vor 6 Jahren 0
Korrektur: Meine Zeile "Im Moment wird die gefundene Nummer gelöscht und nicht kopiert. Sollte gelesen werden. Jetzt wird die gefundene Nummer gelöscht. KAREN KENDALL vor 6 Jahren 0
Ja? Und ich habe dir doch gesagt ... ich habe die letzte Zeile für dich auskommentiert. Jetzt löscht es nichts. Besser? Christofer Weber vor 6 Jahren 0
Es funktioniert, es funktioniert! Sie waren sehr geduldig mit mir und ich bin sehr dankbar, aber ich fragte mich, ob ich einen anderen kleinen Gefallen bitten könnte. Wenn ich nur einen Zellbereich hätte, sagen Sie A20: A35, die nur eine Reihe von Zahlen rechts davon hat (im Gegensatz zu den anderen Zellbereichen, die insgesamt drei Reihen rechts davon haben), also nur die Zellen B20: B35 und keine anderen Zeilen welche Codezeile was ich benutze und wo wird sie platziert? Wie immer vielen Dank. KAREN KENDALL vor 6 Jahren 0
Ich meine, technisch sollten Sie in der Lage sein, exakt denselben Code zu verwenden. Wenn Sie die anderen Spalten überspringen möchten, können Sie für jede Zelle in sht.Range ("A20: A34, E20: E34, I20: I34"). Zellen für jede Zelle in sht.Range ("A20: A34") ändern. ).Zellen. Die Zahlen in Spalte "C" und "D" werden vom Code nie berührt. Wenn sie nicht existieren, würde dies nichts ändern. Wenn du das meinst. Christofer Weber vor 6 Jahren 0
Ich habe mit der Zeile "For Each cell In sht.Range (" A20: A34 ") gespielt. Cells 'und es macht nur die Sache richtig mit der Änderung, aber ich würde auch gerne die anderen 2 Reihen behalten Entfernen von anderen 2 Zellen: Es ist, als ob ich dazu zwei oder mehr Zeilen brauche. Eine Zeile für die Zellen A20: A34 und eine weitere für E20: E34, I20: I34. Nochmals vielen Dank. KAREN KENDALL vor 6 Jahren 0
Es ist kein Problem, sie voneinander zu trennen und zwei For-Schleifen zu erstellen oder sogar, dass die Schleife verschiedene Dinge für die verschiedenen Reihen ausführt. Ich bin mir einfach nicht sicher, was genau Sie wollen. Christofer Weber vor 6 Jahren 0
Hi, ich habe es verstanden. ich freue mich sehr über eure hilfe. Karen KAREN KENDALL vor 6 Jahren 0