2016-06-29 14 views
2

Für didaktische Zwecke möchte ich Berechnungen in Excel durchführen und anzeigen. So zeigen Berechnungen ich folgende VBA-Arbeitsblatt-Funktion verwenden:Wie werden Berechnungen, Werte und Variablen in Excel angezeigt?

Function DisplayFormula(range_rng As Range) As String 
    Application.Volatile 

    If range_rng.HasArray Then 
     DisplayFormula = "<-- " & " {" & range_rng.FormulaArray & "}"  
    Else 
     DisplayFormula = "<-- " & " " & range_rng.FormulaArray 
    End If 
End Function 

Dies funktioniert aber ich bin fest mit der Umsetzung von zwei Modifikationen:

  1. Ich möchte die aktuellen Werte anzuzeigen, werden in range_rng aufgerufen.
  2. Ich möchte Variablen anstelle der Bereiche anzeigen. Die Variablen würden in einer separaten Zelle neben der Zelle zugewiesen, von der sie aufgerufen werden (siehe Grafik unten).

Spalte "C" zeigt die (gewünschte) Ausgabeformate für DisplayFormula (B3):

This is how the output should look like.

+0

ein Array zu verwenden, so arr() = range_rng.value2, dann ist diese kommen wieder nach oben, einen String zurückgeführt. –

+0

Die Verwendung von range_rng.value2 gibt die Ausgabe für range_rng (z. B. 12,5 oben) zurück. Ich möchte die Berechnung zurückgeben (z. B. = 5/2 + 10 oben). Danke vielmals! – CFW

Antwort

1

Sie können diese Brute-Force-Ansatz versuchen.
Ich kann nicht sagen, dass dies optimiert ist, aber es kann Ihre beiden oben genannten Bedingungen erfüllen.

Function DisplayFormula2(r As Range, Optional o As Variant) As String 
    Dim a, b, z, x, y, w 
    Dim f As String, tf As String 
    Dim c As Range 
    Dim i As Integer 

    If IsMissing(o) Then o = 0 

    a = Array("+", "-", "/", "*", "%", "&", "^", "=", _ 
     "<", ">", "<=", ">=", "<>", "(", ")") 

    f = r.FormulaArray: tf = f 
    For Each b In a 
     With Application.WorksheetFunction 
      tf = .Substitute(tf, b, "|") 
     End With 
    Next 

    z = VBA.Split(tf, "|") 

    For Each w In z 
     Debug.Print w 
     On Error Resume Next 
     Set c = Range(w) 
     On Error GoTo 0 
     If Not c Is Nothing Then 
      If IsArray(x) Then 
       ReDim Preserve x(UBound(x) + 1): x(UBound(x)) = w 
       ReDim Preserve y(UBound(y) + 1): y(UBound(y)) = c.Offset(0, o).Value2 
      Else 
       x = Array(w) 
       y = Array(c.Offset(0, o).Value2) 
      End If 
     End If 
     Set c = Nothing 
    Next 

    If IsArray(x) Then 
     For i = LBound(x) To UBound(x) 
      With Application.WorksheetFunction 
       f = .Substitute(f, x(i), y(i)) 
      End With 
     Next 
    End If 
    DisplayFormula2 = IIf(r.HasArray, "<-- {" & f & "}", "<-- " & f) 
End Function 

By the way, ich glaube nicht, Sie .Volatile so entfernte ich es verwenden müssen.
Es wird neu berechnet, solange Sie den Berechnungsmodus auf Automatisch setzen.

Actual Formel in C3: C5:
C3: =DisplayFormula(B3)
C4: =DisplayFormula2(B4)
C5: =DisplayFormula2(B5,-1)

0

können Sie erreichen, dass durch die Zielzelle in Textformat zu ändern. Versuchen Sie folgendes:

Function DisplayFormula(range_rng As Range) As String 
    Application.Volatile 
    ActiveCell.NumberFormat = "@" 

    If range_rng.HasArray Then 
     DisplayFormula = "<-- " & " {" & range_rng.FormulaArray & "}" 
    Else 
     DisplayFormula = "<-- " & " " & range_rng.FormulaArray 
    End If 
End Function 
Verwandte Themen