Vba excel столбец умной таблицы в массив

 

tchack

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

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

#1

03.12.2022 22:10:33

Добрый вечер. Есть умная таблица Таблица1, в которой есть столбец «Столбец1».

Как правильно передать столбец умной таблицы в массив и вывести массив с помощью Debug.Print?

Код
Dim arr1
arr1 = Sheet1.Range("Таблица1[Столбец1]").Value

Dim i As Integer
For i = 1 To UBound(arr1)
   Debug.Print arr1(i) ' Здесь показывает ошибку Subscript out of range
Next i

Изменено: tchack03.12.2022 22:26:08

 

New

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

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

#2

03.12.2022 23:05:45

Код
Sub Test()
    Dim arr1 As Variant
    Dim i As Long '<- НЕ Integer
    
    arr1 = ActiveSheet.ListObjects("Таблица1").ListColumns("Column1").DataBodyRange.Value
        
    For i = 1 To UBound(arr1)
        Debug.Print arr1(i, 1) '<- arr1 - двумерный массив. У него есть строки и столбцы (один)
    Next i
End Sub

Изменено: New03.12.2022 23:07:04

 

tchack

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

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

 

tchack

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

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

А сам ActiveSheet.ListObjects(«Таблица1»).ListColumns(«Column1»).DataBodyRange.Value — это массив по сути??
Можно ли обратиться к ячейке в этом массиве?

 

tchack

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

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

ааа, понял.

ActiveSheet.ListObjects(«Таблица1»).DataBodyRange.Cells(1, Sheet1.ListObjects(«Таблица1»).ListColumns(«Column1»).Index)

 

tchack

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

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

#6

13.12.2022 20:57:33

Цитата
tchack написал:
ActiveSheet.ListObjects(«Таблица1»).DataBodyRange.Cells(1, Sheet1.ListObjects(«Таблица1»).ListColumns(«Column1»).Index)

Так можно получить значение из ячейки. А вот как обратиться к ячейке я не знаю. Подскажите, пожалуйста.

ActiveSheet.Cells(2, «A»).Value — тоже самое, что ActiveSheet.ListObjects(«Таблица1»).DataBodyRange.Cells(1, Sheet1.ListObjects(«Таблица1»).ListColumns(«Column1»).Index)
ActiveSheet.Cells(2, «A») —  тоже самое, что ActiveSheet.ListObjects(«Таблица1»).ListColumns(«Column1»).DataBodyRange(2)

Сам разобрался.

Изменено: tchack14.12.2022 19:14:34

 

New

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

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

#7

13.12.2022 23:57:47

tchack, вы о чём? Если у вас какой-то есть вопрос, задайте его и приложите файл-пример с вашей умной таблицей.

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

Уважаемые форумчане!

Пожалуйста, подскажите. Нужно в массив вставить столбец умной таблицы.
Вместо

Visual Basic
1
arr = [a2:a25]

Подставить

Visual Basic
1
arr = Range("Таблица1[DATE]")

Сам макрос

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Sub UserForm_Initialize()
 
****Dim dic, dic1, arr, i&
 
****arr = [a2:a25]
 
****Set dic = CreateObject("Scripting.Dictionary")
 
****Set dic1 = CreateObject("Scripting.Dictionary")
 
****For i = 1 To UBound(arr)
 
********dic.Item((Format(arr(i, 1), "mmmm"))) = 1
 
********dic1(Format(arr(i, 1), "yyyy")) = 1
 
****Next
 
*
 
****MonthComboBox.List = dic.keys
 
****YearComboBox.List = dic1.keys
 
End Sub

Начало темы с примером http://www.planetaexcel.ru/for… sage519192

Добавлено через 2 часа 6 минут
Вопрос решен элементарно

Visual Basic
1
arr = Range("Таблица1[DATE]").Value

Копирование значений из диапазона ячеек в массив и обратно с помощью VBA Excel. Простейшие примеры обмена значениями между диапазоном и массивом.

Как известно, VBA обрабатывает информацию в массивах значительно быстрее, чем в ячейках рабочего листа Excel. Поэтому, при работе с большими объемами данных, удобнее использовать массивы, чем наблюдать во время выполнения кода за мерцанием изображения на экране или просто смотреть в неизменную картинку, если обновление экрана отключено (Application.ScreenUpdating = False). Здесь обмен значениями между массивом и диапазоном ячеек будет вполне уместен.

Копирование значений из диапазона ячеек в массив

Чтобы скопировать значения из диапазона ячеек в массив, необходимо объявить переменную универсального типа (As Variant) и присвоить ей значения диапазона ячеек с помощью оператора присваивания (=):

Dim a As Variant

a = Range(«A1:C3»)

VBA Excel автоматически преобразует объявленную переменную в двумерный массив, соответствующий размерности диапазона ячеек, в нашем случае в массив — a(1 To 3, 1 To 3), и заполняет его значениями. Нумерация измерений массивов, созданных таким образом, начинается с единицы (1).

Можно, в этом случае, объявить сразу динамический массив, чтобы изначально указать, что эта переменная будет массивом. Так как свойством диапазона ячеек по умолчанию в VBA Excel является значение (Value), его можно в коде явно не указывать, но, при желании, можно и указать. Получится такая конструкция, аналогичная первой:

Dim a() As Variant

a = Range(«A1:C3»).Value

Стоит отметить, что для копирования значений из диапазона ячеек в массив можно использовать только обычную переменную или динамический массив универсального типа (Variant). VBA Excel автоматически преобразовывает их в двумерный массив. Если объявить двумерный массив с указанной заранее размерностью, использовать его не получится, будет сгенерирована ошибка с сообщением: Can’t assign to array (Нельзя назначать массив).

Копирование значений из массива в диапазон ячеек

Значения в диапазон ячеек добавляются из массива с помощью оператора присваивания (=):

Range(«A6:F15») = a

‘или

Range(«A6:F15»).Value = a

‘где a — переменная двумерного массива

Обратите внимание, что вставить значения в диапазон ячеек можно только из двумерного массива. Размерность такого массива может начинаться с нуля (0). Количество элементов в измерениях массива должно совпадать с количеством строк и столбцов в диапазоне ячеек. Если вам нужно вставить значения в одну строку или в один столбец, укажите размерность единственной строки или единственного столбца как (0) или (1 To 1), если вы хотите использовать нумерацию измерений своего массива с единицы. Например, для записи десяти значений из массива в одну строку можно объявить такой массив — massiv(9, 0), или в один столбец — massiv(0, 9).

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

Обмен значениями между двумя диапазонами

Обмен значениями можно осуществить в VBA Excel не только между массивом и диапазоном, но и между двумя диапазонами одинаковой размерности:

Range(«B2:D6») = Range(«G7:I11»).Value

У диапазона, являющегося источником значений, обязательно должно быть указано свойство Value.

Если диапазон ячеек, принимающий значения, по размеру меньше диапазона-источника, то он будет заполнен полностью:

Range(«B2:D6») = Range(«G5:L13»).Value

Если принимающий диапазон ячеек по размеру больше передающего, то часть его будет заполнена значениями диапазона-источника, а остальные ячейки — значениями #Н/Д:

Range(«B2:D6») = Range(«G7:H9»).Value

Простейшие примеры обмена значениями

Эти примеры составлены так, чтобы вам не пришлось совершать лишних действий, просто скопируйте их в свой модуль любой книги Excel с поддержкой макросов и запустите по очереди на выполнение.

Пример 1

Заполнение двумерного массива значениями и и их присвоение диапазону ячеек на рабочем листе Excel:

Sub Test1()

Dim a(2, 2) As Variant

a(0, 0) = «телепузик»

a(0, 1) = «журналист»

a(0, 2) = «ящерица»

a(1, 0) = «короед»

a(1, 1) = «утенок»

a(1, 2) = «шмель»

a(2, 0) = 200

a(2, 1) = 300

a(2, 2) = 400

Range(«A1:C3»).Value = a

End Sub

В данном случае переменная массива не обязательно должна быть универсального типа (As Variant), например, если бы в нее записывались только текстовые данные, ее можно было бы объявить как строковую (As String), и все бы работало.

Пример 2

Объявление обычной переменной универсального типа, присвоение ей значений из диапазона ячеек «A1:C3», записанных кодом первого примера, и вставка этих значений из полученного двумерного массива в диапазон «D10:F12»:

Sub Test2()

Dim a As Variant

a = Range(«A1:C3»)

Range(«D10:F12») = a

End Sub

Естественно, указанные диапазоны ячеек расположены на активном листе.

Пример 3

Допустим, на рабочем листе «Лист1» в ячейках «A1:A5» записано количество какого-то товара, а в ячейках «B1:B5» — его цена. Необходимо к этой информации добавить сумму каждого товара, умножив количество на цену, и перенести данные на «Лист2».

Sub Test3()

Dim a As Variant, i As Long

  a = Лист1.Range(«A1:C5»)

    For i = 1 To 5

      a(i, 3) = a(i, 1) _

      * a(i, 2)

    Next

  Лист2.Range(«A1:C5») = a

End Sub

Массив создан сразу с размерностью 5×3 с элементами под суммы. Даже если на первом листе в ячейках «C1:C5» есть какие-то значения, в массиве они будут перезаписаны результатами вычислений.

Копирование значений из массива в массив

Этот пример показывает, как в VBA Excel можно скопировать значения из одного массива в другой:

Sub Test4()

Dim arr1, arr2

    arr1 = Range(«G7:I11»)

    arr2 = arr1

    Range(«B2:D6») = arr2

End Sub


I want to put the values of a column in an array or list, without having to do a for loop.

So basically if I have:

Col A
---------
212
411
432

I want to put those values in an array or list. This is how I am thinking of doing it, but I don’t know the VBA syntax:

  1. reference Col A somehow (i.e. myColumn = column(«Col A»)
  2. insert the column values into the array(i.e. myArray = myColumn

I appreciate your help!

Community's user avatar

asked Apr 5, 2014 at 13:58

user3466555's user avatar

6

Try this

Sub Main()
 Dim arr() As Variant
 arr = Range("A1:A3")


For i = LBound(arr) To UBound(arr)
    Debug.Print arr(i, 1)
Next

End Sub

answered Apr 5, 2014 at 14:12

Santosh's user avatar

SantoshSantosh

12.1k4 gold badges41 silver badges72 bronze badges

3

Also when working wth a single column or row, you can use TRANSPOSE to create a 1D variant array, as opposed to the default 2D array (as Santosh did).

This 1D method is useful in combination with the Filter, Join and Split functions, such as Is it possible to fill an array with row numbers which match a certain criteria without looping?

Sub OneD()
Dim arr
arr = Application.Transpose(Range("A1:A3").Value2)
End Sub

or

Sub TwoD()
Dim arr
arr = Range("A1:A3").Value2
End Sub

Community's user avatar

answered Apr 7, 2014 at 3:39

brettdj's user avatar

brettdjbrettdj

54.6k16 gold badges113 silver badges176 bronze badges

Here is one way:

Sub dural()
    Dim myColumn As Range
    Dim myArray() as Variant
    Set myColumn = Range("A1:A3")
    myArray = myColumn
    For X = 1 To 3
        MsgBox myArray(X, 1)
    Next X
End Sub

There are ways to make the size of both the range and array variable.

answered Apr 5, 2014 at 14:07

Gary's Student's user avatar

Gary’s StudentGary’s Student

95.3k9 gold badges58 silver badges98 bronze badges

2

Группа: Проверенные

Ранг: Обитатель

Сообщений: 275


Репутация:

-6

±

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


Excel 2007

Добрый день, Подскажите каким образом можно решить следующую задачу.
Имеется умная таблица, как показано на рисунке

Известно имя человека содержащееся в столбце ФИО, необходимо получить массив predmet содержащий названия столбцов, если на пересечении
строки ФИО и столбца стоит «да» (сданные предметы человеком), при этом известно, что элемента будет 3.
[vba]

Код

Sub programm()
    Dim name As String
        name = «Иванов_2 Иван_2 Иванович_2»
    Dim predmet(3) As String

    End Sub

[/vba]

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

4774335.xlsm
(14.2 Kb)

Сообщение отредактировал Sashagor1982Суббота, 04.12.2021, 22:33

0 Clouse24 [2016-06-10 21:36:00]

У меня возникли трудности с возвратом набора столбцов из массива. Я вернул оператор выбора sql в свой вариантный массив. Он имеет 16 столбцов. Мне нужно захватить 12 из 16 столбцов, чтобы вернуться к моей таблице из определенной строки в массиве. Я использую этот код для получения строки:

Как мне получить только 12 столбцов, которые мне нужны? Столбцы являются последними 12 столбцами в массиве и всегда будут в том порядке, в котором они мне нужны.

Заранее спасибо за помощь!

arrays vba excel-vba excel variant

1 ответ

1 Решение [2016-06-10 22:22:00]

Это будет зависеть от формы массива.
Если это один размерный массив

Обратите внимание, что WorksheetFunction.Transpose(a) свопирует строки и столбцы массива.

Многомерные массивы будут зависеть от того, как они создаются.

Мы можем думать об этом так

Массивы запросов базы данных: a = recordset.getRows()

Dim a (10, 100) Redim Preserve a (10, Ubound (a) + 1)

Выравниваются так: (столбцы, строки), потому что вы можете только изменить размер последнего размера массива.
Таким образом, мы бы: a = Фильтр (выбор, ячейки (i, 1).Value, vbTextCompare) rows = UBound (a, 2) columns = UBound (a, 1) Ячейки (i, 1).Resize (столбцы, строки ) = Application.WorksheetFunction.Transpose(a)

Массивы массивов Excel являются базовыми 1 и имеют ту же форму, что и сам диапазон.

Таким образом, вы можете сделать это

Или a = Фильтр (выбор, ячейки (i, 1).Value, vbTextCompare) rows = UBound (a, 1) columns = UBound (a, 2) Ячейки (i, 1).Resize(rows, columns) = a

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

См. пример использования в прикреплённом файле.

——————— добавлено позже ———————-
То же самое, но в виде одной функции:

Пример использования (для перeстановки столбцов на листе Excel)

Вложение Размер Загрузки Последняя загрузка
SwapColumns.xls 53.5 КБ 154 1 год 11 недель назад
  • 14896 просмотров

Комментарии

Потому что в VBA это не обязательно. И на работе кода не сказывается.

Почему переменные не объявлены?

Никита, для этих целей я использую функцию объединения двумерных массивов:
http://excelvba.ru/code/CombineArrays

Каким образом добавить полученный массив в конец к уже существующему?

Спасибо, теперь разобрался.

Обратите внимание на последнюю строку в макросе — примере использования:

Range(«g1») — это ячейка, начиная с которой, будет вставлен новый массив на лист

А каким образом изменить диапазон для размещения переставленной матрицы ?

Копирование значений из диапазона ячеек в массив и обратно с помощью VBA Excel. Простейшие примеры обмена значениями между диапазоном и массивом.

Как известно, VBA обрабатывает информацию в массивах значительно быстрее, чем в ячейках рабочего листа Excel. Поэтому, при работе с большими объемами данных, удобнее использовать массивы, чем наблюдать во время выполнения кода за мерцанием изображения на экране или просто смотреть в неизменную картинку, если обновление экрана отключено (Application.ScreenUpdating = False). Здесь обмен значениями между массивом и диапазоном ячеек будет вполне уместен.

Копирование значений из диапазона ячеек в массив

Чтобы скопировать значения из диапазона ячеек в массив, необходимо объявить переменную универсального типа (As Variant) и присвоить ей значения диапазона ячеек с помощью оператора присваивания (=):

VBA Excel автоматически преобразует объявленную переменную в двумерный массив, соответствующий размерности диапазона ячеек, в нашем случае в массив — a(1 To 3, 1 To 3), и заполняет его значениями. Нумерация измерений массивов, созданных таким образом, начинается с единицы (1).

Можно, в этом случае, объявить сразу динамический массив, чтобы изначально указать, что эта переменная будет массивом. Так как свойством диапазона ячеек по-умолчанию в VBA Excel является значение (Value), его можно в коде явно не указывать, но, при желании, можно и указать. Получится такая конструкция, аналогичная первой:

Стоит отметить, что для копирования значений из диапазона ячеек в массив можно использовать только обычную переменную или динамический массив универсального типа (Variant). VBA Excel автоматически преобразовывает их в двумерный массив. Если объявить двумерный массив с указанной заранее размерностью, использовать его не получится, будет сгенерирована ошибка с сообщением: Can’t assign to array (Нельзя назначать массив).

Копирование значений из массива в диапазон ячеек

Значения в диапазон ячеек добавляются из массива с помощью оператора присваивания (=):

Обратите внимание, что вставить значения в диапазон ячеек можно только из двумерного массива. Размерность такого массива может начинаться с нуля (0). Количество элементов в измерениях массива должно совпадать с количеством строк и столбцов в диапазоне ячеек. Если вам нужно вставить значения в одну строку или в один столбец, укажите размерность единственной строки или единственного столбца как (0) или (1 To 1), если вы хотите использовать нумерацию измерений своего массива с единицы. Например, для записи десяти значений из массива в одну строку можно объявить такой массив — massiv(9, 0), или в один столбец — massiv(0, 9).

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

Простейшие примеры обмена значениями

Эти примеры составлены так, чтобы вам не пришлось совершать лишних действий, просто скопируйте их в свой модуль любой книги Excel с поддержкой макросов и запустите по-очереди на выполнение.

Пример 1

Заполнение двумерного массива значениями и и их присвоение диапазону ячеек на рабочем листе Excel:

В данном случае переменная массива не обязательно должна быть универсального типа (As Variant), например, если бы в нее записывались только текстовые данные, ее можно было бы объявить как строковую (As String), и все бы работало.

Пример 2

Объявление обычной переменной универсального типа, присвоение ей значений из диапазона ячеек «A1:C3», записанных кодом первого примера, и вставка этих значений из полученного двумерного массива в диапазон «D10:F12»:

Естественно, указанные диапазоны ячеек расположены на активном листе.

Пример 3

Допустим, на рабочем листе «Лист1» в ячейках «A1:A5» записано количество какого-то товара, а в ячейках «B1:B5» — его цена. Необходимо к этой информации добавить сумму каждого товара, умножив количество на цену, и перенести данные на «Лист2».

Массив создан сразу с размерностью 5×3 с элементами под суммы. Даже если на первом листе в ячейках «C1:C5» есть какие-то значения, в массиве они будут перезаписаны результатами вычислений.

VBA Excel. Диапазон ячеек и массив (обмен значениями) : 17 комментариев

«Еще стоит отметить, что объявить динамический массив можно, а вот использовать обычный двумерный массив с указанной заранее размерностью не получится.»
А почему? Не ясно где и как именно применяется двумерный массив и, соответственно, почему не получится его применить

Артем, двумерные массивы в VBA Excel используются без ограничений, как и массивы с другим количеством измерений. Тесты показали, что значения ячеек невозможно присвоить заранее объявленному двумерному массиву (естественно с размерностью, соответствующей диапазону ячеек):

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

Честно говоря выше так и не понял фразу даже после корректировки, а вот в комментарии вы все описали ясно и понятно. Спасибо!

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

Нурислам, в качестве ответа я добавил в статью «Пример 3».

Евгений.
Дано: массив (1 to 5, 1 to 10, 1 to 3)
по порядку:
1-5 периоды (пусть 1, 2, 3, 4, 5)
1-10 — Наименование товара (10 вариантов)
1-3 — цена в разных магазинах (цена1, цена2, цена3).
Пусть массив заполнен полностью.
Вопрос:
Как быстро вывести на экран (лист) данные массива относящиеся к периоду 2 (например)?
Спасибо!

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

Добрый день, Евгений!

Подскажите, пожалуйста, если необходимо вставить значения таблицы — перечень клиентов в соответствующие поля динамической таблицы. Как будет выглядеть?

Если динамическая таблица расположена в левом верхнем углу рабочего листа, используйте при вставке данных обычную адресацию рабочего листа вида Range(Cells(1, 1), Cells(2, 2)) .

Если динамическая таблица расположена не в левом верхнем углу рабочего листа, использование адресации умной таблицы вида Range(«Таблица1»).Range(Cells(1, 1), Cells(2, 2)) будет оправдано тем, что не придется изменять код при удалении строк выше таблицы и столбцов левее.

Евгений, спасибо большое, очень хорошее и полное объяснение! Только остался еще вопрос — чтобы рабоать с динамическим массивом после копирования из диапазона ячеек, его надо переопределить с preserve?

1) Вы можете переопределить массив с оператором Preserve, только учитывайте, что таким способом можно переопределить только последнее измерение массива. Если условно сопоставить двумерный массив с диапазоном ячеек, то расширение возможно только путем «добавления столбцов», количеству которых соответствует значение второго измерения.

2) Если вам нужно добавить «строки», вы можете присвоить массиву значения диапазона на нужное количество строк больше, чтобы использовать их для промежуточных расчетов. Например, вместо диапазона A1:C3 с нужными значениями можно присвоить массиву значения диапазона A1:C4 и элементы ИмяМассива(4, 1), ИмяМассива(4, 2), ИмяМассива(4, 3) использовать для промежуточных расчетов.

3) Для промежуточных расчетов можно объявить отдельный массив.

Евгений, благодарю от души! Удовольствие Вас читать, настолько все полно и понятно описано)

Спасибо, Ольга, за добрые слова и столь высокую оценку!

а как в строку через запятую это написать

Sub Test2()
Dim a As Variant
a = Range(«A1:C3»)
Range(«D10:F12») = a
End Sub

Привет, ASD!
В этом случае не обойтись без цикла:

Добрый день.
Есть массив A(1,3,5)

Как в вывести в ячейки на лист1 не только элементы этого массива, а еще и индексы.
То есть должно получиться так:
Строка с индексами: 1 2 3
Строка с элементами:1 3 5

Добрый день, Руслан!
Вывести индексы в ячейки можно с помощью циклов For. Next:

Формулировка задачи:

Доброго времени!
Есть двухмерный массив:

Записываю в массив мою таблицу

Теперь я с ComboBox1 забираю условие фильтра

Теперь хочу в моём массиве найти записи с значением a

Помогите пожалуйста…!

Код к задаче: «Запись таблицы в массив, и вывод нужных вариантов»

textual

Листинг программы

Dim a(), i&, x&
Columns("A:B").Select
a = Selection.Value[/BASIC]
Перебрать все значения в массиве:
[BASIC]s=UserForm1.ComboBox1.Text
For i = 3 To UBound(a) ' Шапка из 2-х строк
 if a(i,1) = s then ' сравниваем по столбцу "А" если "B" то a(i,2) = s
  x= x+1 
 cells(x,4) = s 'Выводим в 4-й столбец 
cells(x,5) = a(i,1)
cells(x,6) = a(i,2)
 
 end if
Next

Автор alexey_ava, 07 декабря 2017, 10:47

Подскажите, пожалуйста, у меня есть «умная» таблица. Мне необходимо получить из неё данные по критериям — имя столбца и имя строки. В таблице Эксель данный вопрос решаю через ИНДЕКС и ПОИСКПОЗ:
{=ИНДЕКС(Таблица1[Значение на начало часа];ПОИСКПОЗ(C$2&$A3&$B3;Таблица1[[Тег ]]&Таблица1[Дата]&Таблица1[Час];0))}.

Попытался аналогично прописать в макросе — не получается:

[1] Range(«c3»).value = INDEX(Таблица1[Значение на начало часа],MATCH(R2C&RC1&RC2,Таблица1[Тег ]&Таблица1[Дата]&Таблица1[Час],0)) — не работает
[2] Range(«c3») = application.INDEX(Таблица1,application.MATCH(Cells(2, 3),Таблица1[Тег],0),application.MATCH(Cells(3, 1)&Cells(3, 2),Таблица1[Дата]&Таблица1[Час],0)) — не работает

Я понимаю, что [2] — скорее более правильная формула, но не могу добиться нормальной ссылки на столбец «умной» таблицы.
Просто вставлять формулу в ячейку нет смысла, она очень тормозит процесс.

Не могу нигде найти по этому поводу информацию.

[вложение удалено администратором]



Администратор

  • Administrator
  • Сообщения: 2,252
  • Записан

Эксель-функции вида «application.INDEX» в данном случае не получится использовать в макросе, т.к. у вас формула массива. Макросу как-то надо указать, что нужно использовать эксель-функции так, как если бы используется формула массива, но такое сделать нельзя.

Остаётся два варианта:
1) Вставка формулы в ячейку, а затем превращение её в значение. В этом случае можно попробовать использовать:
ActiveCell.FormulaArray
2) Делать те же действия, что делает ваша формула, но без использования формул, а какими-нибудь другими способами: в программировании очень часто одно и то же можно делать несколькими способами.



Администратор

  • Administrator
  • Сообщения: 2,252
  • Записан

То есть второй способ отпадает. Остаётся первый с использованием «ActiveCell.FormulaArray» (вместо «ActiveCell» нужная ячейка).
Или вариант вообще без использования эксель-функций.



Администратор

  • Administrator
  • Сообщения: 2,252
  • Записан

Использование вашего первого способа. Вашу формулу оставил без изменений, только заключил в кавычки — в VBA формулу надо заключать в кавычки, а спереди нужно ставить знак равно:

Этот макрос вставляет формулу на активный лист в C3, а затем превращает формулу в значение, чтобы формулы не нагружали файл.

Sub макрос()

    With Range(«c3»)
        .FormulaArray = «=INDEX(Таблица1[Значение на начало часа],MATCH(R2C&RC1&RC2,Таблица1[Тег ]&Таблица1[Дата]&Таблица1[Час],0))»
        .Value = .Value
    End With

    End Sub

Кроме того. при работе с большим кол-вом формул или данных используйте формат «xlsb», он уменьшает размер файла и ускоряет работу формул. Формат xlsm нужен для взаимодействия с другими программами с помощью xml, а для всех остальных случаев не имеет смысла его использовать.


СПАСИБО!!!
А что значит — без использования эксель функций?



Администратор

  • Administrator
  • Сообщения: 2,252
  • Записан

Можно попробовать сделать макрос, в котором не будет эксель-функций. То есть сам VBA может сделать то же самое.



Администратор

  • Administrator
  • Сообщения: 2,252
  • Записан

Если вы что-то не поняли, то можете спросить.


  • Форум по VBA, Excel и Word

  • VBA, Excel

  • VBA, макросы в Excel

  • Excel VBA: Получение данных из «умной» таблицы с помощью макроса

Вопрос:

Я хочу поместить значения столбца в массив или список, не делая цикл for.

Так что в основном, если у меня есть:

Col A
---------
212
411
432

Я хочу поместить эти значения в массив или список. Вот как я думаю об этом, но я не знаю синтаксиса VBA:

  1. ссылка Col A как-то (т.е. myColumn = column (“Col A”)
  2. вставьте значения столбца в массив (т.е. myArray = myColumn

Я ценю вашу помощь!

Лучший ответ:

Вот один из способов:

Sub dural()
    Dim myColumn As Range
    Dim myArray() as Variant
    Set myColumn = Range("A1:A3")
    myArray = myColumn
    For X = 1 To 3
        MsgBox myArray(X, 1)
    Next X
End Sub

Существуют способы сделать размер переменной диапазона и массива.

Ответ №1

Попробуй это

Sub Main()
Dim arr() As Variant
arr = Range("A1:A3")


For i = LBound(arr) To UBound(arr)
Debug.Print arr(i, 1)
Next

End Sub

Ответ №2

Также при работе с одним столбцом или строкой вы можете использовать TRANSPOSE для создания 1D варианта массива, в отличие от 2D массива по умолчанию (как это делал Сантош).

Этот метод 1D полезен в сочетании с функциями Filter, Join и Split, такими как возможно заполнить массив номерами строк, которые соответствуют определенным критериям без цикла?

Sub OneD()
Dim arr
arr = Application.Transpose(Range("A1:A3").Value2)
End Sub

или

Sub TwoD()
Dim arr
arr = Range("A1:A3").Value2
End Sub

Like this post? Please share to your friends:
  • Vba excel столбец по имени
  • Vba excel столбец массива в excel
  • Vba excel столбец буквой
  • Vba excel сохранить файл в папку
  • Vba excel сохранить файл без подтверждения