Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
420to424
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
420to424
420to424
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Range für WS-Events?

Range für WS-Events?
thomas
Guten Morgen,
ich möchte, dass bei Wechsel einer Zahl im Bereich F113:P114, C118:C123, C126:C134 die untenstehenden Makros ausgeführt werden. Dieses Makro schreib ich dann aufs Tabellenblatt.
Im Archiv habe ich gesehen, dass ein mölicher Fehler sein könnte, dass ich die zweite Zeile durch
If TargetAdress = $F$113 Or TargetArdress = $F$114 etc. ersetzen muss. Den Range anzugeben wäre aber viel eleganter. Weiss jemand, wie ich mein Makro anpassen muss?
Besten Dank für Hilfe
thomas
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If TargetRange("F113:P114", "C118:C123", "C126:C134") Then Call Del Call Sort Call Preis Call Data End If End Sub
AW: Range für WS-Events?
Josef
Hallo Thomas!
Das geht so.
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If Intersect(Target, [F113:P114,C118:C123,C126:C134]) Is Nothing Then Exit Sub
Call Del
Call Sort
Call Preis
Call Data
End Sub

Gruß Sepp
Anzeige
Warum eigentlich das Option Explizit?
thomas
Hallo Sepp,
vielen Dank für die unkomplizierte Hilfe!
Zusatzfrage: Warum muss eigentlich das Option Explicit sein? Geht das auch ohne? Warum steht das nicht IM Makrocode? Schreib ich das ganz normal einfach ins TabellenBlatt-Modul oder gehört das sonstwo hin?
Wäre froh, das Option-Explicit, das mir schon oft begegnet ist, endlich zu verstehen!
Besten Dank falls du Zeit hast zu antworten!
thomas
AW: Warum eigentlich das Option Explizit?
Josef
Hallo Thomas!
Auszug aus der Onlinhilfe von VBA.

Option Explicit-Anweisung

Wird auf Modulebene verwendet, um die explizite Deklaration aller Variablen in diesem Modul zu erzwingen.
Syntax
Option Explicit
Bemerkungen
Wird die Option Explicit-Anweisung verwendet, so muß sie im jeweiligen Modul vor jeder Prozedur stehen.
Wenn Sie die Option Explicit-Anweisung in einem Modul verwenden, müssen alle Variablen explizit mit den Anweisungen Dim, Private, Public, ReDim oder Static deklariert werden. Wenn Sie einen nicht deklarierten Variablennamen verwenden, tritt zur Kompilierungszeit ein Fehler auf.
Wenn Sie die Option Explicit-Anweisung nicht verwenden, erhalten alle nichtdeklarierten Variablen den Typ Variant, solange mit einer DefTyp-Anweisung kein anderer Standardtyp festgelegt wird.
Anmerkung Mit Option Explicit vermeiden Sie falsch geschriebene Namen bereits bestehender Variablen oder Verwechslungen im Code bei unklarem Gültigkeitsbereich von Variablen.

Mit "Option Explicit" verlangt VBA also, das jede Variable
deklariert wird.
Ausserdem werden Schreibfehler bei den Variablen verhindert.
Im VBA-Editor unter &gt Extras &gt Optionen, kannst du die
Option "Variablendeklaration erfordelich" anhaken, dann
wird das "Option Explicit" automatisch an den anfang
eines Modules geschrieben!
Gruß Sepp
Anzeige
funktioniert fast, merci für Zusatztipp OptionExpl
thomas
Hall Sepp,
besten Dank; entschuldige, dass ich das nicht zuerst selbst in der Hilfe abgecheckt habe, was ich gewöhnlich schon mache.
Das Makro hab ich inzwischen eingebaut. Eigentlich funktionierts, nur wollte ich eigentliich, dass die Makros erst ausgeführt werden, wenn ein Zahl ÄNDERT. Geht es dabei dann um etwas ganz anderes, also nicht mehr um Events, oder kann man das in mein Makro einfach ergänzen? Falls es nicht mehr mit Events geht wäre ich froh für das passende Stichwort, damit ich dort mal weitersuchen kann?
thomas
Zusatzinfo für Verständnis
thomas
im Moment führts die ganzen Makros schon aus, wenn ich schonn nur in den TargetBereich klicke. Geschickter wärs, wenn die Makros nach Änderung der Zahl(en) ausgeführt werden.
Anzeige
AW: Zusatzinfo für Verständnis
Josef
Hallo Thomas!
Dann musst du den Code in Das "Change" Event schreiben!
Tipp:
Im Editorfenster findest du oben zwei Comboboxen, in der linken
Steht das Object und in der rechten die verfügbaren Events.
Gruß Sepp
Besten Dank; noch langsames Kopiermakro
thomas
Hallo,
nachdem Sepp mir gezeigt hat, wie man Events auf Worksheets definiert und dies schön funktioniert möchte ich noch wissen, wie man denn Events kurzzeitig aufheben kann (ich neme an, dass dies eine bestimmte Programmzeile ist, die man am Anfang eines Makros setzen kann). Da ich mit einem Kopiermakro Beispieldaten in die Inputfelder kopiere, die dann als Events gelten und also jedesmal die entsprechende Makros aufrufen geht jetzt das Ausführen des Kopiermakros recht lange. Ich würde dann zu Beginn des Kopiermakros das betreffende Worksheet Event ausschalten, dann die Daten reinkopieren, dann das Makro im Event einmal laufen lassen.
Besten Dank für Tipps!
thomas
Anzeige
Application.EnableEvents = False/True
Josef
Hallo Thomas!
Du liegst richtig!
Mit
Application.EnableEvents = False
am Beginn des Codes schaltest du die Events aus,
und mit
Application.EnableEvents = True
am Ende wieder ein.
Gruß Sepp
Code optimieren
Josef
Hallo Thomas!
Poste mal den Code!
Programme zum optimieren von Code gibt's für VBA nicht.
Gruß Sepp
AW: Code optimieren
Nepumuk
Hallo Sepp,
Gottseidank gibts die nicht, sonst müssten wir uns ein neues Hobby suchen.
Gruß
Nepumuk
was würden wir dann in unserer Freizeit tun?
Josef
Hallo Nepumuk!
Dann müssten wir uns in der Freizeit mit Sport
abquälen, oder gar mit unseren Frauen und Kindern beschäftigen ;-)
Gruß Sepp
Anzeige
Code schneller machen
thomas
Hallo,
hier der Code, der also immer abgearbeitet wird, wenn eine Änderung in einem Inputfeld. Ausführung in 0sec wäre optimal, bei mir dauerts ca. eine halbe Sekunde.
Besten Dank für Optimierungen

Sub SollBM()
Application.ScreenUpdating = False
Range("A328:D333, F328:K333, B340:B399").ClearContents
Range("A319:D325").Copy
Range("A327").PasteSpecial Paste:=xlPasteValues
Range("F319:K325").Copy
Range("F327").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Range("F327:K333").Sort Key1:=Range("G328"), Order1:=xlAscending, Header:=xlGuess _
, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Range("B336") = WorksheetFunction.Max(Range("B328:B333"))
Dim iZeile As Long
Dim Startwert As Long
'dito Soll-ROS
Startwert = WorksheetFunction.RoundUp(Range("B335"), 0)
iZeile = 340
Do Until Startwert > Range("B337") Or iZeile > 399
Cells(iZeile, 2) = Startwert
iZeile = iZeile + 1
Startwert = Startwert + 5
Loop
End Sub

Anzeige
AW: Code schneller machen
Josef
Hallo Thomas!
Viel gab's nicht zu verbessern!
Vieleicht bringt's aber doch was.
Option Explicit

Sub SollBM()
Dim iZeile As Long
Dim Startwert As Long
On Error GoTo FEHLER
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
Range("A328:D333, F328:K333, B340:B399").ClearContents
Range("A319:D325").Copy
Range("A327").PasteSpecial Paste:=xlPasteValues
Range("F319:K325").Copy
Range("F327").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Range("F327:K333").Sort Key1:=Range("G328"), Order1:=xlAscending, Header:=xlGuess _
, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Range("B336") = WorksheetFunction.Max(Range("B328:B333"))
'dito Soll-ROS
Startwert = WorksheetFunction.RoundUp(Range("B335"), 0)
iZeile = 340
Do Until Startwert > Range("B337") Or iZeile > 399
Cells(iZeile, 2) = Startwert
iZeile = iZeile + 1
Startwert = Startwert + 5
Loop
FEHLER:
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.Calculate
End With
End Sub

Gruß Sepp
Anzeige
AW: Code schneller machen zum 2.
thomas
Hallo,
viel hats nicht gebracht, vielleicht so eine Zentelsekunde. In prozentualer Verbesserung ausgedrückt ist das aber schon allerhand. Vielen Dank.
hätt da noch so en Code zum schneller machen - aber nur falls jemand grad Lust und Zeit. Dieses Makro wird nur selten aufgerufen, daher ist nicht so schlimm. Aktuelle Rechenzeit ca. 2-3 Sekunden.
Beste Grüsse
thomas

Private Sub CommandButton2_Click()
Application.ScreenUpdating = False
'Damit die generierten Absatz-Preis-Kombinationen in die Modelle kopiert werden. je nach Anzahl Szen
Application.EnableEvents = False
Dim ws As Worksheet
Set ws = Sheets("Grafdata")
With Sheets("Erfolgssens.-Analyse BM")
If Sheets("Start").ComboBox1.ListIndex = 5 Then
'Für BE-Modell
.Range("F47") = ws.Range("F52")
.Range("F48") = ws.Range("F53")
.Range("H47") = ws.Range("H52")
.Range("H48") = ws.Range("H53")
.Range("J47") = ws.Range("J52")
.Range("J48") = ws.Range("J53")
.Range("L47") = ws.Range("L52")
.Range("L48") = ws.Range("L53")
.Range("N47") = ws.Range("N52")
.Range("N48") = ws.Range("N53")
.Range("P47") = ws.Range("P52")
.Range("P48") = ws.Range("P53")
'Für Soll-Gewinn-Modell
.Range("F80") = ws.Range("F52")
.Range("F81") = ws.Range("F53")
.Range("H80") = ws.Range("H52")
.Range("H81") = ws.Range("H53")
.Range("J80") = ws.Range("J52")
.Range("J81") = ws.Range("J53")
.Range("L80") = ws.Range("L52")
.Range("L81") = ws.Range("L53")
.Range("N80") = ws.Range("N52")
.Range("N81") = ws.Range("N53")
.Range("P80") = ws.Range("P52")
.Range("P81") = ws.Range("P53")
.Range("F72") = ws.Range("J61")
'für Soll-ROS-Modell
.Range("F113") = ws.Range("F52")
.Range("F114") = ws.Range("F53")
.Range("H113") = ws.Range("H52")
.Range("H114") = ws.Range("H53")
.Range("J113") = ws.Range("J52")
.Range("J114") = ws.Range("J53")
.Range("L113") = ws.Range("L52")
.Range("L114") = ws.Range("L53")
.Range("N113") = ws.Range("N52")
.Range("N114") = ws.Range("N53")
.Range("P113") = ws.Range("P52")
.Range("P114") = ws.Range("P53")
.Range("F105") = ws.Range("J63")
ElseIf Sheets("Start").ComboBox1.ListIndex = 4 Then
'Für BE-Modell
.Range("F47") = ws.Range("F52")
.Range("F48") = ws.Range("F53")
.Range("H47") = ws.Range("H52")
.Range("H48") = ws.Range("H53")
.Range("J47") = ws.Range("J52")
.Range("J48") = ws.Range("J53")
.Range("L47") = ws.Range("L52")
.Range("L48") = ws.Range("L53")
.Range("N47") = ws.Range("N52")
.Range("N48") = ws.Range("N53")
'Für Soll Gewinn
.Range("F80") = ws.Range("F52")
.Range("F81") = ws.Range("F53")
.Range("H80") = ws.Range("H52")
.Range("H81") = ws.Range("H53")
.Range("J80") = ws.Range("J52")
.Range("J81") = ws.Range("J53")
.Range("L80") = ws.Range("L52")
.Range("L81") = ws.Range("L53")
.Range("N80") = ws.Range("N52")
.Range("N81") = ws.Range("N53")
.Range("F72") = ws.Range("J61")
'für Soll-ROS-Modell
.Range("F113") = ws.Range("F52")
.Range("F114") = ws.Range("F53")
.Range("H113") = ws.Range("H52")
.Range("H114") = ws.Range("H53")
.Range("J113") = ws.Range("J52")
.Range("J114") = ws.Range("J53")
.Range("L113") = ws.Range("L52")
.Range("L114") = ws.Range("L53")
.Range("N113") = ws.Range("N52")
.Range("N114") = ws.Range("N53")
.Range("F105") = ws.Range("J63")
ElseIf Sheets("Start").ComboBox1.ListIndex = 3 Then
'Für BE-Modell
.Range("F47") = ws.Range("F52")
.Range("F48") = ws.Range("F53")
.Range("H47") = ws.Range("H52")
.Range("H48") = ws.Range("H53")
.Range("J47") = ws.Range("J52")
.Range("J48") = ws.Range("J53")
.Range("L47") = ws.Range("L52")
.Range("L48") = ws.Range("L53")
'Für Soll-Gewinn-Modell
.Range("F80") = ws.Range("F52")
.Range("F81") = ws.Range("F53")
.Range("H80") = ws.Range("H52")
.Range("H81") = ws.Range("H53")
.Range("J80") = ws.Range("J52")
.Range("J81") = ws.Range("J53")
.Range("L80") = ws.Range("L52")
.Range("L81") = ws.Range("L53")
.Range("F72") = ws.Range("J61")
'für Soll-ROS-Modell
.Range("F113") = ws.Range("F52")
.Range("F114") = ws.Range("F53")
.Range("H113") = ws.Range("H52")
.Range("H114") = ws.Range("H53")
.Range("J113") = ws.Range("J52")
.Range("J114") = ws.Range("J53")
.Range("L113") = ws.Range("L52")
.Range("L114") = ws.Range("L53")
.Range("F105") = ws.Range("J63")
ElseIf Sheets("Start").ComboBox1.ListIndex = 2 Then
'Für BE-Modell
.Range("F47") = ws.Range("F52")
.Range("F48") = ws.Range("F53")
.Range("H47") = ws.Range("H52")
.Range("H48") = ws.Range("H53")
.Range("J47") = ws.Range("J52")
.Range("J48") = ws.Range("J53")
'Für Soll-Gewinn-Modell
.Range("F80") = ws.Range("F52")
.Range("F81") = ws.Range("F53")
.Range("H80") = ws.Range("H52")
.Range("H81") = ws.Range("H53")
.Range("J80") = ws.Range("J52")
.Range("J81") = ws.Range("J53")
.Range("F72") = ws.Range("J61")
'für Soll-ROS-Modell
.Range("F113") = ws.Range("F52")
.Range("F114") = ws.Range("F53")
.Range("H113") = ws.Range("H52")
.Range("H114") = ws.Range("H53")
.Range("J113") = ws.Range("J52")
.Range("J114") = ws.Range("J53")
.Range("F105") = ws.Range("J63")
ElseIf Sheets("Start").ComboBox1.ListIndex = 1 Then
'Für BE-Modell
.Range("F47") = ws.Range("F52")
.Range("F48") = ws.Range("F53")
.Range("H47") = ws.Range("H52")
.Range("H48") = ws.Range("H53")
'Für Soll-Gewinn-Modell
.Range("F80") = ws.Range("F52")
.Range("F81") = ws.Range("F53")
.Range("H80") = ws.Range("H52")
.Range("H81") = ws.Range("H53")
.Range("F72") = ws.Range("J61")
'für Soll-ROS-Modell
.Range("F113") = ws.Range("F52")
.Range("F114") = ws.Range("F53")
.Range("H113") = ws.Range("H52")
.Range("H114") = ws.Range("H53")
.Range("F105") = ws.Range("J63")
ElseIf Sheets("Start").ComboBox1.ListIndex = 0 Then
'Für BE-Modell
.Range("F47") = ws.Range("F52")
.Range("F48") = ws.Range("F53")
'Für Soll-Gewinn-Modell
.Range("F80") = ws.Range("F52")
.Range("F81") = ws.Range("F53")
.Range("F72") = ws.Range("J61")
'für Soll-ROS-Modell
.Range("F113") = ws.Range("F52")
.Range("F114") = ws.Range("F53")
.Range("F105") = ws.Range("J63")
End If
End With
Call Sheets("Grafdata").SollBM
Application.EnableEvents = True
End Sub

Anzeige
AW: Code schneller machen zum 2.
Ramses
Hallo
hier einen Ansatz:
Anstelle von
.Range("F47") = ws.Range("F52")
.Range("F48") = ws.Range("F53")
.Range("H47") = ws.Range("H52")
.Range("H48") = ws.Range("H53")
.Range("J47") = ws.Range("J52")
.Range("J48") = ws.Range("J53")
.Range("L47") = ws.Range("L52")
.Range("L48") = ws.Range("L53")
.Range("N47") = ws.Range("N52")
.Range("N48") = ws.Range("N53")
.Range("P47") = ws.Range("P52")
.Range("P48") = ws.Range("P53")
kannst du auch schreiben
.Range("F47:P48") = ws.Range("F52:P53")
Den Rest kannst du ja sicher anpassen
Gruss Rainer
Anzeige
Schön, vielen Dank Ramses!
02.05.2004 11:51:49
thomas
Hallo Ramses,
das ist wirklich einfacher so, mal probieren obs klappt. Vielen Dank!
Beste Grüsse
thomas

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige