Microsoft Excel

Excel und VBA: Beitrag aus Herbers Excel-Forumsarchiv

VBA-Funktion - Berechnung aktualisieren

Betrifft: VBA-Funktion - Berechnung aktualisieren
von: Wolfgang K.
Geschrieben am: 17.08.2005 09:15:08

Hallo!

Diesmal eine VBA-Anfängerfrage: Habe eine VBA-Funktion geschrieben, die soweit auch funktioniert, ABER: Ändert sich eines der übergebenen Argumente, so wird das Ergebnis der Funktion nicht automatisch aktualisiert. Auch F9 oder Umsch+F9 helfen nicht, genausowenig wie das Schließen und wieder Öffnen der gesamten Datei. Nur der Doppelklick in jede einzelne Zelle, die die Funktion verwendet (oder gleichbedeutend F2) bewirken eine Neuberechnung.

Wie kann man eine solche Aktualisierung automatisieren oder zumindest manuell global durchführen?

Danke im Voraus,
Wolfgang
  


Betrifft: AW: VBA-Funktion - Berechnung aktualisieren
von: Matthias G
Geschrieben am: 17.08.2005 09:21:31

Hallo Wolfgang,

wie lautet denn die erste Zeile deiner Funktion (Function xyz(...) As ...)?

Gruß Matthias


  


Betrifft: AW: VBA-Funktion - Berechnung aktualisieren
von: Wolfgang K.
Geschrieben am: 17.08.2005 09:25:52

Hallo Matthias!

Meine Funktion beginnt mit: "Function Funktion(X As String, Y As String) as Double"


  


Betrifft: AW: VBA-Funktion - Berechnung aktualisieren
von: Matthias G
Geschrieben am: 17.08.2005 09:32:59

Hallo Wolfgang,

und unter Extras, Optionen, Berechnung ist die Berechnung auf automatisch?
Klappt denn Strg-Alt-F9?

baue das mal nach und schau, ob es funktioniert:

Function testf(x As String, y As String)
testf = x & " " & y
End Function

 
 AB
1HiWolfgang
2Hi Wolfgang 
Formeln der Tabelle
A2 : =testf(A1;B1)
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  

Gruß Matthias


  


Betrifft: AW: VBA-Funktion - Berechnung aktualisieren
von: wolfgang K.
Geschrieben am: 17.08.2005 11:06:43

Hallo Matthias!

Dein Beispiel funktionierte problemlos, Veränderungen in A1 und B1 wurden sofort übernommen. Mit Strg+Alt+F9 funktioniert das Aktualisieren auch bei meiner Funktion (dauert zwar eine gute Minute, das macht aber nichts).

Bei Umsch+F9 ist mir jetzt aufgefallen, dass in der Statuszeile zwar "Berechnet" steht, aber auch nach 10 Minuten kein Ergebnis folgt.

Danke für deine Hilfe,

Wolfgang


  


Betrifft: AW: VBA-Funktion - Berechnung aktualisieren
von: Matthias G
Geschrieben am: 17.08.2005 11:22:09

Hallo Wolfgang,

dann poste doch mal die komplette Funktion.

Gruß Matthias


  


Betrifft: AW: VBA-Funktion - Berechnung aktualisieren
von: Wolfgang K.
Geschrieben am: 17.08.2005 11:55:24

Bittes sehr: Es handelt sich um eine Funktion, die die Molmassen von Elementen und Verbindungen eines Tabellenblattes zusammenzählt. Das Element steht dabei immer in Reihe A, die zugehörige Molmasse in G. Übergeben werden der Tabellenblattname und das Element. Molsumme("Tabelle1";"Fe") soll also "Fe" elementar auch von Verbindungen wie Fe2O3 und Fe3O4 mitzählen. Das Grundgerüst hab ich eh nur mit der hilfe dieses Forums zustande gebracht (mal ein dickes Lob an dieser Stelle!), ich habs dann aber noch verändert und ausgebaut.

Hier die Funktion:

Function MolSumme(Tabellenblatt As String, Element As String) As Double
   Dim cell As Range
   Dim ipos As Integer
   Dim myVal As Double
   Dim ch As String
   
   MolSumme = 0
  For Each cell In Intersect(Worksheets(Tabellenblatt).UsedRange, Worksheets(Tabellenblatt).Range("A:A"))
      ipos = InStr(cell.Value, Element)
      While ipos > 0
        If Len(Element) = 1 Then
          ch = Mid(cell.Value, ipos + 1, 1)
       ElseIf Len(Element) = 2 Then
          ch = Mid(cell.Value, ipos + 2, 1)
       End If
         If ch Like "[a-z]" Then
            myVal = 0
         ElseIf ch Like "[0-9]" Then
            myVal = Val(Mid(cell.Value, ipos + Len(Element)))
         Else
            myVal = 1
         End If
         MolSumme = MolSumme + myVal * cell.Offset(0, 6).Value
         ipos = InStr(ipos + Len(Element), cell.Value, Element)
      Wend
   Next
   Set Ws = Nothing
End Function



  


Betrifft: AW: VBA-Funktion - Berechnung aktualisieren
von: Matthias G
Geschrieben am: 17.08.2005 12:20:16

Hallo Wolfgang,

zu hast da eine Rekursie Funktion - ich weiß nicht ob du das beabsichtigst:
MolSumme = MolSumme + myVal * cell.Offset(0, 6).Value

Der Ausdruck rechts enthält "Molsumme", d.h. hier wird die Funktion nochmal aufgerufen - mich wundert es, dass das überhaupt funktioniert ohne Argumente.

Besser, du nimmst eine Temporäre Variable und übergibst dessen Wert am Schluss:
Function MolSumme(Tabellenblatt As String, Element As String) As Double
   Dim cell As Range
   Dim ipos As Integer
   Dim myVal As Double
   Dim ch As String
   Dim Tmp As Double
   
   Tmp = 0
  For Each cell In Intersect(Worksheets(Tabellenblatt).UsedRange, Worksheets(Tabellenblatt).Range("A:A"))
      ipos = InStr(cell.Value, Element)
      While ipos > 0
        If Len(Element) = 1 Then
          ch = Mid(cell.Value, ipos + 1, 1)
       ElseIf Len(Element) = 2 Then
          ch = Mid(cell.Value, ipos + 2, 1)
       End If
         If ch Like "[a-z]" Then
            myVal = 0
         ElseIf ch Like "[0-9]" Then
            myVal = Val(Mid(cell.Value, ipos + Len(Element)))
         Else
            myVal = 1
         End If
         Tmp = Tmp + myVal * cell.Offset(0, 6).Value
         ipos = InStr(ipos + Len(Element), cell.Value, Element)
      Wend
   Next
   Set Ws = Nothing
   MolSumme = Tmp
End Function

Jetzt müsste es schneller gehen...

Schau mal was jetzt besser geht und was noch nicht, und melde dich dann wieder.

Gruß Matthias


  


Betrifft: AW: VBA-Funktion - Berechnung aktualisieren
von: Wolfgang K.
Geschrieben am: 17.08.2005 12:39:50

Besten Dank, Matthias, das wars!

Jetzt wird *sofort* nach der Eingabe neu berechnet, dafür dauerts jetzt nur noch ein, zwei Sekunden :-)

Mit freundlichen Grüßen,
Wolfgang


  


Betrifft: AW: VBA-Funktion - Berechnung aktualisieren
von: Markus
Geschrieben am: 17.08.2005 11:41:48

Hi Wolfgang,

folgender Workaround müsste klappen:
Nimm den Makrorekorder und zeichne genau die Aktion auf die du machst (Doppelt reinklicken). Wenn das für mehrere Felder passieren soll dementsprechend dublizieren. Dann das Makro an geeigneter Stelle aufrufen - wenn deine Funktion in einer anderen Funktion oder in einem Makro aufgereufen wird dort zum beispiel. Und schon sind alle Felder neu berechnen...Hoffe das klappt!?


  


Betrifft: AW: VBA-Funktion - Berechnung aktualisieren
von: Wolfgang K.
Geschrieben am: 17.08.2005 12:44:42

Hallo Markus!

Danke für deine gute Idee zum Workaround, das hätt ich als nächstes ausprobiert, jetzt funktioniert aber wieder alles richtig.

Mit freundlichen Grüßen,
Wolfgang