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.
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.
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.
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
Bernd am :
So klein ist die Welt…
Bernd schrieb auch: Vertical Video Syndrome