I am writing a macro in Excel2003 to find all cells with formulas in a workbook and outputting their address and formula in a couple of columns on a different sheet.
I know I can show the formula for an individual cell using
Public Function ShowFormula(cell As Range) As String
ShowFormula = cell.Formula
End Function
which works just fine, but since I didn’t want to have to find all the cells by hand, I wrote the following macro to find them all for me
Sub Macro2()
Dim i As Integer
Dim targetCells As Range
Dim cell As Range
Dim referenceRange As Range
Dim thisSheet As Worksheet
Set referenceRange = ActiveSheet.Range("CA1")
With referenceRange
For Each thisSheet In ThisWorkbook.Sheets
If thisSheet.Index >= referenceRange.Parent.Index Then
Set targetCells = thisSheet.Cells.SpecialCells(xlCellTypeFormulas, 23)
For Each cell In targetCells
If cell.HasFormula Then
.Offset(i, 0).Value = thisSheet.Name
.Offset(i, 1).Value = cell.Address
.Offset(i, 2).Value = CStr(cell.Formula)
i = i + 1
End If
Next
End If
Next
End With
End Sub
It finds all the cells just fine, but instead of displaying the formula as text, the list displays the formula results.
What am I missing to output the formulas as text instead of formulas?
Narimanych, а как возможно в процедуре Sub мне задать text1.formula
(берем из определяемой нами при вводе, если это function , кликая на ячейку нужную..)
и text2 также..
(несет число строк на которое смещаем строку)?
И каждый раз ячейки содержащие значения переменных text1 и text2 в test4() могут быть с разными адресами.
Таким образом при том,( что если бы это была бы функция) получается в ячейке такая формула «=test4(O5, A7, 0, 1)»,
которая возвращает просто строку-
«=’D: [КНИГА1.XLS]ЛИСТ1′!$A$5» (*)
в результат .
Когда мы возьмем и просто скопируем это (возратимую функцией test4() строку формулы(*)),
например, в блокнот
и из блокнота в любую ячейку Excel,
то получаем значение из той самой закрытой книги, причем смещенное относительно ссылки на неё в ячейке O5, на А7 строк вниз без всяких проблем!! (
Неужели это правда, что это не может функция, а процедура и подавно, что может программа» блокнот» плюс мои руки? Отказываюсь в это верить)) Все не может быть таким плохим, с таким хорошим началом аха
Добавлено через 4 часа 54 минуты
В принципе, если писать
Visual Basic | ||
|
И держать ту книгу MS Excel, на которую ссылаемся открытой, то все работает, как нужно.
Как в пользовательской функции открывать другую книгу автоматом и сразу же ее закрывать? Или из уже из Sub связонной функцией это сделать.. Подскажите, пожалуйста, специалисты по VBA, участвующие в обсуждении решение этой проблемы, пожалуйста
Делать это нужно во время обновления функции. Значения пропадают только, когда обновим ячейку с пользовательской функцией с помощью enter , при чем с закрытой книгой, на которую ссылаемся. Более того нужные нам значения остаются даже при закрытии-открытии текущей книги в ней! Поэтому надо открыть и сразу закрыть» книгу-донора» без всяких в ней изменений при этом
Отображение текста формул
Добрый день, читатели блога! Сегодня мы поговорим о том как при необходимости отобразить формулу в ячейке как текст. Ситуация нестандартная, но иногда может пригодиться, особенно для проверки вводимых функций.
Для пользователя Excel всегда встаёт вопрос: как же узнать где в ячейке есть формула, а где нет?
Пойдём по порядку и опустим случай, когда мы щёлкаем на ячейку и смотрим в строчку формул, а также используем кнопку «Показать формулы».
Способ №1
Определить есть ли формула в ячейке нам поможет функция =ЕФОРМУЛА.
Результатом вычислений будет два значения: ИСТИНА — формула в ячейке есть; ЛОЖЬ — формулы в ячейке нет.
Ячейки с формулами найдены. Преобразовать формулу в текст поможет функция =Ф.ТЕКСТ. Она возвращает формулу в виде строки. Есть и минус: её можно использовать только с версии Excel 2013 и выше.
Способ №2
Воспользуемся гибкими возможностями именованных диапазонов в Excel. Переходим на вкладку «Формулы», в блоке кнопок «Определенные имена» нажимаем «Диспетчер имён».
Щёлкаем «Создать», далее вводим имя диапазона (например, ПОЛУЧИТЬФОРМУЛУ), область оставим «Книга», поле «Примечание» можно оставить пустым, в поле «Формула» напишем =ПОЛУЧИТЬ.ЯЧЕЙКУ(6;Лист2!C1). В примере формула находится в ячейке С1, у вас она может быть где угодно, но важно помнить одно — такой способ работает только в ячейке правее ячейки с формулой!
Имя создано, осталось ввести его в ячейку. Вводим равно и пишем начальные буквы имени, созданного выше.
Как только оно появилось сразу щелкаем по нему два раза.
Подтверждаем ввод. Видим результат.
Способ №3
Воспользуемся созданием пользовательской функции на VBA.
Добавим новый модуль (как это сделать можно прочитать ЗДЕСЬ):
- Вкладка «Разработчик», блок кнопок «Код», кнопка «Visual Basic»;
- Далее «Insert» — > «Module».
Вставляем код:
Function FFormula(ByVal Cell As Range, Optional ShowFormula As Boolean = False)
‘Application.Volatile True
If ShowFormula Then
If Cell.HasFormula Then
FFormula = «Текст формулы: » & IIf(Cell.HasArray, «{» & Cell.FormulaLocal & «}», Cell.FormulaLocal)
Else
FFormula = «Значение ячейки: » & Cell.Value
End If
Else
FFormula = Cell.HasFormula
End If
End Function
Разбор функции будет в видео ниже. Теперь нам остаётся ввести созданную функцию. Обязательно ввести через точку с запятой «Истина», чтобы активировать возможность показа формулы переменной «ShowFormula«.
Подтверждаем ввод, смотрим на результат.
Если вы знаете ещё варианты решения этой задачи — оставляйте комментарии под статьёй!
Видео:
Вставка формулы со ссылками в стиле A1 и R1C1 в ячейку (диапазон) из кода VBA Excel. Свойства Range.FormulaLocal и Range.FormulaR1C1Local.
Свойство Range.FormulaLocal
FormulaLocal — это свойство объекта Range, которое возвращает или задает формулу на языке пользователя, используя ссылки в стиле A1.
В качестве примера будем использовать диапазон A1:E10, заполненный числами, которые необходимо сложить построчно и результат отобразить в столбце F:
Примеры вставки формул суммирования в ячейку F1:
Range(«F1»).FormulaLocal = «=СУММ(A1:E1)» Range(«F1»).FormulaLocal = «=СУММ(A1;B1;C1;D1;E1)» |
Пример вставки формул суммирования со ссылками в стиле A1 в диапазон F1:F10:
Sub Primer1() Dim i As Byte For i = 1 To 10 Range(«F» & i).FormulaLocal = «=СУММ(A» & i & «:E» & i & «)» Next End Sub |
В этой статье я не рассматриваю свойство Range.Formula, но если вы решите его применить для вставки формулы в ячейку, используйте англоязычные функции, а в качестве разделителей аргументов — запятые (,) вместо точек с запятой (;):
Range(«F1»).Formula = «=SUM(A1,B1,C1,D1,E1)» |
После вставки формула автоматически преобразуется в локальную (на языке пользователя).
Свойство Range.FormulaR1C1Local
FormulaR1C1Local — это свойство объекта Range, которое возвращает или задает формулу на языке пользователя, используя ссылки в стиле R1C1.
Формулы со ссылками в стиле R1C1 можно вставлять в ячейки рабочей книги Excel, в которой по умолчанию установлены ссылки в стиле A1. Вставленные ссылки в стиле R1C1 будут автоматически преобразованы в ссылки в стиле A1.
Примеры вставки формул суммирования со ссылками в стиле R1C1 в ячейку F1 (для той же таблицы):
‘Абсолютные ссылки в стиле R1C1: Range(«F1»).FormulaR1C1Local = «=СУММ(R1C1:R1C5)» Range(«F1»).FormulaR1C1Local = «=СУММ(R1C1;R1C2;R1C3;R1C4;R1C5)» ‘Ссылки в стиле R1C1, абсолютные по столбцам и относительные по строкам: Range(«F1»).FormulaR1C1Local = «=СУММ(RC1:RC5)» Range(«F1»).FormulaR1C1Local = «=СУММ(RC1;RC2;RC3;RC4;RC5)» ‘Относительные ссылки в стиле R1C1: Range(«F1»).FormulaR1C1Local = «=СУММ(RC[-5]:RC[-1])» Range(«F2»).FormulaR1C1Local = «=СУММ(RC[-5];RC[-4];RC[-3];RC[-2];RC[-1])» |
Пример вставки формул суммирования со ссылками в стиле R1C1 в диапазон F1:F10:
‘Ссылки в стиле R1C1, абсолютные по столбцам и относительные по строкам: Range(«F1:F10»).FormulaR1C1Local = «=СУММ(RC1:RC5)» ‘Относительные ссылки в стиле R1C1: Range(«F1:F10»).FormulaR1C1Local = «=СУММ(RC[-5]:RC[-1])» |
Так как формулы с относительными ссылками и относительными по строкам ссылками в стиле R1C1 для всех ячеек столбца F одинаковы, их можно вставить сразу, без использования цикла, во весь диапазон.