powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / парсинг формулы excel с выводом текстового представления вычисления
3 сообщений из 3, страница 1 из 1
парсинг формулы excel с выводом текстового представления вычисления
    #39482563
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К примеру у меня есть формула в экселе
автор=(B3-A3)*C3*E3*G3
Мне нужно текстовое представление операндов и знаков операций в этой формуле . Я делаю так
автор=СЦЕПИТЬ(B3;"-";A3;"*";C3;"*";E3;"*";G3)
Но чтобы мне это получить надо много мудиться - вручную кавычки и прочее
Может есть у кого макрос или другое решение, которое бы выдавало то что мне нужно в итоге автор911-901*225*8,2*8,6
автоматом.
...
Рейтинг: 0 / 0
парсинг формулы excel с выводом текстового представления вычисления
    #39482575
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напиши пользовательскую функцию да используй...
...
Рейтинг: 0 / 0
парсинг формулы excel с выводом текстового представления вычисления
    #39482666
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010,

Не тестировал, в основном нагуглил. Возможно подойдет.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
Option Explicit

Public Function EvaluateFormla(cell As Range) As String

Dim wb As Workbook
Dim sh As Worksheet
Dim col
Dim itm
Dim frm As String
Dim rng As Range

frm = cell.formula

col = CellPrecedents(cell)
For Each itm In col
    If LenB(itm) <> 0 Then
        Set rng = Range(itm)
        frm = Replace(frm, itm, rng.Value2)
    End If
Next

EvaluateFormla = frm

End Function

Public Function CellPrecedents(cell As Range) As Variant
    Dim resultRanges As New Collection
    If cell.Cells.count <> 1 Then GoTo exit_CellPrecedents
    If cell.HasFormula = False Then GoTo exit_CellPrecedents

    Dim formula As String
    formula = Mid(cell.formula, 2, Len(cell.formula) - 1)

    If IsRange(formula) Then
        resultRanges.Add Range(formula), 1
    Else
        Dim elements() As String
        'Debug.Print formula & " --> "
        formula = Replace(formula, "(", "")
        formula = Replace(formula, ")", "")
        'Debug.Print formula & " --> "
        elements() = SplitMultiDelims(formula, "+-*/\^")
        Dim n As Long, count As Integer
        For n = LBound(elements) To UBound(elements)
            If IsRange(elements(n)) Then
                'ACTUALLY JUST DO A REDIM PRESERVE HERE!!!!
                count = count + 1
                'resultRanges.Add Range(Trim(elements(n)))  '<---  Do **NOT** store as a range, as that gets automatically Eval()'d
                resultRanges.Add Trim(elements(n))
            End If
        Next
    End If

    Dim resultRangeArray() As Variant
    ReDim resultRangeArray(resultRanges.count)
    Dim i As Integer
    For i = 1 To resultRanges.count
        resultRangeArray(i) = CStr(resultRanges(i))  '// have to store as a string so Eval() doesn't get invoked (I think??)
    Next

    CellPrecedents = resultRangeArray

exit_CellPrecedents:
    Exit Function
End Function

Public Function IsRange(var As Variant) As Boolean
    On Error Resume Next
    Dim rng As Range: Set rng = Range(var)
    If Err.Number = 0 Then IsRange = True
End Function

Function SplitMultiDelims(Text As String, DelimChars As String) As String()
'''
'Function to split a string at multiple charachters
'Use like SplitMultiDelims2("This:is-a,test string", ":-,")
'Returns an array, in that example SplitMultiDelims2("This:is-a,test string", ":-,")(4) would be "test string"
'''
Dim bytes() As Byte
Dim delims() As Byte
Dim i As Long, aub As Long, ub As Long
Dim stack As String
Dim t() As String
Dim tLen As Long
tLen = Len(Text)
If tLen = 0 Then
    Exit Function
End If
ReDim t(1 To tLen) 'oversize array to avoid Redim Preserve too often
bytes = StrConv(Text, vbFromUnicode)
delims = StrConv(DelimChars, vbFromUnicode)
ub = UBound(bytes)
For i = 0 To ub
    If Contains(delims, bytes(i)) Then
        aub = aub + 1
        t(aub) = stack
        stack = ""
    Else
        stack = stack & Chr(bytes(i))
    End If
Next i
t(aub + 1) = stack
ReDim Preserve t(1 To aub + 1) 'Works marginally faster if you delete this line,
    'however it returns an oversized array (which is a problem if you use UBOUND of the result,
    'but fine if you are just looking up an indexed value like the 5th string)
SplitMultiDelims = t
End Function

Function Contains(arr, v As Byte) As Boolean 'checks if Byte v is contained in Byte array arr
Dim rv As Boolean, lb As Long, ub As Long, i As Long
    lb = LBound(arr)
    ub = UBound(arr)
    For i = lb To ub
        If arr(i) = v Then
            rv = True
            Exit For
        End If
    Next i
    Contains = rv
End Function

...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / парсинг формулы excel с выводом текстового представления вычисления
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]