Anzeige
Archiv - Navigation
1900to1904
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 ist wohl zu langsam

Makro ist wohl zu langsam
17.10.2022 10:34:32
Eleftherios
Hallo zusammen,
ich habe in einer Tabelle die Fix 24 Zeilen + Kopfzeile hat für die letzten 2 Spalten folgendes Makro laufen.
Allerdings habe ich es nur auf die erste Zeile geschafft.
Kann mir jemand erklären wie ich das Makro auf die jeweils gesamte Spalte übertragen kann?
Hier das Makro:

Private Sub Worksheet_Change(ByVal Target As Range)
Call ws_Unprotect("Kasseneingabe")
'=mwst% * VkBrutto / (1+ mwst%)*Menge
If Not Intersect(Target, Range("M15,L15")) Is Nothing Then Range("O15").Value = Round([N15] * [M15] / (1 + [N15]) * [L15], 2)
'Einzelpreis * Menge
If Not Intersect(Target, Range("L15,M15")) Is Nothing Then Range("P15").Value = [M15] * [L15]
Call ws_Protect("Kasseneingabe")
End Sub
Schon mal vielen Dank im Voraus
VG Lefty

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Makro auf Spalte anwenden
17.10.2022 10:35:27
Eleftherios
sry falscher Titel^^
AW: Makro auf Spalte anwenden
17.10.2022 11:05:41
GerdL
Hallo Lefti,
ungetestet.

Private Sub Worksheet_Change(ByVal Target As Range)
Call ws_Unprotect("Kasseneingabe")
If Target.CountLarge = 1 Then                                                                                 '=mwst% * VkBrutto / (1+ mwst%)*Menge
Application.EnableEvents = False
If Not Intersect(Target, Range("M2:M25,L2:L25")) Is Nothing Then Range("O" & Target.Row).Value = Round(Range("N" & Target.Row) * Range("M" & Target.Row) / (1 + Range("N" & Target.Row)) * Range("L" & Target.Row), 2)
'Einzelpreis * Menge
If Not Intersect(Target, Range("M2:M25,L2:L25")) Is Nothing Then Range("P" & Target.Row).Value = Range("M" & Target.Row) * Range("L" & Target.Row)
Application.EnableEvents = True
End If
Call ws_Protect("Kasseneingabe")
End Sub
Gruß Gerd
Anzeige
AW: Makro auf Spalte anwenden
17.10.2022 11:20:13
Eleftherios
Hallo Gerd,
funktioniert auch getestet, vielen Dank dafür.
Eine Frage hätte ich aber noch, bei meinen versuchen habe ich versucht die Spalten per Namen anzusprechen z.B. [TabellenName[SpaltenName]], bin da aber nicht weiter gekommen. Ist das auch eine Möglichkeit?
VG Lefty
AW: Makro auf Spalte anwenden
17.10.2022 11:38:14
Daniel
Hi

Intersect([TabellenName[SpaltenName]], Target.EntireRow)
wäre eine Möglichkeit.
Theoretisch denkbar wär auch

[TabellenName[@SpaltenName]]
allerdings referenziert das auf die Zeile der aktiven Zelle und diese kann im Change_Makro eine andere sein als Target (Zelle mit Maus, Cursor oder Tab verlassen, Automatisches Verschieben nach Enter aktiviert), daher scheidet diese elegante Möglichkeit aus.
Gruß Daniel
Anzeige
AW: Makro auf Spalte anwenden
17.10.2022 11:59:00
Eleftherios
Hey Daniel,
danke für die Antwort.
Habe das mal ausprobiert aber sicherlich fehlen noch irgendwelche Klammern, Kommas oder sonstige Zeiche ;D

     If Not Intersect([Tab_KasseneingabeVoll[Einzelpreis]], [Tab_KasseneingabeVoll[Menge]], Target.EntireRow) Is Nothing Then [Tab_KasseneingabeVoll[Gesamt]] = [Tab_KasseneingabeVoll[Einzelpreis]] * [Tab_KasseneingabeVoll[Menge]]
Ich denke mal der Fehler hier liegt bei

Intersect([Tab_KasseneingabeVoll[Einzelpreis]], [Tab_KasseneingabeVoll[Menge]], Target.EntireRow)

Anzeige
AW: Makro auf Spalte anwenden
17.10.2022 12:29:03
Daniel
Hi
da hast du mich falsch verstanden.
das mit dem Intersect([SpalteX], Target.EntireRow) ist nachher für die Berechnung.
für die Prüfung, ob in Spalte A oder in Spalte B was geändert wurde, musst du das so schrieben:

if not Intersect(Union([SpalteA], [Spalte]), Target) is Nothing then
Gruß Daniel
AW: Makro auf Spalte anwenden
17.10.2022 13:31:01
Eleftherios
Danke Daniel,
ich verstehe zwar die Logik dahinter aber ich bekomme es mit meinem jetzigen Kenntnisstand nicht in Code-Form geschrieben. Ich werde mich die Tage mal etwas mehr damit beschäftigen.
Danke und VG
Lefty
Anzeige
AW: Auf Listobject-Spalte anwenden
17.10.2022 11:40:48
GerdL
Ich breche mir bei den intelligenten-formatierten-definierten Tabellchen immer die Finger ab.
Deshalb spreche ich diese zur Schonung meiner Finger z.B. mit Tabelle("X").Listobjects(1).Columns(3)
an.
Stelle mal auf offen - für alle.
Gruß Gerd
AW: Auf Listobject-Spalte anwenden
17.10.2022 11:55:24
Eleftherios
Das Problem mit dem Fingerabbrechen kann ich nachvollziehen^^.
Wie ist es dann bei den Berechnungen? Muss ich dann für jede Zelle Tabelle("X").Listobjects(1).Columns(3) eingeben?
AW: Auf Listobject-Spalte anwenden
17.10.2022 20:03:07
Yal
Hallo Lefty,
der Weg über die Schreibweise [Tab_KasseneingabeVoll[Einzelpreis]] ist innerhalb von VBA nicht machbar. Denn VBA wird nur "Target" übergeben. Und diese weisst nichts von der aktive Tabellen Tab_KasseneingabeVoll.
Eine einfache Form könnte wie folgt sein:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim M, N, L
If Target.Cells.Count > 1 Then Exit Sub 'Verarbeitung, nur wenn nur eine Zelle auf einmal geändert wurde
Call ws_Unprotect("Kasseneingabe")
Application.EnableEvents = False
Select Case Target.Range("A1").Column
Case 12, 13, 14 'Spalten L, M oder N
L = Cells(Target.Row, "L").Value
M = Cells(Target.Row, "M").Value
N = Cells(Target.Row, "N").Value
'=mwst% * VkBrutto / (1+ mwst%)*Menge
Cells(Target.Row, "O") = Round(N * M * L / (1 + N), 2)
'Einzelpreis * Menge
Cells(Target.Row, "P") = M * L
End Select
Application.EnableEvents = True
Call ws_Protect("Kasseneingabe")
End Sub
Wenn man unbedingt die Spaltennamen der aktiven Tabelle verwenden, dann so:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim M, N, L
With Range("Tab_KasseneingabeVoll").Parent.ListObjects("Tab_KasseneingabeVoll")
If Target.Cells.Count > 1 Then Exit Sub 'Verarbeitung, nur wenn nur eine Zelle auf einmal geändert wurde
Call ws_Unprotect("Kasseneingabe")
Application.EnableEvents = False
Select Case Target.Range("A1").Column
Case 12, 13, 14 'Spalten L, M oder N
L = Cells(Target.Row, .ListColumns("Menge").Range.Column).Value
M = Cells(Target.Row, .ListColumns("Einzelpreis").Range.Column).Value
N = Cells(Target.Row, .ListColumns("MwST").Range.Column).Value
'=mwst% * VkBrutto * Menge / (1+ mwst%)
Cells(Target.Row, "O") = Round(N * M * L / (1 + N), 2)
'Einzelpreis * Menge
Cells(Target.Row, "P") = M * L
End Select
Application.EnableEvents = True
Call ws_Protect("Kasseneingabe")
End With
End Sub
Ob es "besser" ist, lasse ich offen.
So könntest Du auch "O" und "P" umstellen.
Vergiss auf alle Fälle den Application.EnableEvents = False nicht: Du machst eine Änderung an einer Zelle, was der Change-Event auslöst (wenn Enabled!)
VG
Yal
Anzeige
AW: Auf Listobject-Spalte anwenden
18.10.2022 09:16:08
Eleftherios
Hallo Yal,
mich fasziniert immer wieder wieviel verschiedene Wege zum Ziel führen können.
Vom Makrorecorder bis hin zu so was elegantem wie bei dir hier.
Die Spaltennamen, so dachte ich, hätten eventuell den Vorteil, gerade bei Rechenformeln, der Übersichtlichkeit.
Ich Danke dir für die Hilfe und vor allem auch für die Erklärungen.
VG Lefty

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige