VBA code- keine Neuberechnung der worksheets möglich

  • Excel

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Kev.1.

    VBA code- keine Neuberechnung der worksheets möglich

    Moin,

    seit ca. 2 Tagen versuche ich dieses Problem zu lösen: In meinem VBA- Programm ist es nicht möglich, die Berechnungen der Worksheets manuell zu aktualisieren.

    Ich habe 3 Worksheets. Sheet 1 mit 35.000 Zeilen. Sheet 1 und 2 sind verknüpft und berechnen sich automatisch. Sheet 3 wertet alle Daten anhand eines VBA-codes aus.
    In allen 3 Sheets sind in den ersten 5 Zeilen Eingabeinformationen, welche ich wie folgt durch Programme verlinkt habe:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Not Application.Intersect(Target, Range("A1:P5")) Is Nothing Then 'Link input data
    Worksheets("Sheet1").Range("A1:P5").Value = Worksheets("Sheet2").Range("A1:P5").Value
    End If

    If Not Application.Intersect(Target, Range("A1:P5")) Is Nothing Then 'Link input data
    Worksheets("Sheet2").Range("A1:P5").Value = Worksheets("Sheet3").Range("A1:P5").Value
    End If

    End Sub

    Mein VBA-Code in Sheet 3 aktualisert diese Eingabefelder. Leider ist es mir nicht möglich, die Sheets 1 und 2 durch VBA neu zu berechnen, wenn ich die Eingabeinformationen ändere.
    application.calculate, calculate, worksheet("Sheet").calculate haben nicht funktionniert. Auch verschiedene Variationen von ".Select"- Funktionen der Sheets (oder Zellen) vor und nach den "calulate"- Befehlen haben nichts gebracht...

    Besten Dank im Vorraus


    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Kev.1“ ()

    Versuchs mal so: Range("A1", "B2").Value = "Hallo"
    Von Dir: Range("A1:P5") geht glaube ich nicht wirklich. Die Syntax geht so nur bei Angabe der Intersect Ranges. Aber ich bin kein VBA-Excelexperte.

    Hilfreiche Antworten als solche zu Kennzeichnen wäre klasse 8-)

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ftzdOp“ ()

    Vom Ansatz her hätte ich doch ein paar Fragen:
    Möchtest du die Möglichkeit haben, dass, egal in welchem Sheet du eingibst, alle 3 Sheets synchronisiert werden?
    Falls nicht, würde ich per Formel auf das Mastersheet verlinken und nicht mit VBA.

    Falls doch, warum verwendest du Worksheet_SelectionChange und nicht Worksheet_Change?
    Dein Code wird doch bei jedem Zellwechsel aufgerufen.
    Und er betrachtet nur die Zellen, in die du hinein wechselst und nicht die Zellen nach der Veränderung
    Das kann so nicht vernünftig funktionieren.

    Mein Ansatz wäre folgender:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Const DependingSheets = "Sheet1,Sheet2,Sheet3"
    3. Private Const DependingRange = "A1:P5"
    4. Private Sub Worksheet_Change(ByVal Target As Range)
    5. Dim SyncRange As Range, c As Range, s As Variant
    6. Set SyncRange = Intersect(Target, Range(DependingRange))
    7. If SyncRange Is Nothing Then Exit Sub
    8. For Each c In SyncRange
    9. For Each s In Split(DependingSheets, ",")
    10. If Sheets(s).Range(c.Address).Value <> c.Value Then Sheets(s).Range(c.Address).Value = c.Value
    11. Next
    12. Next
    13. End Sub

    Diesen Eventhandler kannst du in jedem Sheet eintragen.
    Wenn sich in einer der Zellen etwas verändert, wird es auf die anderen synchronisiert.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Vielen Dank euch, allerdings hat das mein Problem noch nicht gelöst. Ich verwende jetzt deinen Code petaod. Der ist besser, Worksheet_SelectionChange ist natürlich umständlich.

    Mein eigentliches Problem ist folgendes: Wenn ich die Eingabefelder durch mein VBA-Code für Sheet3 (VBA-Code für "Tabelle3" und kein Modul) ändere, werden die restlichen Berechnungen in den Sheets 1 und 2 unterhalb der 5 Eingabezeilen nicht angepasst. Meine "Berechnungsoptionen" sind natürlich auf "automatisch" gestellt.
    Auch merkwürdig ist, dass wenn ich den Code für Sheet 3 in Einzelschritten mauell (Debuggen) durchgehe, werden alle Zellen aller Sheets neu berechnet, sobalt ein Eingabefeld angepasst wird. Nur bei automatischer Ausführung des Programms wird nicht automatisch neu berechnet...

    Ich benutze ein Button zur Programmausführung: Private Sub CommandButton1_Click()
    Die Calculate- Funktionen haben nichts bewirkt...
    Ja, aber solange das Programm nicht ausgeführt wird funktionniert die automatische Neuberechnung. Nur wenn mein Programm läuft, die Eingabewerte verändert und verschiedene Szenarien berechnen soll, setzt die automatische Neuberechung der Sheets aus.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kev.1“ ()

    Naja, solange dein Programm läuft und noch irgendwas berechnet benötigst du vermutlich auch keine Aktualisierung.
    Wichtig ist doch, dass nach Beendigung des Codes die Neuberechnung stattfindet.

    Was macht denn dein Programm ausser der Eingabesynchronisierung sonst noch?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Mein Programm ändert die Eingabewerte. Anschließend sollten die Zellen der Arbeitsblätter automatisch neu berechnet werden (werden sie aber nicht...). Danach verwendet das Programm Ergebnisse aus den Berechnungen aus den Arbeitsblättern.
    Dieser Prozess wird 25 mal ausgeführt, um mir ein "Endergebnis" auszugeben. Allerdings benötige ich ca. 200 "Endergebnisse".

    Kev.1 schrieb:

    Mein Programm ändert die Eingabewerte
    Der User oder das Programm?
    Wie werden die Werte verändert?

    Kev.1 schrieb:

    Anschließend sollten die Zellen der Arbeitsblätter automatisch neu berechnet werden
    Wenn nichts mehr läuft, wird das wohl auch passieren.

    Kev.1 schrieb:

    Danach verwendet das Programm Ergebnisse aus den Berechnungen aus den Arbeitsblättern
    Und macht damit was?

    Kev.1 schrieb:

    Dieser Prozess wird 25 mal ausgeführt
    Wenn du den kompletten Workflow automatisierst, musst du dem Programm schon Zeit für die Kalkulation geben, sonst optimiert sich womöglich alles weg.

    Bevor wir hier weiter im Nebel stochern, veröffentliche bitte den für deinen Workflow zuständigen Code.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    So, ich habe jetzt die Lösung. Nachdem ich alles versucht habe, habe ich das Programm an einem anderen Computer ausgehührt. Auf dem hat alles perfekt funktionniert.
    Ich nehme an, dass mein System schuld ist. Seit geraumer Zeit habe ich System Probleme nach automatischen Updates. Offensichtlich vertragen sich einige Updates nicht mit meiner ASUS Software. So funktionnieren zum Beispiel Shortcuts mit der Strg- Taste nur im abgesicherten Modus von Windows. Intensive Recherchen und eine System- Neuaufsetzung haben auch nichts gebracht.

    Danke euch trotzdem :)