Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1156to1160
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

Calculate auf einzelnes Tabellenblatt

Calculate auf einzelnes Tabellenblatt
Roland
Hallo VBA-Profis
Ausgangslage:
Ich habe in einer Mappe mehrere Tabellenblätter, die ich mehrsprachig führen möchte. Bis jetzt habe ich alles über Sverweis gelöst (wird mit der Zeit unübersichtlich und ist schwierig für Änderungen) , und den VBA-Teil über eine Sprachtabelle mit unten stehender Funktion.
Nun möchte ich diese Funktion auch in den Tabellenblättern verwenden, was eigentlich auch funktioniert.
Wenn ich aber nun die Sprache ändere (global für allle Blätter) muss ich ja gezwungenermassen das Tabellenblatt beim öffnen neu berechnen, da ich ja in den Zellen nichts direkt verändere.
Ich habe mit:

Sub Worksheet_Activate()
Calculate
End Sub

getestet, dann mit Application.Calculate, mit ActiveSheet.Calculate usw.
Jedes mal funktioniert es genau einmal, wenn ich den Code ändere. Danach werden die Zellen mit meiner Funktion nicht mehr neu berechnet. Excel merkt, dass sich etwas verändert hat und bringt unten links "Berechnen". Aber auch diese manuelle Auslösung ändert nichts an den Zellen mit meiner Funktion.
Nur Application.CalculateFull funktioniert richtig. Ich möchte aber aus zeitlichen Gründen _ nicht, dass jedes mal die ganze Application durchgerechnet wird.

Function getText(textKey As String) As String
Dim text As String
Dim strAddress As String
Dim rng As Range
On Error GoTo Meldung
Set rng = Worksheets("Sprachen").Cells.Find(textKey)
If Worksheets("Sprachen").Cells(1, 1).Value = "DE" Then
getText = Worksheets("Sprachen").Cells(rng.Row, 2)
Else
getText = Worksheets("Sprachen").Cells(rng.Row, 3)
End If
On Error GoTo 0
Exit Function
Meldung:
getText = "[textKey '" & textKey & "' nicht gefunden]"
End Function

Frage:
Was mache ich falsch oder liegt irgend ein Problem mit meiner Excelinstallation vor? Gemäss Handbüchern und Recherche im Internet sollte eigentlich Calculate auf ein Tabellenblatt funktionieren.
Vielen Dank für jeden Hinweis.
Gruss
Roland

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Calculate auf einzelnes Tabellenblatt
31.05.2010 23:10:51
Ramses
Hallo
Lösche das "Calculate" mal im Activate-Ereignis und schreib stattdessen
Private Sub Worksheet_Calculate()
ActiveSheet.Calculate
End Sub
in der Tabelle die du berechnen willst. Zusätzlich setze die Anweisung "Application.Volatile" in die erste Zeile deiner Funktion
Vielleicht funktioniert es dann. Getestet habe ich das nicht
Gruss Rainer
AW: Calculate auf einzelnes Tabellenblatt
01.06.2010 07:25:34
xr8k2
Hallo Roland,
wie Rainer schon schreibt ...
Application.Volatile
mit in die Function.
Den .Calculate Code im Tabellenblatt brauchst du dann m.E. nicht.
Gruß,
xr8k2
Anzeige
AW: Calculate auf einzelnes Tabellenblatt
01.06.2010 11:35:12
Roland
Hallo Rainer, hallo xr8k2
besten Dank für eure Tips.
In diesem Forum wurde über Application.Volatile schon eine recht grosse Abhandlung geschrieben und es kommt immer wieder dabei raus, dass von dieser Funktion abgeraten wird.
Ich habe Application.Volatile auch getestet und es braucht noch mehr Zeit als Application.CalculateFull, da bei jeder Eingabe in irgend einer Zelle alle Zellen mit meiner eigenen Funktion neu gerechnet wird.
Ich habe einen Test gemacht mit 20'000 Zellen die mit meiner Funktion belegt sind. Mit Application.CalculateFull braucht der Rechner ca. 12 Sekunden! Wenn ich die Sprache wechsle, was ja der Sinn und Zweck der ganzen Funktion sein soll.
Somit braucht der Rechner mit Application.Volatile bei jeder Eingabe in irgend eine Zelle 12 Sekunden. Also noch schlimmer und unbrauchbar.
Somit stehe ich immer noch mit der Idee da, beim öffnen eines Blattes nur dieses neu zu berechnen, da der Anwender ja nicht alle Blätter gleichzeitig ansehen kann und somit der Wechsel der Sprache "gestaffelt" passiert und somit der User die Berechnung nicht merkt.
Hat jemand noch weitere Ideen? (Vielleicht einen komplett anderen Lösungsweg?)
Besten Dank
Gruss
Roland
Anzeige
AW: Calculate auf einzelnes Tabellenblatt
01.06.2010 11:56:32
xr8k2
Hallo Roland,
teste doch mal, was passiert, wenn du die Spracheinstellung auch als Parameter mit an deine Function übergibst so in etwa wie:
Function getText(textKey As String, Sprache As String) As String
Dim text As String
Dim strAddress As String
Dim rng As Range
On Error GoTo Meldung
Set rng = Worksheets("Sprachen").Cells.Find(textKey)
If Sprache = "DE" Then
getText = Worksheets("Sprachen").Cells(rng.Row, 2)
Else
getText = Worksheets("Sprachen").Cells(rng.Row, 3)
End If
On Error GoTo 0
Exit Function
Meldung:
getText = "[textKey '" & textKey & "' nicht gefunden]"
End Function
=getText("DeinBegriff"; "Sprachen!$A$1")
Damit müssten deine UDF eigentlich immer neu berechnet werden, wenn du die Sprache umstellst.
Gruß,
xr8k2
Anzeige
AW: Calculate auf einzelnes Tabellenblatt
01.06.2010 15:35:30
Roland
Hallo xr8k2
Deine Idee mit dem Spracheinstellungs-Parameter war super. Du hast recht jedes mal, wenn ich die Sprache umstelle, werden alle Zellen mit der UDF neu berechnet.
Ich habe gleichzeitig auch noch die Funktion geändert und den Such-Range eingeschränkt, womit sich die Berechnungszeit auf einen Drittel gesenkt hat.
......
Set rng = Worksheets("Sprachen").Range("A1:A60000").Find(textKey)
......
Nun nur noch eine Frage, gibt es auch noch eine Möglichkeit in der Funktion den Parameter Sprache vorzugeben, so dass ich nicht bei jeder Textkey-Eingabe immer die gleiche Zelle der Sprachtabelle eingeben muss. (Die bleibt ja immer die gleiche.)
Besten Dank für eine Antwort
Gruss
Roland
Anzeige
AW: Calculate auf einzelnes Tabellenblatt
01.06.2010 17:03:28
xr8k2
Hallo Roland,
das wird m. E. bei der Verfahrensweise nicht funktionieren, da die UDFs immer dann neu berechnet werden, wenn sich Eingabevariablen ändern und das tun sie eben nur dann (bzw. erkennt es Excel nur dann), wenn sie als Eingabeparameter vorhanden sind.
Andere Möglichkeit wäre vielleicht noch die Neuberechnung des jeweiligen Blattes in der die UDF steht bei jeder Aktivierung mittels .Dirty zu erzwingen:
Private Sub Worksheet_Activate()
ActiveSheet.Cells.Dirty 'oder eben nur der Bereich, in der die UDFs stehen
End Sub
Weiß aber nicht ob das praktikabel ist, weil dann wiederung jede Zelle im abgegebenen Bereich berechnet wird, was u.U. wieder dein Laufzeitproblem auf den Tisch wirft.
Da kannst du dann aber auch den 2. Parameter wieder weglassen.
Gruß,
xr8k2
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige