Формулу в массив vba excel

shavka

132 / 15 / 2

Регистрация: 27.11.2013

Сообщений: 509

1

Забить формулы в массив

07.11.2015, 06:56. Показов 2741. Ответов 15

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

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

Visual Basic
1
2
3
4
5
6
Dim ar8 As Variant
ar8 = Range(Cells(8, 8), Cells(clEnd, 8)).Value
 
For x = 1 To UBound(ar8)
ar8(x, 1).FormulaR1C1 = "=(RC[-1]-RC[-2])*RC[-3]"
Next x

Не гоняется ни фига. Object requied. Что не так? Переменная же Variant.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

07.11.2015, 06:56

Ответы с готовыми решениями:

Забить данные в массив по условию — где ошибка?
Есть столбик с датами, которые могут повторяться. Он отсортирован по убыванию. Нужно создать список…

Как забить в одномерный массив переменные, которые получаются в ходе решения ?
Здравствуйте.
Подскажите, пожалуйста, новичку в VBA, как забить в массив переменные, которые…

Забить массив из файла в программу
Здравствуйте, программисты, проблема такая, дан файл нам, там массив вида:
120 145 365 156 …

Как забить строку в массив символов?
нужно разобрать строку типа String^ посимвольно и последовательно присвоить каждый символ элементу…

15

Alex Dark

Наблюдатель

457 / 192 / 33

Регистрация: 01.05.2012

Сообщений: 1,028

07.11.2015, 08:01

2

Я ни чего не понял из того что ты написал.

но формулы я вставляю так

Visual Basic
1
2
3
Range(Cells(8, 8), Cells(12, 12)).FormulaR1C1 = "=(RC[-1]-RC[-2])*RC[-3]"
 
Selection.FormulaR1C1 = "=(RC[-1]-RC[-2])*RC[-3]"

Добавлено через 40 минут
Если ты только об этом, то так

Visual Basic
1
2
3
4
Dim ar8 As Range
Set ar8 = Range(Cells(8, 8), Cells(16, 8))
 
ar8.FormulaR1C1 = "=(RC[-1]-RC[-2])*RC[-3]"



1



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

07.11.2015, 10:40

3

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

Как заполнить массив одинаковыми формулами?

Если одинаковой формулой, то можно и так :

Visual Basic
1
2
3
4
5
6
Dim clEnd As Long, x As Long, ar8 As Variant 'ar8() As String
clEnd = 100: ReDim ar8(1 To clEnd, 1 To 1)
 
For x = 1 To clEnd 'UBound(ar8)
    ar8(x, 1) = "=(RC[-1]-RC[-2])*RC[-3]"
Next

Если же эта формула уже наличествует в ячейках указанного диапазона, то цикл не нужен :

Visual Basic
1
2
Dim ar8 As Variant, clEnd As Long: clEnd = 100
ar8 = Range(Cells(8, 8), Cells(clEnd, 8)).Formula '.FormulaR1C1



1



132 / 15 / 2

Регистрация: 27.11.2013

Сообщений: 509

07.11.2015, 13:40

 [ТС]

4

to Alex Dark: Так и я так делаю. Проблема в том, что это долго. Говорят, если сначала рейндж забить в массив, а потом прогнать цикл, то намного быстрее. А массив в цикле ни фига не бегает.

Добавлено через 1 час 37 минут
to Pashulka: кажись, я сам запутался, и всех запутал. Массив ведь содержит значения. А формулы могут содержаться в рейндже. Тут массив наверное, ваще не катит. Или массив должен состоять из рейнджей, если такое возможно.



0



The_Prist

1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

07.11.2015, 14:07

5

Присмотритесь к сообщению pashulka.

Visual Basic
1
ar8 = Range(Cells(8, 8), Cells(clEnd, 8)).Formula '.FormulaR1C1

эта строка как раз заполняет массив именно формулами(не значениями!) указанного диапазона. Даже если они не одинаковые — они как и значения будут содержаться в массиве. В Вашем случае, скорее всего нужна именно FormulaR1C1.



1



Alex Dark

Наблюдатель

457 / 192 / 33

Регистрация: 01.05.2012

Сообщений: 1,028

07.11.2015, 16:11

6

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

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

без конкретных формул, просто теоретически
Вариант 1: ты в массив забил range. У тебя каждый элемент массива какая-то ячейка из области range.
Не вижу смысла перебирать ячейки, проще делать действия с range.

Вариант 2 Каждый элемент массива это какой то range
В этом есть какой то смысл. Но будет ли это быстрее?
Не уверен. Хотя почему бы и нет. Зависит от алгоритма

Добавлено через 15 минут
если только вот так

Visual Basic
1
2
3
4
5
6
ar1 = Range(Cells(1, 8), Cells(clEnd, 8)).Formula
For x = 1 To UBound(ar1)
    ar1(x, 1) = "=" + Str(x + 1)
Next
 
Range(Cells(1, 8), Cells(clEnd, 8)).Formula = ar1



1



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

07.11.2015, 18:06

7

Я обычно перед тем, как решаю задачу — пытаюсь эту задачу понять: что куда зачем, в чём вообще смысл?
Если не понял — не решаю…



0



132 / 15 / 2

Регистрация: 27.11.2013

Сообщений: 509

07.11.2015, 18:12

 [ТС]

8

The_Prist, не получается у меня как у Pashulka. Объект требует. И потом переменная clEnd не совпадает с концом массива. Может, в этом проблема? clEnd — переменная конца рейнджа, то бишь таблицы. Но сам массив начинается с 8-й строчки. Т.е. если в рейндже 50 строчек, то в массиве 50-8+1 элемент. Хотя вряд ли. Если вместо переменной поставить просто число в счетчике цикла, та же хрень — давай объект, дарагой



0



4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

07.11.2015, 18:59

9

Лучший ответ Сообщение было отмечено shavka как решение

Решение

shavka, Вы бы хоть выложили проблемный код или посмотрели этот пример …



1



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

07.11.2015, 19:02

10

Так зачем это всё? Нет проблем получить массив с текстом формул (только массивных там не будет, т.е. будут, но как обычные) — можно его как угдно перебирать циклами, а дальше что? Смысл?



0



132 / 15 / 2

Регистрация: 27.11.2013

Сообщений: 509

07.11.2015, 19:27

 [ТС]

11

Hugo121, да все проще простого. Есть таблица, она оччччень большая. Пример прилагается. Столбцы с цифрами — исходные данные. Пустые столбики, там, где строчки голубые как яйца дрозда — там должны быть одинаковые формулы забиты. Желтые строчки — итоговые. Но это фигня, итоги потом можно пощитать. При заполнении столбиков их можно в общий массив взять. Расчет через FormulaR1C1 работает очень долго.



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

07.11.2015, 19:34

12

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



0



132 / 15 / 2

Регистрация: 27.11.2013

Сообщений: 509

07.11.2015, 19:55

 [ТС]

13

Hugo121, забил формулки



0



132 / 15 / 2

Регистрация: 27.11.2013

Сообщений: 509

08.11.2015, 10:18

 [ТС]

14

Люди!!!!! Все заработало, литает, как питичка!!!! Разобрался наконец. И с рейнджами литает, и с массивами. А то уже хотел идти топиться…. Спасибо фсем за помочь в работе с труднообучаемыми дилетантами!



0



Наблюдатель

457 / 192 / 33

Регистрация: 01.05.2012

Сообщений: 1,028

08.11.2015, 10:23

15

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

Люди!!!!! Все заработало, литает, как питичка!!!! …
Спасибо фсем за помочь в работе …

Да не за что…
В чем проблема то была? Опытом поделись, для тех кто столкнётся с подобным после тебя



0



132 / 15 / 2

Регистрация: 27.11.2013

Сообщений: 509

08.11.2015, 11:17

 [ТС]

16

Проблема в моей дырявой голове…. с этим уже ничего не поделаешь. Переменную не ту взял, конечно цикл за границы массива вылетал. Сам макрос то ваще большой. Короче, это просто ошибка по невнимательности. Зато хоть понял, что есть массив. А скока нового узнал. Лафа ваще!



0



 

Marishka-x

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

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

Уважаемые форумчане, доброго времени суток!

Прошу Вас помочь разобраться с кодом.
Задача: есть таблица с данными и в первый столбец необходимо записать формулу с помощью массива через VBA.
У меня именно проблема с заполнением массива формулой. Во вложении файл пример с кодом.

Прошу Вас подсказать, что не так делаю….

Спасибо.

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

  • массив.xlsm (15.41 КБ)

 

Hugo

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

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

#2

01.05.2016 15:45:39

1:

Код
ReDim xKey(1 To nRow, 1 To 1)

2:

Код
    'Заполняем массив
    xKey(1, 1) = "=" & Cells(1, 1).Value
    
' xKey(nRow, 1) = Cells(1, 1)
' "=R[2]+R[3]"
 For iRow = 2 To nRow
   xKey(iRow, 1) = "=" & Cells(1, 1).Value
Next

Вообще конечно можно заполнять иначе, оптимальнее.
Без массива:

Код
    Dim r As Range: Set r = Cells(iStart, 1)
    With r
        .Value = "=" & Cells(1, 1).Value
        Set rngFinish = Range(r, Cells(nRow + iStart - 1, 1))
        '        MsgBox rngFinish.Address
        .AutoFill Destination:=rngFinish
    End With

Изменено: Hugo01.05.2016 15:53:29

 

Михаил С.

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

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

#3

01.05.2016 15:49:55

через массив вставить формулу не получится.
В каждую ячейку отдельно:

Код
Sub Вставка_Формул()
Dim cel As Range
For Each cel In Range(Cells(5, 1), Cells(Rows.Count, 2).End(xlUp).Offset(, -1))
    cel.FormulaR1C1 = "=" & Cells(1, 1).Value
Next
End Sub
 

Hugo

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

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

#4

01.05.2016 15:54:30

Цитата
Михаил С. написал: через массив вставить формулу не получится.

так ведь получилось :)
Вот через массив массивную — не получится.

 

Михаил С.

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

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

#5

01.05.2016 15:59:11

Цитата
Hugo написал: так ведь получилось

Да, проверил — получилось. И даже при стиле А1.
Просто я со вставкой формул через VBA ни когда не заморачивался.
Имхо, в коде посчитать как-то более комильфо.

 

Hugo

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

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

#6

01.05.2016 16:05:40

Более того — их можно не только вставить через массив, но взять в массив!
Проверьте — в конце можно сделать

Код
a = rngFinish.Formula

Только с массивными беда…

Изменено: Hugo01.05.2016 16:06:57

 

Marishka-x

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

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

#7

01.05.2016 16:11:02

Спасибо огромное!!! Получилось!

1 Introduction

The Range.FormulaArray property is used to set or return the array formula of a range and works in a very similar way to the more familiar Range.Formula property. However, because of the fact that it is working in relation to array formulas, there are more restrictions to consider and it is slightly more difficult to use. In the context of this article, an ‘array formula’ can be considered to mean a formula which has been entered into the formula bar using CTRL+SHIFT+ENTER rather than ENTER, so that it has been enclosed by parentheses { }.

2 Returning A Formula From A Range

If you want to return a formula from a single cell, the Range.Formula and Range.FormulaArray properties both return exactly the same result regardless of whether that cell contains an array formula or not.

However, they return different results when they are applied to a contiguous, multi-cell range. If the range is an array range (a block of cells that shares a single array formula) then the FormulaArray property returns that formula. If the range is not an array range but all of the cells contain identical formulas, then the FormulaArray property will also return that common formula. If the range is not an array range and the cells do not contain identical formulas, then the FormulaArray property returns Null. In all three scenarios, the Formula property will return an array of Variants, with each element of the array representing a formula from each cell within the range.

3 Setting An Array Formula In A Range

According to the Remarks section in ‘Range.FormulaArray Property’ topic in the VBA help file, R1C1 reference style rather than A1 reference style should be used when setting an array formula. This isn’t strictly true, although it may make problem-shooting runtime errors more straightforward. I find A1 notation much easier to use, so I will use it in all the following examples and I’ll discuss the R1C1 vs. A1 reference style question in the problem-shooting section later on.

3.1 Setting A Single-Cell Array Formula

The two points to note are that the = sign at the beginning of the string is optional and that you should not include the parentheses { } which will automatically surround the array formula once it has been assigned.

'put array formula {=FREQUENCY(A2:A10, B2:B4)} into cell E2
Sheet1.Range("E2").FormulaArray = "=FREQUENCY(A2:A10, B2:B4)"

 3.2 Setting A Multi-Cell Array Formula

If the intention is for the block of cells to be an array range (sharing a single formula) then it is as straightforward as the previous example:

'put array formula {=A2:A10="hello"} into cells C2:C10
Sheet1.Range("C2:C10").FormulaArray = "=A2:A10=""hello"""

If the intention is for each cell in the block to have its own array formula then a little bit more work has to be done. Let’s compare a few different options using this array formula as an example:

{=MAX(IF((($E$2:$E$10=A2)+($F$2:$F$10=B2))=1,$G$2:$G$10))}

This formula returns the maximum value in I2:I10 where either (but not both) of the corresponding cells in column G equals A2 or column H equals B2.

Because we want the A2 and B2 references to adjust as we ‘fill’ the array formula down the column, we cannot use the Range.FormulaArray property as we have previously.

The first option is to use a loop, for example:

Sub Option1()

    Dim r As Long

    For r = 2 To 5
        Sheet1.Cells(r, 3).FormulaArray = _
          "=MAX(IF((($E$2:$E$10=A" & CStr(r) & ")+($F$2:$F$10=B" & CStr(r) & "))=1,$G$2:$G$10))"
    Next r

End Sub

Every formula will be calculated irrespective of calculation settings with this option.

The second option is to populate the first cell and then copy/paste or fill it down:

Sub Option2()

    Sheet1.Range("C2").FormulaArray = _
        "=MAX(IF((($E$2:$E$10=A2)+($F$2:$F$10=B2))=1,$G$2:$G$10))"

    Sheet1.Range("C2:C5").FillDown

End Sub

This method will copy not only fill down the formulas but also the formats etc., which may be an advantage or a disadvantage depending on the situation. If calculations are set to manual then the ‘filled in’ cells will not be calculated. In my testing this method seems to be the fastest even with calculations set to automatic.

The third option is to populate the first cell and then copy it onto the clipboard and paste special formulas:

Sub Option3()

    Sheet1.Range("C2").FormulaArray = _
        "=MAX(IF((($E$2:$E$10=A2)+($F$2:$F$10=B2))=1,$G$2:$G$10))"

    Sheet1.Range("C2").Copy
    Sheet1.Range("C3:C5").PasteSpecial xlPasteFormulas
    Application.CutCopyMode = False

End Sub

This avoids copying down the formats etc. but in my testing this method seems to be much slower than all the others. If calculations are set to manual then the formulas that have been pasted will not be calculated.

A final option is as follows:

Sub Option4()

    With Sheet1.Range("C2:C5")
        'step 1
        .Formula = "=MAX(IF((($E$2:$E$10=A2)+($F$2:$F$10=B2))=1,$G$2:$G$10))"

        'step 2
        .FormulaArray = .FormulaR1C1
    End With

End Sub

The formula assignment in step 1 can be done with either the Formula or FormulaR1C1 properties. However, the FormulaR1C1 property must be used in step 2 because using the Formula property would cause the relative references to become distorted down the range. This approach performs fairly similarly to the Option 1 loop approach.

3.3 Problem-Shooting

When you’re trying to use the Range.FormulaArray property you may get the following error:

Run-time error ‘1004’: ‘Unable to set the FormulaArray property of the Range class’

 The message doesn’t contain a lot of useful information so determining the cause of the problem can be quite tough. Here are some reasons why you may be getting this error message:

3.3.1 You Are Trying To Change Part Of An Array Range

For example, this code will fail:

'create an array range
Sheet1.Range("C2:C10").FormulaArray = "=A2:A10=""hello"""

'try to change part of an array range gives an ERROR
Sheet1.Range("C2").FormulaArray = "=A2:A10=""hello"""

You have to clear the array range first or change the entire array range at the same time. You can determine if a cell is part of an array range as follows:

With Sheet1
    'create an array range
    .Range("C2:C10").FormulaArray = "=A2:A10=""hello"""

    With .Range("C2")
        'check if C2 is part of an array range
        If .HasArray Then

            'what is the full array range?
            MsgBox .CurrentArray.Address
        End If
    End With
End With
3.3.2 You Are Trying To Put An Array Formula Into A Merged Cell

It is possible to put an array formula into a cell and then merge that cell with other cells, but you cannot put an array formula into a cell that has already been merged. For example, this code will fail:

'create some merged cells
Sheet1.Range("C2:C10").Merge

'try to set an array formula gives an ERROR
Sheet1.Range("C2").FormulaArray = "=A2:A10=""hello"""

You can check if a cell is part of a merged range as follows:

With Sheet1
    'create some merged cells
    .Range("C2:C10").Merge

    'check if C2 is part of a merged range
    With .Range("C2")
        If .MergeArea.Address = .Address Then
            MsgBox "Cell not merged"
        Else
            MsgBox "Cell is merged, merged range = " & .MergeArea.Address
        End If
    End With
End With
3.3.3 Your Array Formula Contains A Syntax Error Such As A Missing Or Invalid Argument
With Sheet1.Range("E2")
    'this will give an error because argument in SUM() function missing
    .FormulaArray = "=SUM()"

    'this will give an error because SUMIF() cannot accept an array data type
    'passed into its 1st or 3rd parameters: http://support.microsoft.com/kb/214286/
    .FormulaArray = "=SUMIF((A2:A19=1)*(B2:B19),B2,C2:C19)"
End With
3.3.4 Your Array Formula Exceeds 255 Characters

This issue is described on the following MS Support article:

http://support.microsoft.com/kb/213181

More specifically:

  • If you are using A1 notation then the R1C1 equivalent must be less than 255 characters. I picked this information up from MS MVP Rory Archibald.
  • If you are using R1C1 notation then the formula must be less than 256 characters.

A workaround is using the Range.Replace() method as demonstrated at DailyDoseOfExcel:
http://www.dailydoseofexcel.com/archives/2005/01/10/entering-long-array-formulas-in-vba/

I always use a variable to build up and hold the string representing the array formula I want to apply. I find it makes my code easier to read and debug. Another useful tip is that the Application.ConvertFormula() method can be used to easily convert strings between A1 and R1C1 notation (as well as toggling relative or absolute referencing).

Вставить формулу массива через vba

Kongа

Дата: Среда, 20.01.2021, 04:14 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 24


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Здравствуйте, подскажите, пожалуйста как перевести формулу массива в vba, чтобы она использовала диапазон со второй до последней заполненной ячейки в столбце С листа1.
Вот формула:

Код

=СУММ(—(ЧАСТОТА(ЕСЛИ(Лист3!C2:C5<>»»;ЕСЛИ(Лист3!D2:D5=»Мята»;ПОИСКПОЗ(Лист3!C2:C5;Лист3!C2:C5;0)));СТРОКА(Лист3!C2:C5)-СТРОКА(Лист3!X2)+1)>0))

Пыталась занести ее через FormulaLocal
[vba]

Код

Лист2.[D3].FormulaLocal = «=СУММ(—(ЧАСТОТА(ЕСЛИ(‘Лист3’!C2:C» & LastRow & «<>»»»»;ЕСЛИ(‘Лист3’!D2:D» & LastRow & «=» & «»»Мята»»;ПОИСКПОЗ(‘Лист3′!C2:C» & LastRow & «;’Лист3’!C2:C» & LastRow & «;0)));СТРОКА(‘Лист3’!C2:C» & LastRow & «)-СТРОКА(‘Лист3’!X2)+1)>0))»

[/vba]
, но так она встает как обычная формула и тогда встает проблема как её заставить сделаться «массивной». Если делаю, через .FormulaArray, то не получается сделать её с LastRow.

К сообщению приложен файл:

1268884.xlsm
(16.2 Kb)

Сообщение отредактировал KongаСреда, 20.01.2021, 04:47

 

Ответить

китин

Дата: Среда, 20.01.2021, 08:38 |
Сообщение № 2

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016

а если попробовать вместо
[vba][/vba]
[vba][/vba]
поставить?


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

skyfors

Дата: Среда, 20.01.2021, 09:27 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

[vba]

Код

    With Worksheets(«Лист3»)
        LastRow = .Cells(.Rows.Count, 3).End(xlUp).Row
    End With

         Лист2.[D3].FormulaLocal = _
        «=СУММ(—(ЧАСТОТА(ЕСЛИ(Лист3!C2:C» & LastRow & «<>»»»»;ЕСЛИ(Лист3!D2:D» & LastRow & «=» & «»»Мята»»» & «;ПОИСКПОЗ(Лист3!C2:C» & LastRow & «;Лист3!C2:C» & LastRow & «;0)));СТРОКА(Лист3!C2:C» & LastRow & «)-СТРОКА(Лист3!C2» & «)+1)>0))»
     Лист2.[D3].FormulaArray = Лист2.[D3].Formula

[/vba]

 

Ответить

Содержание

  1. Свойство Range.FormulaLocal (Excel)
  2. Синтаксис
  3. Замечания
  4. Пример
  5. Поддержка и обратная связь
  6. Вставить формулу массива в Excel VBA
  7. Excel vba вставить формулу массива
  8. Excel vba вставить формулу массива
  9. Excel vba вставить формулу массива

Свойство Range.FormulaLocal (Excel)

Возвращает или задает формулу для объекта, используя ссылки в стиле A1 на языке пользователя. Для чтения и записи, Variant.

Синтаксис

expression. FormulaLocal

выражение: переменная, представляющая объект Range.

Замечания

Если ячейка содержит константу, это свойство возвращает эту константу. Если ячейка пуста, свойство возвращает пустую строку. Если ячейка содержит формулу, свойство возвращает формулу в виде строки в том же формате, в котором она будет отображаться в строке формул (включая знак равенства).

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

Если диапазон состоит из одного или двух измерений, можно установить формулу для массива Visual Basic с теми же размерами. Аналогично, можно поместить формулу в массив Visual Basic.

При установке формулы в диапазоне с несколькими ячейками все ячейки в диапазоне заполняются формулой.

Пример

Предположим, что вы ввели формулу =SUM(A1:A10) в ячейку A11 на листе на одном листе, используя версию Microsoft Excel на американском английском языке. Если затем открыть книгу на компьютере под управлением немецкой версии и выполнить следующий пример, в этом примере отображается формула =SUMME(A1:A10) в окне сообщения.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Вставить формулу массива в Excel VBA

Я записал формулу массива, чтобы вставить в VBA. Вот что у меня после записи. Однако когда я запускаю макрос, он просто не работает.

Из-за отрицательного знака?

Из формулы Excel

Ошибка 1004 — Невозможно установить свойство FormulaArray класса Range.

Прошу прощения за формат кода. Это выглядело ужасно.

Предел вставки массива формул составляет 255 символов с VBA.

Это означает, что мне нужно будет создать диапазоны для ячеек. Спасибо! Могу я спросить, откуда у вас эта информация. Я хочу это проверить.

Есть крайний вариант: использовать человека.

Пусть макрос поместит формулу в ячейку как String, а пользователь завершит процесс:

Я ПОНИМАЮ! Это творчески. Спасибо!

Или вы можете разбить длинную формулу на несколько частей и заменить ее в конце фактической формулой, как показано ниже .

Это еще один изящный способ сделать это! Потрясающие

@OliverBird Спасибо! Любая автоматизация будет неполной, если вы вынуждены попросить пользователя выполнить некоторые действия вручную. Поэтому для меня на самом деле нет никакого смысла вводить формулу как обычную формулу, а затем просить пользователя повторно ввести ее как формулу массива. 🙂

Источник

Excel vba вставить формулу массива

Модератор форума: китин, _Boroda_

Мир MS Excel » Вопросы и решения » Вопросы по VBA » Вычисление формулы массива через VBA и запись результата (Макросы/Sub)

Вычисление формулы массива через VBA и запись результата

matigovas Дата: Суббота, 31.03.2018, 08:26 | Сообщение № 1

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

и она работает как надо, но проблема в том, что таких формул стало очень много и они тормозят работу как Excel, так и людей. Формулы массива идут последовательно в строке начиная со столбца J и грубо говоря до «бесконечности». Самый простой выход, который я вижу — это вычисление формул массива через макрос по нажатию кнопки и помещение результата, скажем в ячейку J15 и дальше по строке. Т.е. само вычисление происходит внутри vba, а итогом становится лишь результат в ячейке.

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

и она работает как надо, но проблема в том, что таких формул стало очень много и они тормозят работу как Excel, так и людей. Формулы массива идут последовательно в строке начиная со столбца J и грубо говоря до «бесконечности». Самый простой выход, который я вижу — это вычисление формул массива через макрос по нажатию кнопки и помещение результата, скажем в ячейку J15 и дальше по строке. Т.е. само вычисление происходит внутри vba, а итогом становится лишь результат в ячейке. matigovas

Сообщение Народ с форума помог с задачей, но теперь она усложнилась. Есть формула массива

и она работает как надо, но проблема в том, что таких формул стало очень много и они тормозят работу как Excel, так и людей. Формулы массива идут последовательно в строке начиная со столбца J и грубо говоря до «бесконечности». Самый простой выход, который я вижу — это вычисление формул массива через макрос по нажатию кнопки и помещение результата, скажем в ячейку J15 и дальше по строке. Т.е. само вычисление происходит внутри vba, а итогом становится лишь результат в ячейке. Автор — matigovas
Дата добавления — 31.03.2018 в 08:26

Источник

Excel vba вставить формулу массива

Pelena, Елена, тут более широкий вопрос и не всегда СУММПРОИЗВ выручит.

adamm1603, по ссылке метод интересный и возможен, но не в вашем случае, так как придется разбивать формулу на части, при этом первая должна работать без второй. Если для единичной это можно сделать руками, то при том что вы хотите, автоматизировать трудно. Собственно там и написано
If the long formula can be broken into parts, where the second part can be replaced by a dummy function, this approach can be used…
дело в том что Replace тоже не всемогущь и не позволяет заменить что-то, на строку более 255 символов.

Pelena, Елена, тут более широкий вопрос и не всегда СУММПРОИЗВ выручит.

adamm1603, по ссылке метод интересный и возможен, но не в вашем случае, так как придется разбивать формулу на части, при этом первая должна работать без второй. Если для единичной это можно сделать руками, то при том что вы хотите, автоматизировать трудно. Собственно там и написано
If the long formula can be broken into parts, where the second part can be replaced by a dummy function, this approach can be used…
дело в том что Replace тоже не всемогущь и не позволяет заменить что-то, на строку более 255 символов. bmv98rus

Замечательный Временно просто медведь , процентов на 20.

Ответить

Сообщение Pelena, Елена, тут более широкий вопрос и не всегда СУММПРОИЗВ выручит.

adamm1603, по ссылке метод интересный и возможен, но не в вашем случае, так как придется разбивать формулу на части, при этом первая должна работать без второй. Если для единичной это можно сделать руками, то при том что вы хотите, автоматизировать трудно. Собственно там и написано
If the long formula can be broken into parts, where the second part can be replaced by a dummy function, this approach can be used…
дело в том что Replace тоже не всемогущь и не позволяет заменить что-то, на строку более 255 символов. Автор — bmv98rus
Дата добавления — 19.07.2019 в 09:53

Pelena Дата: Пятница, 19.07.2019, 10:08 | Сообщение № 25

Я говорю о данной конкретной формуле, ессно.

В своё время тоже делала через Replace. Были бы данные в файле, а то на пустых ячейках неинтересно проверять)

Я говорю о данной конкретной формуле, ессно.

В своё время тоже делала через Replace. Были бы данные в файле, а то на пустых ячейках неинтересно проверять) Pelena

«Черт возьми, Холмс! Но как. »
Ю-money 41001765434816

Ответить

Сообщение Я говорю о данной конкретной формуле, ессно.

В своё время тоже делала через Replace. Были бы данные в файле, а то на пустых ячейках неинтересно проверять) Автор — Pelena
Дата добавления — 19.07.2019 в 10:08

bmv98rus Дата: Пятница, 19.07.2019, 10:30 | Сообщение № 26

Замечательный Временно просто медведь , процентов на 20.

adamm1603 Дата: Пятница, 19.07.2019, 13:12 | Сообщение № 27

да согласен с вами, формулы будут меняться, последний метод не подойдёт, так как придётся ковырять каждый раз код, осталось три варианта:

1. через имена, думаю не менее проблемный)
2. СУММПРОИЗВ, стоит попробовать!
3. sendkeys, тут я пока в полном тупике, скоро английский выучу, читая буржуйские сайты)

да согласен с вами, формулы будут меняться, последний метод не подойдёт, так как придётся ковырять каждый раз код, осталось три варианта:

1. через имена, думаю не менее проблемный)
2. СУММПРОИЗВ, стоит попробовать!
3. sendkeys, тут я пока в полном тупике, скоро английский выучу, читая буржуйские сайты) adamm1603

да согласен с вами, формулы будут меняться, последний метод не подойдёт, так как придётся ковырять каждый раз код, осталось три варианта:

1. через имена, думаю не менее проблемный)
2. СУММПРОИЗВ, стоит попробовать!
3. sendkeys, тут я пока в полном тупике, скоро английский выучу, читая буржуйские сайты) Автор — adamm1603
Дата добавления — 19.07.2019 в 13:12

Источник

Excel vba вставить формулу массива

Модератор форума: китин, _Boroda_

Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как вставить формулу массива в видимые ячейки фильтра? (Макросы/Sub)

Как вставить формулу массива в видимые ячейки фильтра?

machodg Дата: Воскресенье, 03.12.2017, 17:33 | Сообщение № 1
Nic70y Дата: Воскресенье, 03.12.2017, 20:55 | Сообщение № 2
machodg Дата: Воскресенье, 03.12.2017, 21:35 | Сообщение № 3

Спасибо,
но к сожалению нужно макросом, т.к. этот фаил пересылается «чайникам», которые должны лишь в столбец «Н» вписать количества и дальше посмотреть на результат путем всего лишь клика на ячейку «Заказ». (на самом деле этот фаил — небольшой фрагмент от большой статистической системы)

Желаю доброй ночи.

Спасибо,
но к сожалению нужно макросом, т.к. этот фаил пересылается «чайникам», которые должны лишь в столбец «Н» вписать количества и дальше посмотреть на результат путем всего лишь клика на ячейку «Заказ». (на самом деле этот фаил — небольшой фрагмент от большой статистической системы)

Желаю доброй ночи. machodg

Сообщение Спасибо,
но к сожалению нужно макросом, т.к. этот фаил пересылается «чайникам», которые должны лишь в столбец «Н» вписать количества и дальше посмотреть на результат путем всего лишь клика на ячейку «Заказ». (на самом деле этот фаил — небольшой фрагмент от большой статистической системы)

Желаю доброй ночи. Автор — machodg
Дата добавления — 03.12.2017 в 21:35

Nic70y Дата: Понедельник, 04.12.2017, 07:40 | Сообщение № 4
machodg Дата: Понедельник, 04.12.2017, 12:49 | Сообщение № 5

«], т.е. SHIFT+CTRL+ENTER для перевода постой формулы в формулу массива. (посмотрите код в примере):

Set Myrange = Application.Range(Cells(FirstRow, 8), Cells(LastRow, 8))

For Each c In Myrange.SpecialCells(xlVisible)
c.Select
With c
SendKeys «^+

»
DoEvents
End With
Next c

«], т.е. SHIFT+CTRL+ENTER для перевода постой формулы в формулу массива. (посмотрите код в примере):

Set Myrange = Application.Range(Cells(FirstRow, 8), Cells(LastRow, 8))

For Each c In Myrange.SpecialCells(xlVisible)
c.Select
With c
SendKeys «^+

»
DoEvents
End With
Next c

«], т.е. SHIFT+CTRL+ENTER для перевода постой формулы в формулу массива. (посмотрите код в примере):

Set Myrange = Application.Range(Cells(FirstRow, 8), Cells(LastRow, 8))

For Each c In Myrange.SpecialCells(xlVisible)
c.Select
With c
SendKeys «^+

»
DoEvents
End With
Next c

machodg Дата: Понедельник, 04.12.2017, 13:03 | Сообщение № 6
Serge_007 Дата: Понедельник, 04.12.2017, 14:15 | Сообщение № 7
sboy Дата: Понедельник, 04.12.2017, 14:23 | Сообщение № 8
bmv98rus Дата: Понедельник, 04.12.2017, 15:46 | Сообщение № 9

Замечательный Временно просто медведь , процентов на 20.

Nic70y Дата: Понедельник, 04.12.2017, 16:07 | Сообщение № 10
_Boroda_ Дата: Понедельник, 04.12.2017, 17:59 | Сообщение № 11

Ответить

machodg Дата: Вторник, 05.12.2017, 02:04 | Сообщение № 12

[/vba]
Соответственно и цикл по заполнению ячеек не понадобился:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim FirstRow, LastRow As Integer

If Target.Address = «$G$2» And Cells(1, 1) = 1 Then
Cells(1, 1) = 0
Application.ScreenUpdating = 0
With Application
.Calculation = xlAutomatic
.MaxChange = 0.001
End With

If ActiveSheet.FilterMode = True Then
ActiveSheet.ShowAllData
End If

If Cells(3, 7) = 0 Or Cells(3, 7) = «» Then
FirstRow = Range(«G2»).End(xlDown).Row
Else
FirstRow = 3
End If
LastRow = Columns(7).Rows(1040000).End(xlUp).Row

‘1) Ustanovka AutoFiltra
Selection.AutoFilter Field:=7, Criteria1:=»<>«

‘2)Vstavka formul v vidimie iacheiki

Cells(FirstRow, 9) = _
«=IF(RC7<>0,IF(RC3=»»A»»,SUMIF(R3C3:R2186C3,»»A»»,R3C7:R2186C7),IF(RC3=»»B»»,SUMIF(R3C3:R2186C3,»»B»»,R3C7:R2186C7),SUMIF(R3C3:R2186C3,»»C»»,R3C7:R2186C7)))/SUM(R3C7:R2186C7),»»-«»)»

Range(Cells(FirstRow, 9), Cells(LastRow, 9)).Select
Selection.SpecialCells(xlCellTypeVisible).FillDown

Cells(FirstRow, 8).FormulaArray = _
«=SUM(IF(R3C[-5]:R2186C[-5]=RC[-5],R3C[-2]:R2186C[-2]/R3C[-3]:R2186C[-3]*R3C[-1]:R2186C[-1]))/(SUM(IF(R3C[-5]:R2186C[-5]<>«»»»,R3C[-2]:R2186C[-2]/R3C[-3]:R2186C[-3]*R3C[-1]:R2186C[-1])))»

Range(Cells(FirstRow, 8), Cells(LastRow, 8)).Select
Selection.SpecialCells(xlCellTypeVisible).FillDown

End If
Cells(1, 1) = 1
Application.ScreenUpdating = 1
End Sub

Еще раз большое спасибо.
Всем желаю успехов.

[/vba]
Соответственно и цикл по заполнению ячеек не понадобился:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim FirstRow, LastRow As Integer

If Target.Address = «$G$2» And Cells(1, 1) = 1 Then
Cells(1, 1) = 0
Application.ScreenUpdating = 0
With Application
.Calculation = xlAutomatic
.MaxChange = 0.001
End With

If ActiveSheet.FilterMode = True Then
ActiveSheet.ShowAllData
End If

If Cells(3, 7) = 0 Or Cells(3, 7) = «» Then
FirstRow = Range(«G2»).End(xlDown).Row
Else
FirstRow = 3
End If
LastRow = Columns(7).Rows(1040000).End(xlUp).Row

‘1) Ustanovka AutoFiltra
Selection.AutoFilter Field:=7, Criteria1:=»<>«

‘2)Vstavka formul v vidimie iacheiki

Cells(FirstRow, 9) = _
«=IF(RC7<>0,IF(RC3=»»A»»,SUMIF(R3C3:R2186C3,»»A»»,R3C7:R2186C7),IF(RC3=»»B»»,SUMIF(R3C3:R2186C3,»»B»»,R3C7:R2186C7),SUMIF(R3C3:R2186C3,»»C»»,R3C7:R2186C7)))/SUM(R3C7:R2186C7),»»-«»)»

Range(Cells(FirstRow, 9), Cells(LastRow, 9)).Select
Selection.SpecialCells(xlCellTypeVisible).FillDown

Cells(FirstRow, 8).FormulaArray = _
«=SUM(IF(R3C[-5]:R2186C[-5]=RC[-5],R3C[-2]:R2186C[-2]/R3C[-3]:R2186C[-3]*R3C[-1]:R2186C[-1]))/(SUM(IF(R3C[-5]:R2186C[-5]<>«»»»,R3C[-2]:R2186C[-2]/R3C[-3]:R2186C[-3]*R3C[-1]:R2186C[-1])))»

Range(Cells(FirstRow, 8), Cells(LastRow, 8)).Select
Selection.SpecialCells(xlCellTypeVisible).FillDown

End If
Cells(1, 1) = 1
Application.ScreenUpdating = 1
End Sub

Еще раз большое спасибо.
Всем желаю успехов. machodg

[/vba]
Соответственно и цикл по заполнению ячеек не понадобился:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim FirstRow, LastRow As Integer

If Target.Address = «$G$2» And Cells(1, 1) = 1 Then
Cells(1, 1) = 0
Application.ScreenUpdating = 0
With Application
.Calculation = xlAutomatic
.MaxChange = 0.001
End With

If ActiveSheet.FilterMode = True Then
ActiveSheet.ShowAllData
End If

If Cells(3, 7) = 0 Or Cells(3, 7) = «» Then
FirstRow = Range(«G2»).End(xlDown).Row
Else
FirstRow = 3
End If
LastRow = Columns(7).Rows(1040000).End(xlUp).Row

‘1) Ustanovka AutoFiltra
Selection.AutoFilter Field:=7, Criteria1:=»<>«

‘2)Vstavka formul v vidimie iacheiki

Cells(FirstRow, 9) = _
«=IF(RC7<>0,IF(RC3=»»A»»,SUMIF(R3C3:R2186C3,»»A»»,R3C7:R2186C7),IF(RC3=»»B»»,SUMIF(R3C3:R2186C3,»»B»»,R3C7:R2186C7),SUMIF(R3C3:R2186C3,»»C»»,R3C7:R2186C7)))/SUM(R3C7:R2186C7),»»-«»)»

Range(Cells(FirstRow, 9), Cells(LastRow, 9)).Select
Selection.SpecialCells(xlCellTypeVisible).FillDown

Cells(FirstRow, 8).FormulaArray = _
«=SUM(IF(R3C[-5]:R2186C[-5]=RC[-5],R3C[-2]:R2186C[-2]/R3C[-3]:R2186C[-3]*R3C[-1]:R2186C[-1]))/(SUM(IF(R3C[-5]:R2186C[-5]<>«»»»,R3C[-2]:R2186C[-2]/R3C[-3]:R2186C[-3]*R3C[-1]:R2186C[-1])))»

Range(Cells(FirstRow, 8), Cells(LastRow, 8)).Select
Selection.SpecialCells(xlCellTypeVisible).FillDown

End If
Cells(1, 1) = 1
Application.ScreenUpdating = 1
End Sub

Еще раз большое спасибо.
Всем желаю успехов. Автор — machodg
Дата добавления — 05.12.2017 в 02:04

Источник

Adblock
detector

Понравилась статья? Поделить с друзьями:
  • Формулу excel содержащую абсолютный адрес ячейки
  • Формулой в ms excel называют совокупность
  • Формулой в excel называется последовательность символов которая начинается со знака равенства
  • Формули в excel для обчислення
  • Формуле символ перенос строки excel