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

Neuberechnung von selbsterstellten Funktionen

Neuberechnung von selbsterstellten Funktionen
22.06.2006 15:09:27
selbsterstellten
Hallo zusammen
Ich habe folgendes Problem:
Jede Zeile in Spalte A ruft mit =myfunc(B#) eine eigene Funktion (Code siehe weiter unten. Die Funktion wandelt die Zahl in der Spalte B in eine Hexadezimalzahl um). # entspricht dabei der jeweiligen Zeilennummer, also in A1 steht =myfunc(B1)
Bis jetzt funktionierte das auch immer. Nun wollte ich die Spalte A pseudo-sperren (richtiges sperren geht durch andere Funktionen, die ich noch benötige, nicht). Dazu habe ich im Worksheet_Change überprüft, ob was in Spalte A geändert wurde und wenn ja, schreibe ich die Formel wieder rein.
Dann kommt für etwa eine Sekunde das richtige Ergebnis in der jeweiligen Zelle, aber dann erscheint da nur noch "#WERT!". Sobald ich aber per CTRL-ALT-F9 alles neu berechne, steht wieder das Richtige drin.
Wie kann ich machen, dass das von Anfang an schon richtig ist? application.Calculate habe ich versucht, aber es macht damit ziemlich nichts..
Die Funktion (myfunct):
Public Function myfunc(mystring As String)
If Len(mystring) = 0 Then
myfunc = 0
ElseIf Len(mystring) = 1 Then
If mystring >= "0" And mystring myfunc = Asc(mystring) - 48
ElseIf mystring >= "A" And mystring myfunc = Asc(mystring) - 65 + 10
Else
myfunc = 0
End If
Else
myfunc = myfunc(Right(mystring, 1)) + 16 * myfunc(Left(mystring, Len(mystring) - 1))
End If
End Function
Im "Tabelle1":

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Target.Formula = "=myfunc(B" & CStr(Target.Row) & ")"
Application.Calculate
End If
End Sub

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Neuberechnung von selbsterstellten Funktionen
22.06.2006 15:40:21
selbsterstellten
Hallo David,
dadurch, dass du die Formel in Spalte A per Makro änderst wird das Change-Ereignis immer wieder Ausgelöst und Excel gerät in eine Endlosschleife, die nach vielen Durchläufen abgebrochen wird, wobei Excel aber dann den Fehlerwert in der Zelle anzeigt.
Passe das Tabellen-Makro wie folgt an, dann kommt es nicht zu einer Endlosschleife.

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Column = 1 Then
Target.Formula = "=myfunc(B" & CStr(Target.Row) & ")"
Application.Calculate
End If
Application.EnableEvents = True
End Sub

mfg
Franz
Anzeige
AW: Neuberechnung von selbsterstellten Funktionen
22.06.2006 15:55:33
selbsterstellten
Danke, das klappt wunderbar!
Nur noch eine kleine Frage: Dieses Excelsheet hat ca. 4000 Zeilen. Darum dauert es immer mehrere Sekunden, bis dieses Neuberechnen durchgelaufen ist. Bei der Fehlersuche vorher sah ich, dass man das Calculate auch nur auf eine bestimmte Zelle anwenden kann (bei mir Target.Calculate). Das würde es ungemein verschnellern. Aber Excel tut nun selbständig eine Komplettneuberechnung durchführen. Gibt es etwas wie "Application.EnableEvents = False" auch für das Neuberechnungs-Event?
Dann könnte ich sowas machen:
Application.EnableEvents = False
If Target.Column = 1 Then
Application.Recalculate = False &lt---
Target.FormulaLocal = "=myfunc(B" & CStr(Target.Row) & ")"
Application.Recalculate = True &lt---
Target.Calculate
End If
Application.EnableEvents = True
Anzeige
AW: Neuberechnung von selbsterstellten Funktionen
22.06.2006 17:41:35
selbsterstellten
Das Problem liegt nicht an diesem Makro, denn hier wird immer nur die eine Zelle bearbeitet. Das
Target.Calculate
kannst du weglassen, bei Eingabe in Zellen werden diese immer neu berechnet.
Wahrscheinlich müssen in deiner Tabelle bei Änderung einer Zelle in Spalte A sehr viele Zellen in der Tabelle neu Berechnet werden.
Wenn dich lange Berechnungszeiten stören, dann kannst du das Automatische Berechnen unter Extras-Optionen-Berechnen abschalten und bei Bedarf die Tabellen mit Taste F9 neu berechnen lassen.
Die entsprechenden VBA-Befehle sind:
Application.Calculation = xlManual
Application.Calculation = xlCalculationAutomatic
Anzeige
AW: Neuberechnung von selbsterstellten Funktionen
23.06.2006 07:22:03
selbsterstellten
Danke, aber das ist keine Lösung, da ich nicht der einzige bin, der das xls verwendet. also müsste man das bei allen ändern. Ich könnte es zwar bei Excelstart auf xlManual setzen und beim beenden zurück auf xlCalculationAutomatic, aber falls mal das Excel abstürzen solle, bleibt das wohl gesetzt und die Leute stehen vor unausgerechneten Formeln in anderen Tabellen. Ausserdem müsste ich dann bei jeder Änderung in Spalte A manuell neu berechnen (im Code), was das ganze wieder hinfällig machen würde.
Danke dennoch. Muss ich wohl mit den paar Sekunden berechnen leben ;)

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige