Разбор и извлечение ссылок на ячейки из формул Excel?
Я ищу, чтобы разобрать и извлечь ссылки на ячейки из формул Excel. Допустим, у меня есть следующая формула внутри клетки P5
:
=SUM(P1:P4)+Q3
Я ищу вывод расположения ячеек, участвующих в формуле для получения ответа, т.е. P1
, P2
, P3
, P4
, Q3
как вывод (их местоположение / представление в некоторой другой форме также приемлемо).
Мой вопрос заключается в том, есть ли такой парсер для этого, а если нет, то какую технику я должен использовать. Возможно, формула, которую я перечислил в качестве примера, довольно проста, в идеале я хотел бы охватить все потенциальные формулы, возможно, даже те, которые имеют ссылку на другие листы и рабочие книги. Я ожидал и действительно надеялся на решение на основе VSTO C#, но мне очень трудно найти одну или даже соответствующую функцию в библиотеке VSTO.
2 ответа
Полное решение для поиска прецедентов по формуле является сложной задачей: даже инструмент прецедентов Excel не справляется с этой задачей. Для начала, используя C#, попробуйте https://github.com/spreadsheetlab/XLParser
Для простых формул:
Sub PrettyPoorParser()
Dim r As Range, rr As Range
With Range("D4")
Set r = .DirectPrecedents
msg = r.Count
For Each rr In r
msg = msg & vbCrLf & rr.Address(0, 0)
Next rr
End With
MsgBox msg
End Sub
К сожалению, этот простой подход не будет работать со всеми формулами. Его легко одурачить, используя INDIRECT() и ссылки вне листа.
EDIT # 1:
Вместо того, чтобы использовать парсер рекурсивного спуска, он использует свойство объекта Range. Это свойство довольно хорошее, но не всеобъемлющее. Что касается запуска этого кода в среде VBA-EXCEL:
Макросы очень просты в установке и использовании:
- ALT-F11 открывает окно VBE
- ALT-I ALT-M открывает новый модуль
- вставьте материал и закройте окно VBE
Если вы сохраните книгу, макрос будет сохранен вместе с ней. Если вы используете версию Excel более поздней, чем в 2003 году, вы должны сохранить файл как.xlsm, а не.xlsx
Чтобы удалить макрос:
- откройте окно VBE, как указано выше
- очистить код
- закройте окно VBE
Чтобы использовать макрос из Excel:
- ALT-F8
- Выберите макрос
- Нажмите RUN
Чтобы узнать больше о макросах в целом, смотрите:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
а также
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
Макросы должны быть включены, чтобы это работало!
Несколько лет назад я начал работать над реальным парсером (в качестве инструмента отладки), но получил это задание.