Microsoft Excel

Herbers Excel/VBA-Archiv

Worksheet_Activate() / Worksheet_Change()

Betrifft: Worksheet_Activate() / Worksheet_Change() von: Uwe Siebers
Geschrieben am: 18.04.2008 17:50:56

Hallo!

Einmal mehr gibt`s Probleme. Bei einem inzwischen aufwendigen Programm gilt es, eine Vielzahl von Berechnungen durchzuführen. Derzeit geschieht das, sobald das Tabellenblatt aufgefrufen wird. [Worksheet_Activate()] Soweit so schlecht...

Zwingend notwendig ist`s jedoch, diese Berechnungen bereits bei Änderungen im Tabellenblatt durchzuführen. [Worksheet_Change()] So ich das jedoch versuche, geht`s schief. Beispielhaft hierzu einfach mal meine Absicht, Daten aus der Zelle C9 in die Zelle AQ9 zu übertragen:




Private Sub Worksheet_Change(ByVal Target As Range)
Range("C9").Copy Destination:=Range("AQ9")
End Sub



Die Anwendung soll sowohl unter Excel 2003 als auch unter Excel 2007 lauffähig sein. Bisher scheiterte jeglicher "Versuch" daran, das z.B. Excel 2007

schlicht nicht mehr reagiert, sobald ich das betreffende Tabellenblatt aufrufe, geschweige denn ändere.

Wo liegt der Fehler? Ich denke mal, das die ein oder andere Anweisung (ByVal Target As Range) nicht richtig ist... Für Hinweise, gar des "Rätsels Lösung" bin ich natürlich dankbar.

Darüber hinaus gibt`s in diesem Zusammenhang das zweite Problem. Die beschriebenen Berechnungen sollen für bis zu 50 Tabellenblätter, immer dem gleichen

Muster entsprechend, möglich sein. Ist es dazu zwingend erforderlich in jedes dieser Blätter den dann funktionierende Code zu kopieren? Spare ich mir denn

nicht (Speicher)platz so ich z.B. folgendes hinbekomme:




Private Sub Worksheet_Change(ByVal Target As Range)
Call VKS
End Sub



VKS dann in einem einzigen Modul für alle betroffenen Blätter hinterlegt, z.B.:

Sub VKS()
Dim Stunden As Date
Stunden = Range("A1").Value
Range("B1").Value = TimeSerial(Hour(Stunden) - (Minute(Stunden) >= 30), 0, 0)
End Sub



Dieser beabsichtigte "Verweis" von einem Private Sub an ein Sub funktioniert bisher nun so gar nicht...

Na, auch hier gilt "für sachdienliche Hinweise", äh, für des Rätsels Lösung sage ich schon mal hier schlicht daaanke!!!

Das soll`s dann aber gewesen sein.

Gruß und BESTEN Dank für Eure Mühe

Uwe

  

Betrifft: AW: Worksheet_Activate() / Worksheet_Change() von: Erich G.
Geschrieben am: 18.04.2008 18:17:10

Hallo Uwe,

zu Problem 1:
Deine Change-Ereignis-Routine ändert eine Zelle des Blattes.
Dadurch wird die Change-Routine aufgerufen. Die ändert eine Zelle ...

Dieses Abtauchen in eine Endlosschleife kannst du vermeiden mit

Private Sub Worksheet_Change(ByVal Target As Range)
   Application.EnableEvents = False
   Range("C9").Copy Destination:=Range("AQ9")
   Application.EnableEvents = True
End Sub

Zu Problem 2:
Wo steht die Routine VKS? Sie gehört in ein allgemeines Modul.
Schau dir doch auch mal die Ereignisprozedur Workbook_SheetChange an.
Wenn du hier im Archiv nach Workbook_SheetChange suchst, findest du sicher viele Beispiele.

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort


  

Betrifft: AW: Worksheet_Activate() / Worksheet_Change() von: Uwe Siebers
Geschrieben am: 18.04.2008 21:15:54

Hallo Erich,



Dir einmal mehr BESTEN DANK für Deine Hilfe. Aber...



Leider bietet mir Dein Vorschlag zwar die Möglichkeit, all meine Berechnungen unter Worksheet_Change() unterzubringen, ohne das Excel sich verabschiedet, jedoch wir der Aufruf des Tabellenblattes zur regelrechten Prozedur!!! Der Zugriff dauert im Durchschnitt 20 Sekunden. Und das bereits, wenn ich die Zellen AR9:AR39 derart ändern lassen möchte. Die Berechnung an sich ist dann wieder ruck zuck möglich. (nicht nachzuvollziehen von der Zeit her) Bleibt mir hier die Frage, wie ich den Aufruf der Tabelle wieder so wie gewünscht hinbekomme. (Ohne Eintragung unter Worksheet_Change() geht`s schnellerr als ein Wimpernschlag...) Aber bestimmt findet sich auch da der Grund, wieso, weshalb, warum???



Die Routine VKS steht in der Tat in einem allgemeinen Modul. Und damit eigentlich da, wo sie hingehört. Nur funktioniert der "Verweis" eben bisher nicht. Mal seh`n was mir da die Recherche zu Workbook_SheetChange bringt.



Wäre aber trotzdem nett, so Du mir bei den ein, zwei Fragen, die ich noch habe auch weiterhin zur Seite stehst. Gerne ebenso via Mai. Die dann doch bitte an uwe.siebers@online.de



Und jetzt? Na ganz einfach...



Erst einmal BESTEN Dank für Deine Hilfe, Deine Mühe



Uwe, Kleve (jetzt nicht sonnig, sondern dunkel)



PS: Die Hilfe brauchte ich wirklich DRINGEND, da (m)eine super gute Anwendung insgesamt kurz vor der Fertigstellung steht und in einem Betrieb mit 23 betroffenen Mitarbeitern zum Einsatz kommen soll. Das mit Wirkung zum 01.06.08


  

Betrifft: AW: Worksheet_Activate() / Worksheet_Change() von: Reinhard
Geschrieben am: 18.04.2008 21:48:18

Hi Uwe,

biste sicher daß du willst daß jeder weltweit deine Emailadrsse auch in 10 jahren noch lesen kann und dich anmailen soll?

Probiers mal so, beim If legste fest bei welchen Blättern nichts geschehen soll:

In "DieseArbeitsmappe":

Option Explicit
'
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "DiesesBlattNicht" Or Sh.Name = "DiesesBlattNicht2" Then Exit Sub
Call VKS(Sh.Name)
End Sub

In Modul1:

Sub VKS(Blattname)
Dim Stunden As Date
Application.EnableEvents = False
Stunden = Worksheets(Blattname).Range("A1").Value
Worksheets(Blattname).Range("B1").Value = TimeSerial(Hour(Stunden) - (Minute(Stunden) >= 30), 0, _
 0)
Application.EnableEvents = True
End Sub

Gruß
Reinhard


  

Betrifft: AW: Worksheet_Change() von: Erich G.
Geschrieben am: 19.04.2008 09:23:44

Hi Uwe,
so ganz verstehe ich nicht, was du schreibst.

"Der Zugriff dauert im Durchschnitt 20 Sekunden." Was meinst du mit "Zugriff"?

"Die Berechnung an sich ist dann wieder ruck zuck möglich." Was also dauert da lange?
Die Ursache muss wohl woanders liegen.

Wenn VKS in einem allgemeinen Modul steht, sollte der Aufruf unkompliziert funzen.
Was bedeutet "Nur funktioniert der "Verweis" eben bisher nicht"? Was passiert?
Gibt es eine Fehlermeldung?

Wenn du willst, kannst du mir deine Mappe mal schicken.
Meine Mailadresse findest du (wegen Spam etwas verklausuliert) unter
Forums-Seiten - Profile - Profilliste

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort