Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2010, 15:24   #1
Makso
 
Регистрация: 09.04.2010
Сообщений: 5
Вопрос Получить ячейку из формулы (VBA, Excel 2007)

Здравствуйте, уважаемые участники форума!

Кто знает как на VBA вытащить колекцию ячеек из формулы?

К примеру, у меня есть ячейка на Лист1, в которую я вписал формулу -

"=Лист2!C4+Лист2!C24+Лист2!C25" , теперь моя задача получить каждую

из этих ячеек в виде объекта Range.

Использовать свойство Range.Precedents нельзя, так как ссылки на другой лист. Еще я использовал на самом листе команду - "Влияющие ячейки". Появлялась стрелка с изображение таблички. При двойном щелчке на стрелке открывается диалоговое окно - "Переход", в котором все три ссылки красиво перечисленны в столбик, выбирай любую.

'[Отчеты.xlsm]Лист2'!$C$4
'[Отчеты.xlsm]Лист2'!$C$24
'[Отчеты.xlsm]Лист2'!$C$25

Кто знает как решить эту задачу?

Заранее всем спасибо!
Makso вне форума Ответить с цитированием
Старый 09.04.2010, 16:07   #2
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Объясни цель сего действа! может что-нибудь другое придумать?
Как вариант могу предложить скопировать формулу на соответствующий лист и Precedents
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 09.04.2010, 18:21   #3
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

У меня была похожая задача. Я парсил строку - ищем воскл. знак, а далее обрезаем справа, когда появляется к-н. знак.
motorway вне форума Ответить с цитированием
Старый 11.04.2010, 00:03   #4
Pavel55
Форумчанин
 
Регистрация: 21.08.2007
Сообщений: 292
По умолчанию

Ну, если в формуле присутствует лишь один математический знак, например, как в вашем примере "+", то можно решить задачу так

Формула должна быть в ячейке А1

Код:
Sub РазделитьПлюс()
Dim strFormula As String, iArray() As String, i As Long
    strFormula = Replace(Range("A1").Formula, "=", "")
    iArray = Split(strFormula, "+", -1, vbTextCompare)
    
    For i = 0 To UBound(iArray())
        Range(iArray(i)).Interior.ColorIndex = 3 'помечаем ячейки красным цветом
    Next i
    MsgBox "Найдено " & UBound(iArray()) + 1 & " ячейки. Они выделены красным цветом!", 64, ""
End Sub

Последний раз редактировалось Pavel55; 11.04.2010 в 01:10.
Pavel55 вне форума Ответить с цитированием
Старый 11.04.2010, 01:05   #5
Pavel55
Форумчанин
 
Регистрация: 21.08.2007
Сообщений: 292
По умолчанию

А если в нашей формуле встречаются разные математические знаки *, /, +,-. Например, формула такая

=Лист2!C4+Лист2!C6*Лист2!C8-Лист2!C10/Лист2!C12

то можно написать небольшой макрос.

Формула должна быть в ячейке А1

Код:
Option Explicit

Const Symbols As String = "[*/+-]"
Dim n As Long

Sub ParsingFormula()
Dim strFormula As String, i As Long, Symbols As String, NextSign As Long
Dim FirstRange As Boolean, TotalCells As Long
    strFormula = Replace(Range("A1").Formula, "=", "")
    Symbols = "[*/+-]" 'математические знаки, встречающиеся в формуле
    For i = 1 To Len(strFormula)
        If Mid(strFormula, i, 1) Like Symbols Then
            If FirstRange = False Then
                FirstRange = True
                Range(Mid(strFormula, 1, i - 1)).Interior.ColorIndex = 3
                TotalCells = TotalCells + 1
            End If
            NextSign = FindNextSign(Mid(strFormula, i + 1, 1024))
            If NextSign > 0 Then 'если не последний адрес
                Range(Mid(strFormula, i + 1, NextSign)).Interior.ColorIndex = 3    'помечаем ячейки красным цветом
                TotalCells = TotalCells + 1
            Else 'если последний
                Range(Mid(strFormula, i + 1, 1024)).Interior.ColorIndex = 3   'помечаем ячейки красным цветом
                TotalCells = TotalCells + 1
                MsgBox "Найдено " & TotalCells & " ячейки. Они выделены красным цветом!", 64, ""
                Exit Sub
            End If
            i = i + NextSign - 1
        End If
    Next i
End Sub

Function FindNextSign(iStr As String) As Long
Dim n As Long
    For n = 1 To Len(iStr)
        If Mid(iStr, n, 1) Like Symbols Then FindNextSign = n - 1: Exit Function
    Next n
End Function

Последний раз редактировалось Pavel55; 11.04.2010 в 01:10.
Pavel55 вне форума Ответить с цитированием
Старый 11.04.2010, 04:29   #6
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Господа, для получения внешних ссылок первого уровня парсить формулу совершенно не обязательно:
Код:
Sub EnnumerateExternalPrecedents()
    Dim i As Long
    Dim v As Variant
    Dim s As String
    Call ExternalPrecedents([A1], s)
    If Len(s) = 0 Then
        Debug.Print "Нет внешних ссылок"
    Else
        v = Split(Left$(s, Len(s) - 1), ";")
        For i = LBound(v) To UBound(v)
            Debug.Print v(i)
        Next i
    End If
End Sub
Код:
Public Sub ExternalPrecedents(c As Range, ByRef s As String)
    Dim i As Long
    Dim r As Range

    s = vbNullString
    If c.Cells.Count <> 1 Then
        Exit Sub
    End If
    Application.ScreenUpdating = False
    Set r = ActiveCell
    On Error Resume Next
    i = 1
    With c
        .ShowPrecedents False
        Do
            .NavigateArrow True, 1, i
            If Err.Number <> 0 Then GoTo rest
            If Selection.Address(External:=True) = c.Address(External:=True) Then GoTo rest
            i = i + 1
            s = s & ActiveCell.Address(External:=True) & ";"
        Loop

    End With
    Exit Sub
rest:
    c.ShowPrecedents True
    r.Select
    Application.ScreenUpdating = True
End Sub
Локальные же получаются через свойство Precedens

Последний раз редактировалось Aent; 11.04.2010 в 04:32.
Aent вне форума Ответить с цитированием
Старый 13.04.2010, 15:40   #7
Makso
 
Регистрация: 09.04.2010
Сообщений: 5
Хорошо

Андрей, огроооооооомное Вам спасибо, шикарнейший ответ!!!!!!!

Спасибо всем, кто принимал участие в обсуждении!
Makso вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как нумеровать формулы в Word-2007 VistaSV30 Microsoft Office Word 17 28.01.2014 12:54
вставка формулы в ячейку (vba) pride Microsoft Office Excel 5 13.07.2009 09:26
Как запретить запуск программы на VBA Excel 2003 в Excel 2007 kovalevskivf Microsoft Office Excel 2 15.05.2009 16:47
Глюк Excel-2007??? Формулы в ячейку из VBA Rafik Microsoft Office Excel 7 24.03.2009 13:59
Макрос VBA EXCEl - простановка в ячейку номера страницы Обыватель Microsoft Office Excel 1 14.02.2008 12:49