Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema CommandButton
BildScreenshot zu CommandButton CommandButton-Seite mit Beispielarbeitsmappe aufrufen

calculate und change | Herbers Excel-Forum


Betrifft: calculate und change von: Jörg-HH
Geschrieben am: 02.02.2012 22:25:23

Hallo zusammen

wenn ich richtig verstanden habe, läuft bei einer Eingabe vor dem Change-Ereignis noch das _ Calculate-Ereignis ab. Ich möchte nun das Calculate unterdrücken, wenn in einem bestimmten Bereich etwas eingegeben wird. Das hatte ich mir so gedacht:

Private Sub Worksheet_Calculate()

Dim Target As Range

If Not Intersect(Target, Me.Range("KdVorgaben")) Is Nothing Then
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Application.EnableEvents = False
End If
End Sub
Aber VBA hat eine andere Meinung und nennt das immer einen ungültigen ProzAufruf. Kann mir jemand sagen, was daran falsch ist?

Grüße - Jörg

  

Betrifft: AW: calculate und change von: MatthiasG
Geschrieben am: 02.02.2012 23:27:16

Hallo Jörg,

leider hat Worksheet_Calculate() kein Target-Argument, du kannst es also auch nicht abfragen, selbst wenn du es mit Dim Target As Range deklarierst.

Gruß Matthias


  

Betrifft: hmm... schade :-( Danke! oT von: Jörg-HH
Geschrieben am: 02.02.2012 23:43:56




  

Betrifft: AW: evtl geht es doch. von: fcs
Geschrieben am: 03.02.2012 02:32:29

Halo Jörg,

du kannst über die Zellselektion den Berechnungsmodus umschalten.

Wenn eine Zelle im Bereich selektiert wird, dann Berechnen auf manual setzen, außerhalb auf automatisch.

Gruß
Franz

  'Code im Tabellenmodul
 
 Private Sub Worksheet_Calculate()
    MsgBox "I am Worksheets_Calculation"  'Testzeile
 End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If Intersect(Target, Me.Range("KdVorgaben")) Is Nothing Then
   Application.Calculation = xlCalculationAutomatic
 Else
   Application.Calculation = xlCalculationManual
 End If
End Sub



  

Betrifft: Das ist auch die einzige Möglichkeit, aber ... von: Luc:-?
Geschrieben am: 03.02.2012 04:20:29

…wenn wieder zurückgeschaltet wird, wdn doch alle Änderungen neu berechnet, Franz & Jörg!
Das Calculate-Ereignis wird übrigens erst ausgelöst, wenn sämtliche Berechnungen durch sind. Deshalb kann es da auch kein Target geben → wäre sinnlos. Ein Eintrag eines Target als Prozedur-Parameter dürfte zu einem Fehler führen, weil VBA das nicht als originär anerkennt,; evtl ignoriert es VBA hier aber auch, weil kein Parameter vorgesehen ist.
Gruß Luc :-?


  

Betrifft: AW: Das ist auch die einzige Möglichkeit, aber ... von: fcs
Geschrieben am: 03.02.2012 09:29:52

Hallo Luc, hallo Jörg,

man könnte den Ablauf auch steuern, indem man eine Private- oder Public-Variable mit mit Daten füllt, die in der Calculate-Ereignisprozedur geprüft wird. Bei bestimmten Werten wird die Ereignisprozedur sofort wieder verlassen.

Das Problem ist hier, wie schon bei meinem Vorschlag, ein passendes Ereignis zu wählen um die Berechnung wieder zu starten. Der konsequenteste Weg ist hier das bewußte Freischalten z.B. per Buttonklick, dann könnte man ggf. sogar die Ereignismakros vorübergehend abschalten.

Über die Zwischenvariable könnte man auch die Target-Variable der Worksheet_Selection-Ereignis-Prozedur verarbeiten. Aber das zurücksetzen der Variablen muss halt irgendwie geregelt werden.

Gruß
Franz

Beispiel:

'Code in Tabellenblatt-Modul
Option Explicit

Private rngEingabe As Range

Private Sub CommandButton1_Click()
  'Aktiviert Berechnung und Ereignisse wieder
  Reset_Calculation
End Sub

Private Sub Worksheet_Calculate()
  If Not rngEingabe Is Nothing Then Exit Sub
  MsgBox "Calculate-Ereignis wird abgearbeitet"
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If rngEingabe Is Nothing _
      And Not Intersect(Target, Me.Range("KdVorgaben")) Is Nothing Then
    'Application.EnableEvents = False
    Set rngEingabe = Target
    Application.Calculation = xlCalculationManual
  End If
  
  If Target.Address = "$B$3" Then
    'Eingabe beenden durch Selektion der Zelle B3 - funktioniert nur wenn Ereignsmakros _
      nicht deaktiviert werden
    Reset_Calculation
  End If
End Sub

'Dieses Makro z.B per Schaltfläche oder mit Selektion einer _
    bestimmten Zelle starten
Sub Reset_Calculation()
  'Application.EnableEvents = True
  Set rngEingabe = Nothing
  Application.Calculation = xlCalculationAutomatic
End Sub



Beiträge aus den Excel-Beispielen zum Thema "calculate und change"