shavka 132 / 15 / 2 Регистрация: 27.11.2013 Сообщений: 509 |
||||
1 |
||||
Забить формулы в массив07.11.2015, 06:56. Показов 2741. Ответов 15 Метки нет (Все метки)
Как заполнить массив одинаковыми формулами? Нужны именно формулы, а не значения. Во всем инете, где пишут про массивы, сказано, что с массивами можно гонять те же циклы, что и с другими объектами. Ну вот, я, наивный, гоняю:
Не гоняется ни фига. Object requied. Что не так? Переменная же Variant.
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
07.11.2015, 06:56 |
Ответы с готовыми решениями: Забить данные в массив по условию — где ошибка? Как забить в одномерный массив переменные, которые получаются в ходе решения ? Забить массив из файла в программу Как забить строку в массив символов? 15 |
Alex Dark Наблюдатель 457 / 192 / 33 Регистрация: 01.05.2012 Сообщений: 1,028 |
||||||||
07.11.2015, 08:01 |
2 |
|||||||
Я ни чего не понял из того что ты написал. но формулы я вставляю так
Добавлено через 40 минут
1 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||||||
07.11.2015, 10:40 |
3 |
|||||||
Как заполнить массив одинаковыми формулами? Если одинаковой формулой, то можно и так :
Если же эта формула уже наличествует в ячейках указанного диапазона, то цикл не нужен :
1 |
132 / 15 / 2 Регистрация: 27.11.2013 Сообщений: 509 |
|
07.11.2015, 13:40 [ТС] |
4 |
to Alex Dark: Так и я так делаю. Проблема в том, что это долго. Говорят, если сначала рейндж забить в массив, а потом прогнать цикл, то намного быстрее. А массив в цикле ни фига не бегает. Добавлено через 1 час 37 минут
0 |
The_Prist 1337 / 308 / 74 Регистрация: 13.11.2008 Сообщений: 635 |
||||
07.11.2015, 14:07 |
5 |
|||
Присмотритесь к сообщению pashulka.
эта строка как раз заполняет массив именно формулами(не значениями!) указанного диапазона. Даже если они не одинаковые — они как и значения будут содержаться в массиве. В Вашем случае, скорее всего нужна именно FormulaR1C1.
1 |
Alex Dark Наблюдатель 457 / 192 / 33 Регистрация: 01.05.2012 Сообщений: 1,028 |
||||
07.11.2015, 16:11 |
6 |
|||
Говорят, если сначала рейндж забить в массив, а потом прогнать цикл, то намного быстрее без конкретных формул, просто теоретически Вариант 2 Каждый элемент массива это какой то range Добавлено через 15 минут
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 |
Люди!!!!! Все заработало, литает, как питичка!!!! … Да не за что…
0 |
132 / 15 / 2 Регистрация: 27.11.2013 Сообщений: 509 |
|
08.11.2015, 11:17 [ТС] |
16 |
Проблема в моей дырявой голове…. с этим уже ничего не поделаешь. Переменную не ту взял, конечно цикл за границы массива вылетал. Сам макрос то ваще большой. Короче, это просто ошибка по невнимательности. Зато хоть понял, что есть массив. А скока нового узнал. Лафа ваще!
0 |
Marishka-x Пользователь Сообщений: 8 |
Уважаемые форумчане, доброго времени суток! Прошу Вас помочь разобраться с кодом. Прошу Вас подсказать, что не так делаю…. Спасибо. Прикрепленные файлы
|
Hugo Пользователь Сообщений: 23257 |
#2 01.05.2016 15:45:39 1:
2:
Вообще конечно можно заполнять иначе, оптимальнее.
Изменено: Hugo — 01.05.2016 15:53:29 |
||||||
Михаил С. Пользователь Сообщений: 10514 |
#3 01.05.2016 15:49:55 через массив вставить формулу не получится.
|
||
Hugo Пользователь Сообщений: 23257 |
#4 01.05.2016 15:54:30
так ведь получилось |
||
Михаил С. Пользователь Сообщений: 10514 |
#5 01.05.2016 15:59:11
Да, проверил — получилось. И даже при стиле А1. |
||
Hugo Пользователь Сообщений: 23257 |
#6 01.05.2016 16:05:40 Более того — их можно не только вставить через массив, но взять в массив!
Только с массивными беда… Изменено: Hugo — 01.05.2016 16:06:57 |
||
Marishka-x Пользователь Сообщений: 8 |
#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 |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Содержание
- Свойство Range.FormulaLocal (Excel)
- Синтаксис
- Замечания
- Пример
- Поддержка и обратная связь
- Вставить формулу массива в Excel VBA
- Excel vba вставить формулу массива
- Excel vba вставить формулу массива
- 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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ответить Сообщение Pelena, Елена, тут более широкий вопрос и не всегда СУММПРОИЗВ выручит. adamm1603, по ссылке метод интересный и возможен, но не в вашем случае, так как придется разбивать формулу на части, при этом первая должна работать без второй. Если для единичной это можно сделать руками, то при том что вы хотите, автоматизировать трудно. Собственно там и написано |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|