Skip to content
== ERROR-REPORT (BETA/ALPHA-BUILDS) ==

Notice: Only variable references should be returned by reference in /var/www/virtual/bauigel/bernd.distler.ws/include/db/mysqli.inc.php on line 101.
For more details set $serendipity['production'] = 'debug' in serendipity_config_local.inc.php to receive a stack-trace.

Inhalt einer Excel-Zelle ausgeben lassen

Ich bin, wie vermutlich der ein oder andere weiß, Bauingenieur. In der Funktion mache ich hier im Büro überweigend Tragwerksplanungen für allen möglichen (Un-)Sinn…und das Mittel der Wahl ist dabei dann doch oft Microsoft Excel, weil man einfach am schnellsten und mit größter Variabilität verschiedene Berechnungen machen und anpassen kann.

Nun macht es allerdings wenig Sinn, wenn der Prüfingenieur nur ein Ergebnis einer Berechnung hat, ohne die Zwischenwerte prüfen zu können. Ab Excel 2013 gibt es zwar die Funktion formeltext(), allerdings hat die den großen Nachteil, dass Zellbezüge nicht aufgelöst werden. In der Berechnungsformel steht also immer A3/D6/Z123/usw. statt dem Wert, der in der Bezugszelle enthalten ist. Bei uns in der Firma gibt es für so etwas schon seit Jahren ein Visual Basic Script, welches dieses Problem behebt.

Bevor das eigentliche Script kommt noch kurz ein Beispiel, wie das bei der Verwendung aussieht. Nachfolgend eine kleine Beispieltabelle mit den Zelleninhalten:

A B C
1 A = 23
2 B = 5
3 X = =VERKETTEN(formeltext(C3;C3);"=") =B1^B2

In der Ausgabe sieht das dann wiefolgt aus:

A B C
1 A = 23
2 B = 5
3 X = 23^5 = 6436343

Als nette Spielerein werden noch diverse Ersetzungen gemacht, z. B. ^2 zu ² oder * zu einem richtigen Multiplikator-Zeichen. cool

Hier nun mal das Script:

Option Explicit
Option Compare Text

'(c)1999 Andreas K. andreas@example.org

Const TrennZ = "-+/*^()"
Const ZahlZ = "-.,0123456789"
Const HochZ = "0123"
Const Hoch2Z = "º¹²³"

Function FORMELTEXT(Bereich, Aktuell As String) As String

Application.Volatile

  Dim Art As Integer, i As Integer, j As Integer, k As Integer, n As Integer
  Dim BezAnf As Integer
  Dim tI As String, tA As String, c As String * 1, buf As String * 256, tF As String

  On Error Resume Next
  tI = Bereich.FormulaLocal
  If Left(tI, 1) = "=" Then
    tA = ""
    Art = 0                                   ' 0: Operand erwartet
    n = Len(tI)
    For i = 2 To n + 1
      If i > n Then
        c = ""
        k = 1
      Else
        c = Mid(tI, i, 1)
        k = InStr(TrennZ, c)
      End If
      If k = 0 Then
        k = InStr(ZahlZ, c)
        If k = 0 Then
          If Art = 0 Then
            Art = 2                           ' 2: Bezug oder Funktion
            BezAnf = i
          End If
        Else
          If Art < 2 Then                     ' 1: Operand
            Art = 1
            tA = tA & c
          End If
        End If
      Else
        If Art = 2 Then
          If c = "(" Then
            tA = tA & Mid(tI, BezAnf, i - BezAnf)
          Else
            With Range(Mid(tI, BezAnf, i - BezAnf))
              tF = CStr(.Value)
              tF = Format(.Value, .NumberFormat)
            End With
            tA = tA & tF
          End If
        End If
        Select Case c
        Case "*"
          c = "·"
        Case "^"
          j = InStr(HochZ, Mid(tI, i + 1, 1))
          If i < n And j > 0 And (i + 1 = n Or InStr(TrennZ, Mid(tI, i + 2, 1)) > 0) Then
            c = Mid(Hoch2Z, j, 1)
            i = i + 1
          End If
        End Select
        tA = tA & c
        Art = 0                               ' 0: Operand erwartet
      End If
    Next
    n = Len(tA)
    buf = tA
    FORMELTEXT = Left(tA, n)
  Else
    FORMELTEXT = ""
  End If

End Function

Wie man am Copyright-Vermerk sieht, ist das Ding schon recht alt. Den Namen und die E-Mail-Adresse habe ich vorsichtshalber anonymisiert, da die angegebene Domain wohl inzwischen anderweitig vermarktet wird und ich auch zum angegebenen Namen bei Google nichts gefunden habe.

Sollte sich Andreas hier wiederfinden, soll er sich doch bitte mal bei mir melden. smile

Hinweis für alle mit Excel 2013: Da Excel wie oben erwähnt ab 2013 eine eigene Funktion FORMELTEXT() besitzt, bekommt man eine Warnmeldung, dass das Script den gleichen Namen hat. Möchte man dies vermeiden (ich habe bisher außer der Warnmeldung keine negativen Folgen bemerkt), muss man im Script ein bisschen Hand anlegen und z. B. FORMELTEXT durch FORMELTEXT2 ersetzen. Das sollte man dann gleich zu Anfang machen, denn sonst muss man später wieder alle Formeln in den Zellen anpassen.

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

== ERROR-REPORT (BETA/ALPHA-BUILDS) ==

Notice: Only variable references should be returned by reference in /var/www/virtual/bauigel/bernd.distler.ws/include/db/mysqli.inc.php on line 101.
For more details set $serendipity['production'] = 'debug' in serendipity_config_local.inc.php to receive a stack-trace.

Henning am :

Danke, Bernd, das hatte ich gerade gesucht, als ich auf Anfrage von einem anderen Büro Deine Brunnenberechnung für Regensburg geöffnet habe. So trifft man sich.

Gruß
Henning

Kommentar schreiben

Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Textile-Formatierung erlaubt
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Um einen Kommentar hinterlassen zu können, erhalten Sie nach dem Kommentieren eine E-Mail mit Aktivierungslink an ihre angegebene Adresse.
Bewirb einen Deiner letzten Artikel
Dieses Blog erlaubt Dir mit Deinem Kommentar einen Deiner letzten Artikel zu bewerben. Bitte gib Deine Blog URL als Homepage ein, dann wird eine Auswahl erscheinen, in der Du einen Artikel auswählen kannst. (Javascript erforderlich)
Formular-Optionen