Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 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
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
Anzeige
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
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
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

Excel: Einzelnes Tabellenblatt neu berechnen mit VBA


Schritt-für-Schritt-Anleitung

  1. Öffne Visual Basic for Applications (VBA): Drücke ALT + F11 in Excel, um den VBA-Editor zu öffnen.

  2. Wähle das richtige Tabellenblatt aus: Im Projektfenster auf der linken Seite, klicke das Tabellenblatt an, das du neu berechnen möchtest.

  3. Füge den Code für die Berechnung ein:

    Private Sub Worksheet_Activate()
       ActiveSheet.Calculate
    End Sub

    Dieser Code sorgt dafür, dass das aktuelle Tabellenblatt neu berechnet wird, wenn es aktiviert wird.

  4. Verwende die Funktion Application.Volatile: Um sicherzustellen, dass deine benutzerdefinierte Funktion (UDF) auch bei Änderungen aktualisiert wird, füge die folgende Zeile in deine Funktion ein:

    Application.Volatile
  5. Teste deine Funktion: Ändere die Sprache oder einen anderen Parameter und aktiviere das Tabellenblatt, um zu sehen, ob die Berechnung wie gewünscht funktioniert.


Häufige Fehler und Lösungen

  • Fehler: Die Zellen werden nicht automatisch neu berechnet.

    • Lösung: Stelle sicher, dass du ActiveSheet.Calculate im Worksheet_Activate Ereignis verwendest.
  • Fehler: Bei der Verwendung von Application.Volatile wird die Berechnung zu langsam.

    • Lösung: Überlege, den Suchbereich in deiner Funktion einzuschränken, um die Berechnungszeit zu reduzieren, z.B. Set rng = Worksheets("Sprachen").Range("A1:A60000").Find(textKey).

Alternative Methoden

  • Verwende Application.CalculateFull: Wenn du alle Blätter gleichzeitig neu berechnen möchtest, kannst du Application.CalculateFull verwenden, jedoch ist dies oft nicht effizient.

  • Nutze ActiveSheet.Cells.Dirty: Wenn du die Neuberechnung nur bei Aktivierung des Blattes erzwingen möchtest, könntest du die folgende Methode verwenden:

    Private Sub Worksheet_Activate()
       ActiveSheet.Cells.Dirty
    End Sub

    Dies könnte jedoch die Performance beeinträchtigen, wenn viele Zellen betroffen sind.


Praktische Beispiele

  1. Einfaches Beispiel für eine UDF:

    Function getText(textKey As String) As String
       Dim rng As Range
       Set rng = Worksheets("Sprachen").Cells.Find(textKey)
       If Not rng Is Nothing Then
           getText = rng.Offset(0, 1).Value
       Else
           getText = "[textKey '" & textKey & "' nicht gefunden]"
       End If
    End Function
  2. Mit Spracheinstellung als Parameter:

    Function getText(textKey As String, Sprache As String) As String
       Dim rng As Range
       Set rng = Worksheets("Sprachen").Cells.Find(textKey)
       If Sprache = "DE" Then
           getText = rng.Offset(0, 1).Value
       Else
           getText = rng.Offset(0, 2).Value
       End If
    End Function

Tipps für Profis

  • Überlege, ob du deine UDFs mit spezifischen Parametern verbessern kannst, um unnötige Berechnungen zu vermeiden.
  • Halte deine Datenbank (z.B. die Sprachtabelle) so klein wie möglich, um die Performance zu steigern.
  • Nutze die Funktion Worksheet.Calculate gezielt, um nur bestimmte Blätter zu berechnen, wenn nötig.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass nur ein bestimmtes Blatt neu berechnet wird? Du kannst den Code ActiveSheet.Calculate im Worksheet_Activate Ereignis verwenden, um sicherzustellen, dass nur das aktive Blatt neu berechnet wird.

2. Was ist der Unterschied zwischen Application.Calculate und ActiveSheet.Calculate? Application.Calculate berechnet alle Blätter in der Arbeitsmappe, während ActiveSheet.Calculate nur das aktuell aktive Blatt berücksichtigt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige