Visual Basic Makro auf weitere Zeilen anwenden?
An alle Visual Basic Experten :P
Habe in Excel ein Makro geschrieben, das mir in verschiedenen Spalten Inch in mm umrechnet und die nicht gewünschte Einheit ausblendet.
Nun habe ich die Funktion aber nur für die Zeile A... :( Kann mir jemand sagen wie ich sich die Funktion nun auf die anderen Zeilen übertragen lässt ?
Mein Makro sieht wie folgt aus:
Sub Schaltfläche1_KlickenSieAuf()
Range("T3") = (Range("S3").Value * (254 / 10))
Range("V3") = (Range("U3").Value * (254 / 10))
Range("R3") = (Range("Q3").Value * (254 / 10))
Range("O3") = (Range("N3").Value * (254 / 10))
Range("J3") = (Range("I3").Value * (254 / 10))
Range("H3") = (Range("G3").Value * (254 / 10))
Range("F3") = (Range("E3").Value * (254 / 10))
Columns("U").Hidden = True
Columns("S").Hidden = True
Columns("Q").Hidden = True
Columns("N").Hidden = True
Columns("I").Hidden = True
Columns("G").Hidden = True
Columns("E").Hidden = True
Columns("F").Hidden = False
Columns("H").Hidden = False
Columns("J").Hidden = False
Columns("O").Hidden = False
Columns("R").Hidden = False
Columns("T").Hidden = False
Columns("V").Hidden = False
End Sub
Bin für jede Antwort dankbar. PS: ist mein erstes Makro :) wäre also nett , wenn die Lösung verständlich wäre :D
5 Antworten
Auch an die restlichen VBA Experten :
Ist es möglich alles zu löschen außer Zeile 1 und 2 , sowie die Spalte W ohne das das Format verloren geht ?
Danke !
Die Aufgabe ließe sich auch eleganter lösen
(z.B. mit Celle() statt Range(), Screenupdating ausschalten etc.),
aber ich will erst mal nicht zuviel an Deinem Code "rumschrauben", um Dich nicht zu verwirren. Deshalb habe ich den "Rumpf" so gelassen und nur etwas hinzugefügt:
Sub Schaltfläche1_KlickenSieAuf()
Dim i As Integer
For i = 0 To 30
Range("T3").Offset(i, 0) = (Range("S3").Offset(i, 0).Value * (254 / 10))
Range("V3").Offset(i, 0) = (Range("U3").Offset(i, 0).Value * (254 / 10))
Range("R3").Offset(i, 0) = (Range("Q3").Offset(i, 0).Value * (254 / 10))
Range("O3").Offset(i, 0) = (Range("N3").Offset(i, 0).Value * (254 / 10))
Range("J3").Offset(i, 0) = (Range("I3").Offset(i, 0).Value * (254 / 10))
Range("H3").Offset(i, 0) = (Range("G3").Offset(i, 0).Value * (254 / 10))
Range("F3").Offset(i, 0) = (Range("E3").Offset(i, 0).Value * (254 / 10))
Next i
Columns("U").Hidden = True
Columns("S").Hidden = True
Columns("Q").Hidden = True
Columns("N").Hidden = True
Columns("I").Hidden = True
Columns("G").Hidden = True
Columns("E").Hidden = True
Columns("F").Hidden = False
Columns("H").Hidden = False
Columns("J").Hidden = False
Columns("O").Hidden = False
Columns("R").Hidden = False
Columns("T").Hidden = False
Columns("V").Hidden = False
End Sub
Klappt es?
Wenn Du noch Fragen hast, ich kann wahrscheinlich erst morgen wieder "reinschauen", aber die anderen Experten hier helfe sicherlich auch weiter,.
Fürs erste Makro kriegst Du eine Menge mildernde Umstände -und es ist schon mal immerhin richtig- , aber gewöhne Dir eine genaue Ausdrucksweise an: Zeile A gibt es nicht, nur Spalte A
Deine Zeile ist Zeile 3
Deine Datenstruktur ist etwas unhandlich mit den vielen unregelmäßigen Unterbrechungen, aber es geht: Lege die Variable Zeile an und weise ihr die Zeilennummer der ausgewählten Zelle zu: Unterhalb der Subzeile einfügen:
Dim Zeile
Zeile = Activecell.row
dann Range ("T3") ändern zu:
Range("T" & Zeile)
und das in allen Range-Objekten der Liste
Du könntest es auch ohne die Variable Zeile machen und stattdessen direkt reinschreiben:
Range("T" & activecell.row)
aber dann muss VBA jedesmal erneut die Zeile ermitteln: unnötige Prozessorarbeit
Dein Makro lässt es zu, dass, wenn du den Cursor in eine der NICHT ausgeblendeten Spalten setzt, dann bei ButtonKlick trotzdem die Operationen in dieser Zeile durchgeführt werden: Ausblenden schützt nicht davor, berechnet/in VBA benannt zu werden.
Ob es sinnvoll ist, die Spalten alle auszublenden, um sie vor der nächstenOperation dann doch wieder sehen zu wollen, sei dahingestellt. Machst Du sie schmal, (ich glaube Column(..).width = 1,5 (zB) wäre besser, es würde Dir erlauben, die Zelle anzuwählen und den Wert in der Bearbeitungszeile einzusehen.
Es kann übrigens von Vorteil sein, anstatt des Buttons von vornherein eine individuell und aussagekräftig gestaltete Autoform (oder ein Textfeld) zu nehmen und ihr das ebenfalls aussagekräftig benannte Makro zuzuweisen (Kontext-Menü!). Mit dem allgemeinen Text der Buttons wirst Du bals nicht mehr zufrieden sein. Darüberhinaus gibt es die Möglichkeit, Buttons zB mit Wingdings-Zeichen zu beschriften, die oft auch aussagekräftig sind, dass kannst Du mit einem Textfeld etc. aber auch!
Ich will es dabei belassen, der Einsatz von Bedingungen (ich denke hier an Case) und Schleifen wird noch etwas dauern, aber das ist schon mal eine gute Grundlage!
Meinst Du Zeilen 1 und 2 oder Spalten A und B?
Der Befehl heißt:
Range("A:A").Clearcontents
oder allgemeiner
Activecell.EntireColumn.ClearContents
ansonsten für ganze Zeile, zB. Rows(2:2):
ActiveCell.EntireRow.ClearContents neben Clearcontents gibt es clearFormats, clearCommentsein sinngemäßes ClearAll heißt einfach
.Clearund ganz ohne VBA: Zeilen am Zeilenkopf (da, wo das 1, 2, 3... steht) markieren und Taste Entf(ernen) bzw Del(ete) drücken. Ist schneller, ausser du willst das als Startoption fürs Makro.
Analog für Spalten (am Spaltenkopf markieren)
Mein obiger Kurzbefehl löscht natürlich gerade Spalteneinträge A bzw Zeileneinträge 2, nicht "alle ausser", wie Du wolltest. Hast du sicher bemerkt.
Willst Du alle unterhalb Zeile 2 löschen und das bis Zeile 99, dann:
Range("3:99").clearcontents
(geht auch noch anders, aber nicht zu viel am Anfang)
analog
Range("A1:V99").ClearContents: Range("X1:AC99").ClearContents
Der Doppelpunkt mit Leerzeichen danach erlaubt es, zwei Befehlszeilen aneinanderzuhängen (das ist sinvoll bei "einzeiligen If-Then" Bedingungen, bei denen kein Else kommt und die auch kein End if brauchen, zB
if A2 = "" then rows(20).width =10: Exit Sub 'Exit FOR, Goto SONST
SONST ist dabei ein Zeilenmarker, der zufällig ebenfalls mit Doppelpunkt eingetragen wird, also so
SONST:
in dieser Zeile darf dann nichts weiteres stehen
Aber jetzt bringe ich schon wieder viel mehr, als Du verdauen kannst...
Range("T3") ist Cells(3, 20), Range("S3") ist Cells(3, 19).
Du kannst damit Schleifen nehmen:
Dim spalte As Integer
For spalte = 6 To 10 Step 2 'F, H, J
Cells(3, spalte).Value = Cells(3, spalte - 1).Value * (254 / 10)
Columns(spalte).Hidden = False
Next
For spalte = 18 To 22 Step 2 'R, T, V
Cells(3, spalte).Value = Cells(3, spalte - 1).Value * (254 / 10)
Columns(spalte).Hidden = False
Next
Bemerkung: Ich finde es auch nach hunderten von Makros immer noch etwas verwirrend, dass in der Bezeichnung "B5" zuerst die Spalte und dann die Zeile genannt wird, während in Cells(5, 2) zuerst die Zeile und dann die Spalte genannt wird.
Na ja, das ist eben die Darstellungsweise, wie man sie auch in den Formeln hat. Ich hab die R1C1-Darstellungsweise lange Zeit gemieden, weil ich eben als Autodidakt von der Spreadsheet-Berechnung kam. Ausserdem nutzte ich für meine frühen Makros noch Lotus-123, und da war es immer umgekehrt: Erst die Spaltennummer, dann die Zeilennummer. DAS hängt MIR bis heute nach...
Hi, Du musst Deinen Code einfach einfach von Range("T3") =... bis ...(Range("E3").Value * (254 / 10)) kopieren und hinter ....(Range("E3").Value * (254 / 10)) einfügen. In dem duplizierten Teil ersetzt du alle "3" durch z. B. 4. dann wird Zeile 4 umgerechnet.
Vielen Dank für die schnellen Antworten , werde in Zukunft mehr mit VBA beschäftigen :) eine frage noch, ist es möglich alles auser die Zeilen A & B , sowie der Spalte W ( Ergebniszeile) zu löschen ohne das, das Format verloren geht?