Visual Basic Makro auf weitere Zeilen anwenden?

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,.

Woher ich das weiß:Berufserfahrung – IT-Administrator (i.R.)

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!



JohnSmith1990 
Beitragsersteller
 26.06.2015, 12:35

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?

Iamiam  26.06.2015, 12:55
@JohnSmith1990

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, clearComments

ein sinngemäßes ClearAll heißt einfach

.Clear
Iamiam  26.06.2015, 22:33
@Iamiam

und 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
Woher ich das weiß:Berufserfahrung – Software-Entwickler

PWolff  26.06.2015, 12:30

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.

Iamiam  26.06.2015, 12:42
@PWolff

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.