Vba excel формула с переменной

 

venom51

Пользователь

Сообщений: 237
Регистрация: 11.07.2014

#1

24.08.2016 15:20:49

Добрый день,
Столкнулся с проблемой
Имеется простой макрос который вставляет формулу в одну ячейку

Код
Range("G1").Select
    ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[1]C:R[23]C)"

Как видим по формуле последнюю ячейку которую он захватывает это 23 строка таблицы R[23]C
Если строк в таблице станет больше то формула не охватит весь диапазон.
Как мне 23 заменить на посчитанной количество строк? (как посчитать еще тоже не знаю))

Нашел формулу которая делает аналогичное действие но там промеж.итоги стоят внизу столбца, а мне принципиально надо сверху(((

Код
.Cells(Rows.Count, 4).End(xlUp).Offset(1, 0).FormulaR1C1 = "=SUBTOTAL(9, R4C:R[-1]C)"

Прикрепленные файлы

  • Пример.xlsm (18.8 КБ)

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Так сработает?
«…[» & переменная & «]…»

 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

#3

24.08.2016 15:36:47

Код
a = Cells(Rows.Count, 7).End(xlUp).Row
    Range("G1").Select
    ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[1]C:R[" & a - 1 & "]C)"

Изменено: Badamyan24.08.2016 15:37:12

 

venom51

Пользователь

Сообщений: 237
Регистрация: 11.07.2014

Да сработало) Спасибо) пойду искать как этой переменной нужное значение передать))

 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

#5

24.08.2016 15:42:36

Цитата
venom51 написал:
пойду искать как этой переменной нужное значение передать))

переменная = Cells(Rows.Count, 7).End(xlUp).Row
или же сверху
переменная = Cells(1, 7).End(xlDown).Row

 

venom51

Пользователь

Сообщений: 237
Регистрация: 11.07.2014

#6

24.08.2016 15:44:17

Код
 Range("G1").Select
    R = Range("G2").End(xlDown).Row
    ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[1]C:R[" & R & "]C)"

нашел
почему то она вместо значения 23 выдает значение 24

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#7

24.08.2016 15:45:08

Зачем вставлять формулу макросом, если макросом можно сумму посчитать?

Код
    Range("G1") = WorksheetFunction.Subtotal(109, Range("G2:G" & Cells(Rows.Count, 1).End(xlUp).Row))
 

venom51

Пользователь

Сообщений: 237
Регистрация: 11.07.2014

Kuzmich

чтобы при фильтрации таблицы видеть промежуточные итоги по отфильтрованным данным) зачем бы я тогда вообще использовал промеж.итоги, можно было бы обычную сумму прописать)

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#9

24.08.2016 15:51:37

Цитата
чтобы при фильтрации таблицы видеть промежуточные итоги по отфильтрованным данным

Вы видели, я написал в функции параметр 109

 

venom51

Пользователь

Сообщений: 237
Регистрация: 11.07.2014

Видел и даже попробовал то что вы написали потестить.
Мне нужна в ячейке формула, а не значение)
Чтоб было яснее — есть некая выгрузка, которая каждый день вручную обрабатывалась — добавлялись столбцы, вставлялись простые формулы, фильтр и прочее.
Вот чтобы ее каждый день не лопатить решил сделать макрос.

Спасибо

Badamyan

3 пост в данной теме закрыл вопрос целиком и полностью)

Изменено: venom5124.08.2016 16:02:28

 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

#11

24.08.2016 16:06:16

Цитата
venom51 написал:
Спасибо  Badamyan  3 пост в данной теме закрыл вопрос целиком и полностью)

а я уж думал что меня некто не видит ))))

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#12

24.08.2016 16:17:02

Цитата
Вот чтобы ее каждый день не лопатить решил сделать макрос

В макросе можно установить фильтр и посчитать промежуточную сумму, зачем вставлять формулы
я не очень понимаю

 

Badamyan

Пользователь

Сообщений: 72
Регистрация: 21.07.2016

#13

24.08.2016 16:20:57

Цитата
Kuzmich написал: зачем вставлять формулы

ну например чтобы каждый раз, если поменять данные, не запускать макрос

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#14

24.08.2016 16:25:34

Цитата
если поменять данные, не запускать макрос

Макрос сделать на изменение определенных данных и ничего не надо нажимать, например.

 

Игорь Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#15

24.08.2016 16:36:33

а почему бы в 7-й колонке не написать:

Код
=ПРОМЕЖУТОЧНЫЕ.ИТОГИ(9;R[1]C:ИНДЕКС(C;СЧЁТЗ(C1)))

и перестать на этом париться с макросами, в которых не очень…

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

venom51

Пользователь

Сообщений: 237
Регистрация: 11.07.2014

#16

24.08.2016 18:00:00

Цитата
Игорь Гончаренко написал: а почему бы в 7-й колонке не написать

Потому что я хочу уйти от того чтобы каждый день вставлять формулы в новый файл, а вы меня к этому обратно возвращаете.

Цитата
Kuzmich написал: Макрос сделать на изменение определенных данных

Как вариант да, но предполагалось пройтись макросом по файлу всего 1 раз утром и больше не задействовать макросы в таблице.
Кстати изменение данных пользователем в данной таблице не предполагается, она чисто информационная, если только на изменение фильтра возможно повесить запуск макроса то это хорошая идея может быть, но опять же мне не нужно чтобы пользователи прибегали и спрашивали «Зачем Excel требует от меня включить макросы, там вирус?»  так что лучше обойтись.  

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#17

24.08.2016 18:10:43

Цитата
спрашивали «Зачем Excel требует от меня включить макросы, там вирус?»  так что лучше обойтись

Так формулу-то вы вставляете все равно макросом, так что они должны быть разрешены.

 

venom51

Пользователь

Сообщений: 237
Регистрация: 11.07.2014

#18

25.08.2016 10:42:09

Макросом я обрабатываю файл и выкладываю в общий доступ уже готовый файл без макросов)
макрос в PERSONAL.XLSB вообще лежит

Can anyone solve this?

Sub test

Dim i as integer

For I = 1 to 10
   ActiveCell.Offset(0, 2).Formula = "=Sum(E15,&i&)"
Next I

End Sub

Community's user avatar

asked Feb 28, 2017 at 8:08

gonzalloe's user avatar

1

your actual goal is unclear

you may want to start form this code

Sub test()
    Dim i As Integer

    For i = 1 To 10
       cells(i, 4).Formula = "=Sum(E" & i & ":E15)"
    Next
End Sub

and adjust it to your needs, knowing that:

  • it currently writes in cells «D1:D10»

    since cells(i, 4) references a cell in 4th column (i.e.: column «D») 4 and i row, and we’re inside a loop where i is looping through 1 to 10

    so if:

    • you want to reference a different column then just change 4 to the proper column index

    • you want to reference a different row then just change i to the proper row index (may be some i+2 if you need to iterate through 1 to 10 but start writing from row 3)

  • the formula written in those cells is:

    =SUM(E1:E15) in D1,

    =SUM(E2:E15) in D2,

    ….

    =SUM(E10:E15) in D10.

    so just change "=Sum(E" & i & ":E15)" to your actual needs

answered Feb 28, 2017 at 8:28

user3598756's user avatar

user3598756user3598756

28.8k4 gold badges17 silver badges28 bronze badges

2

You’re close, trying to use ampersands (&) to concatenate strings.

ActiveCell.Offset(0, 2).Formula = "=Sum(E15," & i & ")"

Use the ampersands between strings to merge them, not inside strings.

answered Feb 28, 2017 at 8:11

Wolfie's user avatar

WolfieWolfie

26.8k7 gold badges26 silver badges54 bronze badges

2

FormulaLocal = = «»=T»&C&»/(O»&C&»*100)»»

  1. Явная ошибка — лишний знак «равно».

  2. Вторая ошибка — в данном случае двойные кавычки не нужны.

Здесь формула — текст, который при выполнении кода будет преобразован в формулу и записан на лист. Текст — часть кода, заключаемая в кавычки. Кавычки могут присутствовать и внутри текста. Такие кавычки пишутся двойными, чтобы показать, что они не являются гранцами текста:

sStr = "ООО ""Рога и Копыта"" забодало налоговую"

Текст может быть составлен из нескольких фрагментов, каждый из которых заключается в кавычки:

sStr = "ООО " & """Рога и Копыта"" забодало" & " налоговую"
  1. Оператор дожен быть оператором, а не служебным символом.

Символ & — знак конкатенации, оператор объединения. Если символ не отделить пробелами от сцепляемых фрагментов, редактор будет ругаться — оператор должен быть записан отдельно:

Cells(5, 1).FormulaLocal = "=T" & C & "/(O" & C & "*100)"

Но & — это и служебный символ, обозначающий тип переменной Long. В этом случае переменная и символ типа нераздельны:

Dim i&
i& = Sheets.Count
такая запись тоже правильна: 
Cells(5, 1).FormulaLocal = "=T" & C& & "/(O" & C& & "*100)" 
  1. Не ошибка. FormulaLocal — если требуется записать формулу с функциями локальной версии. Для простых формул достаточно Formula или FormulaR1C1

  2. Почти ошибка. С — зарезервированный символ, указатель столбца в ссылках формата R1C1. Нужно избегать применения зарезервированных символов для обозначения переменных, иначе возможны конфликты.

is there a more elegant (simpler) way to put a variable in .formula? I don’t want to use .formulaR1C1

I have this code:

Range("C8").Select
Selection.End(xlDown).Select
PosR = ActiveCell.Row
KonR = PosR - 2
Range("N" & PosR).Select
aAddress = Range("$N$9").Address & ":" & Range("$N$" & KonR).Address
ActiveCell.Formula = "=SUM(" & aAddress & ")"

Obviously I want to put =SUM($N$9:$N$101) (101 is the last cell minus 2) into that cell and this code does the job. But I just want to be sure that this is the easiest way to do this.

asked Jul 26, 2017 at 8:14

Petanek333's user avatar

The easiest way is to skip all that selecting and those variables

PosR = Range("C8").End(xlDown).Row
Range("N" & PosR).Formula = "=SUM($N$9:$N$" & PosR - 2 & ")"

Edit: to be more explicit, the easiest way is to use FormulaR1C1 but you said you didn’t want to, so…

answered Jul 26, 2017 at 8:19

Rory's user avatar

RoryRory

32.4k5 gold badges31 silver badges34 bronze badges

3

You can use the code below (without using Select and ActiveCell:

PosR = Range("C8").End(xlDown).Row
KonR = PosR - 2

Range("N" & PosR).Formula = "=SUM(" & Range("$N$9").Address & ":" & Range("$N$" & KonR).Address & ")"

Or, the much simplier version:

Range("N" & PosR).Formula = "=SUM($N$9:$N$" & KonR & ")"

answered Jul 26, 2017 at 8:18

Shai Rado's user avatar

Shai RadoShai Rado

32.9k6 gold badges26 silver badges51 bronze badges

Well you should be trying to avoid using Select in VBA. You’ve made the actual inclusion of a variable in the .Formula about a simple as it gets, but your whole code could be simplified:

PosR = Range("C8").End(xlDown).Row
Range("N" & PosR).Formula = "=SUM($N$9:$N$" & PosR - 2 & ")"

Really you should be fully qualifying your ranges too, like so

With ThisWorkbook.Sheets("Sheet1")
    PosR = .Range("C8").End(xlDown).Row
    .Range("N" & PosR).Formula = "=SUM($N$9:$N$" & PosR - 2 & ")"
End With

And if you have blank cells in column C then your use of xlDown will fail to find the last cell. You may want to look at ways of finding the last cell in VBA or simply use

' Again, preferably fully qualified
Range("C" & Rows.Count).End(xlUp).Row 

answered Jul 26, 2017 at 8:21

Wolfie's user avatar

WolfieWolfie

26.8k7 gold badges26 silver badges54 bronze badges

Range("$N$9").Address gives exactly "$N$9".

Range("N9").Address gives the same. Thus, it is a bit overwork. Check out the first two debug.print in the sample below.

Thus, once you calculate the last row and assign value to it lngLast, it is possible to get the formula like this:
"=SUM(N9:N" & lngLast & ")"

Option Explicit
Public Sub TestMe()

    Dim strA        As String
    Dim lngLast     As Long

    strA = Range("$N$9").Address
    Debug.Print strA = "$N$9"

    strA = Range("N9").Address
    Debug.Print strA = "$N$9"

    lngLast = Range("N" & Rows.Count).End(xlUp).Row - 2
    ActiveCell.Formula = "=SUM(N9:N" & lngLast & ")"

End Sub

Good morning, everyone :)

answered Jul 26, 2017 at 8:32

Vityata's user avatar

VityataVityata

42.4k8 gold badges55 silver badges98 bronze badges

Цитата
Сообщение от Step_UA
Посмотреть сообщение

внутрь ДВССылки

где установить? в VBA? там действительно переменная имеет нужное значение. Но суть в том, чтобы создать формулу, составными частями которой являются амперсанты.

Смысл функции ДВССЫЛ заключается в создании ссылки по тексту в данном случае в стиле R1C1.
У меня в формуле стоит текст

Цитата
Сообщение от AndreA SN
Посмотреть сообщение

«»R2C:R»» &

, после которого следует закрывающая текстовую часть кавычка, после нее амперсант объединения значения переменной с текстом, сама переменная, снова амперсант объединения, открывающая кавычка, амперсант текстовый и далее по формуле.
Вся конструкция, описанная здесь, выглядит как

Цитата
Сообщение от AndreA SN
Посмотреть сообщение

«»R2C:R»» &» & CStr(_всего) & «& «»C»»

На самом деле лишнего нет ничего. «Лишние амперсанты выполняют разные функции и «принадлежат» разным исполнителям: внешние — EXCEL, внутренние — VBA.

Вообще мы привыкли писать на стиле «A1», поэтому нам тяжко переключаться. Но оказывается R1C1- крутая штука. особенно при копировании

Вставка формулы со ссылками в стиле 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 одинаковы, их можно вставить сразу, без использования цикла, во весь диапазон.


Понравилась статья? Поделить с друзьями:
  • Vba excel формула листа
  • Vba excel указать лист
  • Vba excel указание листа
  • Vba excel узнать размерность массива
  • Vba excel узнать последнюю ячейку