Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1692to1696
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro Spaltenweise wiederholen

Makro Spaltenweise wiederholen
31.05.2019 17:39:25
Michael
Liebe VBA-Experten,
was für euch ein Klacks ist, ist für mich eine echte Herausforderung.
In der Datei möchte ich etwas relativ simples durchführen.
https://www.herber.de/bbs/user/130133.xlsx
In der Spalte B sind Formeln hinterlegt. Diese Formeln sollen in Spalte C kopiert werden, wenn in C1 eine Zahl größer 0 steht. Danach sollen die Ergebnisse als feste Werte kopiert werden.
Ein winziges Makro konnte ich selbst erstellen und das tut auch schon fast alles was ich brauche.
Was mir fehlt ist, dass das Makro sich Spalte für Spalte wiederholt. Also angefangen mit Spalte C, dann D, dann E, dann F etc.
Nett wäre es, wenn ich angeben könnte bis zu welcher Spalte sich das Makro wiederholen soll.
Mein Makro sieht wie folgt aus:

Sub IfThenElse()
If Cells(1, 3).Value > 0 Then
Range("B2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range("C2").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("C2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("C1").Select
Application.CutCopyMode = False
End If
End Sub

Else fehlt absichtlich, weil wenn die Zeile 1 nicht größer 0 ist, dann soll nichts passieren bzw. das Makro soll einfach in die nächste Spalte gehen und dort wieder von vorne anfangen.
Die unterschiedlichen Schleifen in VBA habe ich mir bereits angeschaut aber ich bekomme es einfach nicht zum laufen.
Wie muss der Code aussehen?
Vielen Dank vorab

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro Spaltenweise wiederholen
31.05.2019 17:40:55
Hajo_Zi
das geht nicht, da eine XLSX Datei kein Makro enthalten kann.
Ich sehe keinen Grund eine Datei 2x zu speichern. Ich führe keine Liste unter welchem Dateinamen ich die Datei gespeichert habe.

Beiträge von Werner, Luc, robert, J.O.Maximo und folgende lese ich nicht.
Die Beiträge werden auch ignoriert, es erfolgt keine Antwort.
AW: Makro Spaltenweise wiederholen
31.05.2019 17:56:43
Daniel
Hi
wenn du die Abfrage, ob der Wert in Zeile 1 größer als 0 ist, gleich in die Formeln in Spalte B einbaust, dann brauchst du keine Schleife sondern kannst alle Zellen in einem Rutsch bearbeiten:
dh die Formel in B2 muss so anfangen: =Wenn(B$1=0;"";SVerweis(...))
das Code reicht dann:
Sub test()
Dim Z As Long
Dim S As Long
Z = Cells(2, 2).End(xlDown.Row)
S = Cells(1, 2).End(xlToRight).Column
Range(Cells(2, 2), Cells(2, Z)).Copy
With Range(Cells(2, 3), Cells(Z, S))
.PasteSpecial xlPasteFormats
.Formula = .Value
End With
End Sub
Gruß Daniel
Anzeige
AW: Makro Spaltenweise wiederholen
31.05.2019 18:28:08
Michael
Hi Daniel,
die Formel habe ich angepasst und dein Makro getestet.
Es kommt die Fehlermeldung "Fehler beim Kompilieren: Ungültiger Bezeichner" und springt in die Zeile
Z = Cells(2, 2).End(xlDown.Row) wo er xlDown markiert
AW: Makro Spaltenweise wiederholen
31.05.2019 18:33:26
onur
Z = Cells(2, 2).End(xlDown).Row !!!
AW: Makro Spaltenweise wiederholen
31.05.2019 20:05:41
Michael
Super, die Klammer war tatsächlich der Fehler. Leider kam danach noch einer dazu.
Nämlich in der Zeile
PasteSpecial xlPasteFormats
erscheint "Laufzeitfehler '1004': Anwendungs- oder objektdefinierter Fehler"
Vermutlich habe ich mich unpräzise ausgedrückt, erlaubt mir es nochmals zu versuchen.
1. In der Spalte B sind Formeln enthalten, bis hierhin ist alles ok. Nun folgt die Aufgabe an das Makro:
2. Makro soll prüfen ob in C1 ein Wert größer 0 Steht.Wenn Ja, dann kopiere alle Formeln aus B in C hinein. Nach getaner Arbeit gehe in Spalte D, prüfe ob D1 größer 0 ist und kopiere alle Formeln aus B in D hinein. Danach weiter mit Spalte E,F,G usw.
3. Wenn C1 die Bedingung (größer 0) nicht erfüllt, dann geh weiter in Spalte D und versuche es in D1. Danach Spalte E,F,G...usw.
Das Makro soll einfach nur die Formeln aus Spalte B in die Spalten kopieren die in der ersten Zeile einen Wert größer 0 ausweisen. Danach diese Spalte kopieren und als feste Werte wieder einfügen.
Hintergrund ist: ich habe eine Datei die etwa 2.000 Spalten breit ist und zwischendrin gibt es sehr viele Spalten die die Bedingung größer 0 nicht erfüllen. Wenn jede Zelle eine Sverweis Formel hat wird die Datei sehr groß, weil auch die eigentlich unnötigen Spalten berechnet werden. Das löschen dieser Spalten kommt jedoch nicht in Betracht, weil selbst diese Spalten gelegentlich die Bedingung größer 0 erfüllen.
Anzeige
AW: Makro Spaltenweise wiederholen
31.05.2019 21:28:48
Daniel
Hi
das muss heißten: .PasteSpecial xlpasteformulas
denn du willst ja die Formeln aus Spalte B einfügen.
mit der Wenn-Funktion davor stehen die SVerweise ja nur als Text in der Formel drin und werden nicht berechnet, wenn in Zeile 1 kein Wert steht.
das nachfolgende .Formulas = .Values entfernt dann die Formeln und ersetzt sie durch ihren Wert.
Gruß Daniel
AW: Makro Spaltenweise wiederholen
01.06.2019 10:22:01
Michael
Der Sverweis ist tatsächlich nur als Text drin aber er ist drin. Da die Datei sehr groß ist versuche ich jeden noch so kleinen Schritt weg zu lassen.
Wenn die Bedingung (größer 0) in C1, D1, E1 oder in einer anderen Spalte nicht erfüllt ist, dann soll das Makro einfach in die nächste Spalte springen und prüfen ob dort die Bedingung erfüllt wird, Wenn ja, dann kopiere die Formeln aus B in diese Spalte, sonst geh weiter in die nächste Spalte.
Dadurch erhoffe ich mir möglichst wenig Zellen anzusprechen und möglichst wenig Formeln zu kopieren.
Anzeige
AW: Makro Spaltenweise wiederholen
01.06.2019 10:23:28
Michael
Der Sverweis ist tatsächlich nur als Text drin aber er ist drin. Da die Datei sehr groß ist versuche ich jeden noch so kleinen Schritt weg zu lassen.
Wenn die Bedingung (größer 0) in C1, D1, E1 oder in einer anderen Spalte nicht erfüllt ist, dann soll das Makro einfach in die nächste Spalte springen und prüfen ob dort die Bedingung erfüllt wird, Wenn ja, dann kopiere die Formeln aus B in diese Spalte, sonst geh weiter in die nächste Spalte.
Dadurch erhoffe ich mir möglichst wenig Zellen anzusprechen.
AW: Makro Spaltenweise wiederholen
01.06.2019 11:14:39
Werner
Hallo Michael,
so:
Public Sub aaa()
Dim loZeile As Long, loSpalte As Long, i As Long
Application.ScreenUpdating = False
With Worksheets("Tabelle1")
loZeile = .Cells(.Rows.Count, 1).End(xlUp).Row
loSpalte = .Cells(1, .Columns.Count).End(xlToLeft).Column
For i = 3 To loSpalte
If IsNumeric(.Cells(1, i)) And .Cells(1, i).Value > 0 Then
.Cells(2, 2).Copy
.Range(.Cells(2, i), .Cells(loZeile, i)).PasteSpecial Paste:=xlPasteFormulas
.Range(.Cells(2, i), .Cells(loZeile, i)).Value = _
.Range(.Cells(2, i), .Cells(loZeile, i)).Value
End If
Next i
Application.CutCopyMode = False
End With
End Sub
Gruß Werner
Anzeige
AW: Makro Spaltenweise wiederholen
01.06.2019 23:25:10
Michael
@ Werner, Tausend Dank, dein Makro funktioniert. Ich habe damit etwas gespielt um das Makro zu verstehen und es ist genau das was ich suchte.
Beim Testlauf auf der großen Datei kommt es jedoch zu einer winzigen Herausforderung. Nach jeder kopie bzw. einfügen der Formeln in die Spalten kommt das Pop-up: hier gibt es schon Daten. Möchten Sie diese ersetzen ; Ja/Nein
wie kann man das Pop-up umgehen?
@ Daniel
Danke für den Denkanstoß. Ich beantworte zunächst deine Fragen:
a) in etwa 900 Zeilen und 6.000 Spalten (mehrere Dateien). Also 5.4 Mio Zellen.
Von den 6.000 Spalten erfüllen nur etwa 500 bis 2.000 Spalten die Bedingung größer 0.
b) Leider verstehe ich deine Frage nicht ganz. Das Suchkriterium des Sverweis ist variabel und in den 900 Zeilen zu finden. Also 900 unterschiedliche Suchkriterien. Die Suchmatrix hat gegenwärtig 600 Spalten und 200 Zeilen, jedoch stetig wachsend. Spalte ist Variabel und wird mittels einer Hilfszeile errechnet. Konnte ich mit diesen Infos deine Frage beantworten?
c) Die Formeln sind so geschrieben, dass sie problemlos nach rechts oder nach unten gezogen (kopiert) werden können. Der Zahlenwert in der ersten Zeile ist die Hilfszeile die mir die Spaltennummer in der Suchmatrix errechnet. Wenn die Hilfszeile kleiner 0, dann ist in der Suchmatrix die gesuchte Spalte nicht vorhanden. Folglich kann das Makro direkt in die nächste Spalte gehen und dort nach der Bedingung größer 0 suchen.
Anzeige
AW: Makro Spaltenweise wiederholen
02.06.2019 11:00:02
Werner
Hallo Michael,
versuch mal die Display-Alerts auszuschalten.
Public Sub aaa()
Dim loZeile As Long, loSpalte As Long, i As Long
Application.ScreenUpdating = False
With Worksheets("Tabelle1")
loZeile = .Cells(.Rows.Count, 1).End(xlUp).Row
loSpalte = .Cells(1, .Columns.Count).End(xlToLeft).Column
For i = 3 To loSpalte
If IsNumeric(.Cells(1, i)) And .Cells(1, i).Value > 0 Then
.Cells(2, 2).Copy
Application.DisplayAlerts = False
.Range(.Cells(2, i), .Cells(loZeile, i)).PasteSpecial Paste:=xlPasteFormulas
.Range(.Cells(2, i), .Cells(loZeile, i)).Value = _
.Range(.Cells(2, i), .Cells(loZeile, i)).Value
Application.DisplayAlerts = True
End If
Next i
Application.CutCopyMode = False
End With
End Sub
Gruß Werner
Anzeige
für ein Feedback scheint es nicht zu reichen. owT
04.06.2019 09:52:49
Werner
AW: Makro Spaltenweise wiederholen
01.06.2019 13:29:24
Daniel
Hi
deine Denkweise ist im Prinzip ja richtig, nur ist es für Excel erheblich weniger Aufwand, 1000 Zellen in einem Schritt mit der selben Aktion zu bearbeiten, als 1000x jede Zelle einzeln.
Kannst du dir im Prinzip so vorstellen, als ob du beim Einkaufen im Supermarkt alle Artikel einzeln bezahlst und dich dafür jedes mal neu an der Kasse anstellen musst, oder alle zuzusammen.
kannst du mal konkrete Angaben zu deinem SVerweis machen?
a) in wieviele Zeilen und Spalten muss die Formel geschrieben werden
b) wie groß ist der Zellbereich, den die SVerweis-Funktion als 2. Parameter verwendet?
c) wie ändert sich die Formel, wenn du sie nach unten bzw nach rechts verschiebst, welchen Einfluss hat der Zahlenwert aus Zeile 1 aus die Formel?
ich vermute mal, dass es wesentlich sinnvoller ist, erstmal beim SVerweis mit der Optimierung anzusetzen, der der verursacht wahrscheinlich den größten Teil des Rechenaufwandes.
wenn beispielsweise wie in deiner Beispieldatei der Suchbegriff für den SVerweis fest in der Spalte A steht und sich beim ziehen nach rechts nicht verändert, so das der SVerweis dann immer auf die gleiche Zeile in der Suchtabelle zugreift, dann ist es sehr hilfreich, der Tabelle eine Hilfsspalte hinzuzufügen, dort die Zeilennummer der Fundstelle mit VERGLEICH zu ermitteln und in den rechts liegenden Spalten die Werte nur noch mit INDEX und der Zeilennummer auszulesen.
Gruß Daniel
Anzeige
AW: Makro Spaltenweise wiederholen
01.06.2019 23:36:53
Michael
@ Daniel
Danke für den Denkanstoß. Ich beantworte zunächst deine Fragen:
a) in etwa 900 Zeilen und 6.000 Spalten (mehrere Dateien). Also 5.4 Mio Zellen.
Von den 6.000 Spalten erfüllen nur etwa 500 bis 2.000 Spalten die Bedingung größer 0.
b) Leider verstehe ich deine Frage nicht ganz. Das Suchkriterium des Sverweis ist variabel und in den 900 Zeilen zu finden. Also 900 unterschiedliche Suchkriterien. Die Suchmatrix hat gegenwärtig 600 Spalten und 200 Zeilen, jedoch stetig wachsend. Spalte ist Variabel und wird mittels einer Hilfszeile errechnet. Konnte ich mit diesen Infos deine Frage beantworten?
c) Die Formeln sind so geschrieben, dass sie problemlos nach rechts oder nach unten gezogen (kopiert) werden können. Der Zahlenwert in der ersten Zeile ist die Hilfszeile die mir die Spaltennummer in der Suchmatrix errechnet. Wenn die Hilfszeile kleiner 0, dann ist in der Suchmatrix die gesuchte Spalte nicht vorhanden. Folglich kann das Makro direkt in die nächste Spalte gehen und dort nach der Bedingung größer 0 suchen.
Anzeige
AW: Makro Spaltenweise wiederholen
02.06.2019 17:59:17
Daniel
Hi
Die Frage b) bezieht sich auf die SVerweisfunktion.
Der sieht ja in etwa so aus, ich möchte die fette Zahl wissen.
=SVerweis($A2;TabelleX!$A$1:$X$l1234;B$1;0)
Wenn du mit ganzen Spalten arbeitet, die Zahl die dort stehen müsste.
Und wie gesagt, dein Suchbegriff ist innerhalb einer Zeile immer gleich!
Daher ist es Sinnvoller zunächst in einer weiteren Hilfsspalte mit VERGLEICH die Zeilennummer zu ermitteln, in welcher sich der Wert befindet und dann in den Auswerteformeln keinen SVerweis mehr zu verwenden, sondern INDEX.
Gruß Daniel

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige