Excel vba заполнить двумерный массив

In this Article

  • Multi-Dimensional Array (2D Arrays)
    • Declare a 2D Array
    • Populating a 2D Array
    • Populating a 2D Array from Excel data
    • Resizing using ReDim and Re-Dim Preserve

This tutorial will discuss 2-d and multi-dimensional arrays in VBA.

Multi-Dimensional Array (2D Arrays)

Multi-dimensional Arrays are arrays that contain more than one dimension, usually two or three dimensions, but arrays can have up to 32 dimensions.

Declare a 2D Array

To create an array with more than one dimension, use commas to define each separate dimension:

Dim intArr(2,3) as Integer

Populating a 2D Array

The code below will populate a 2D array, and then populate the rows and columns of a worksheet with the values in the array.

Sub Populate2D()
'declare the 2D array
   Dim intA(2, 3) As Integer
'declare variables
   Dim rw As Integer
   Dim col As Integer
'populate the array
   intA(0, 0) = 45
   intA(0, 1) = 50
   intA(0, 2) = 55
   intA(0, 3) = 60
   intA(1, 0) = 65
   intA(1, 1) = 70
   intA(1, 2) = 75
   intA(1, 3) = 80
   intA(2, 0) = 85
   intA(2, 1) = 90
   intA(2, 2) = 95
   intA(2, 3) = 100
'loop through the array and populate Excel
   For rw = 0 To 2
      For col = 0 To 3
         Cells(rw + 1, col + 1).Value = intA(rw, col)
      Next col
    Next rw
End Sub

Your Excel spreadsheet should then be populated as follows.

vba 2D array

Populating a 2D Array from Excel data

The code below will populate a 2D array from an Excel worksheet and then populate a different sheet with the data.

Sub Populate2D()
'Declare the worksheets
   Dim ws_Source As Worksheet
   Dim ws_Destination As Worksheet
'Declare the array
   Dim wsData(10, 2) As Variant
'Declare the variables
   Dim rw as Integer
   Dim col As Integer
'refer to the source sheet
Set ws_Source = Worksheets("Sheet1")
'get the information from the source sheet and populate the array
   For rw = LBound(wsData, 1) To UBound(wsData, 1)
      For col = LBound(wsData, 2) To UBound(wsData, 2)
         wsData(rw, col) = ws_Source.Range("A2").Offset(rw, col).Value
      Next col
   Next rw
'refer to the destation sheet
   Set ws_Destination = Worksheets("Sheet2")
' populate the destination sheet from the array
   For rw = LBound(wsData, 1) To UBound(wsData, 1)
      For col = LBound(wsData, 2) To UBound(wsData, 2)
         ws_Destination.Range("A1").Offset(rw,col).Value = wsData(rw, col)
      Next col
   Next rw
End Sub

Resizing using ReDim and Re-Dim Preserve

You can resize an array using ReDim (learn more).

Sub Resize2D()
'declare the array
   Dim varArray() as Variant
'declare the size of the array
   ReDim varArray(1, 2)
   varArray(0, 0) = "Mel Smith"
   varArray(0, 1) = "Fred Buckle"
   varArray(0, 2) = "Jane Eyre"
   varArray(1, 0) = "Accountant"
   varArray(1, 1) = "Secretary"
   varArray(1, 2) = "Doctor"
'redeclare the size of the array
   ReDim varArray(0, 1)
'repopulate the array 
   varArray(0, 0) = "Mel Smith"
   varArray(0, 1) = "Fred Buckle"
End Sub

When you redeclare the array, you will lose any data previously held in the array unless you use the ReDim Preserve Statement.

Sub Resize2D()
'declare the array 
   Dim varArray() as Variant
'declare the size of the array
   ReDim varArray(1, 2)
   varArray(0, 0) = "Mel Smith"
   varArray(0, 1) = "Fred Buckle"
   varArray(0, 2) = "Jane Eyre"
   varArray(1, 0) = "Accountant"
   varArray(1, 1) = "Secretary"
   varArray(1, 2) = "Doctor"
'redeclare the size of the array
   ReDim Preserve varArray(1, 3)
 'populate the array with additional values
   varArray(0, 3) = "Rob Barnes"
   varArray(1, 3) = "Plumber"
End Sub

You can only resize the last dimension of an Array if want to keep the original data in the Array with Re-Dim Preserve.

vba resize array

When you click debug, the error will be highlighted showing that the first dimension in the array is not the same as the first dimension when the array size was originally declared.

vba resize array error

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

Массивы в VBA Excel: одномерные, многомерные и динамические. Объявление и использование массивов. Операторы Public, Dim и ReDim. Функции Array, LBound, UBound.

Массивы – это множества однотипных элементов, имеющих одно имя и отличающиеся друг от друга индексами. Они могут быть одномерными (линейными), многомерными и динамическими. Массивы в VBA Excel, как и другие переменные, объявляются с помощью операторов Dim и Public. Для изменения размерности динамических массивов используется оператор ReDim. Массивы с заранее объявленной размерностью называют статическими.

Одномерные массивы

Объявление одномерных (линейных) статических массивов в VBA Excel:

Public Massiv1(9) As Integer

Dim Massiv2(1 To 9) As String

В первом случае публичный массив содержит 10 элементов от 0 до 9 (нижний индекс по умолчанию — 0, верхний индекс — 9), а во втором случае локальный массив содержит 9 элементов от 1 до 9.

По умолчанию VBA Excel считает в массивах нижним индексом нуль, но, при желании, можно сделать нижним индексом по умолчанию единицу, добавив в самом начале модуля объявление «Option Base 1».

Многомерные массивы

Объявление многомерных статических массивов в VBA Excel аналогично объявлению одномерных массивов, но с добавлением размерностей дополнительных измерений через запятую:

‘Массив двухмерный

Public Massiv1(3, 6) As Integer

‘Массив трехмерный

Dim Massiv2(1 To 6, 1 To 8, 1 To 5) As String

‘Массив четырехмерный

Dim Massiv3(9, 9, 9, 9) As Date

Третий массив состоит из 10000 элементов — 10×10×10×10.

Динамические массивы

Динамические массивы в VBA Excel, в отличие от статических, объявляются без указания размерности:

Public Massiv1() As Integer

Dim Massiv2() As String

Такие массивы используются, когда заранее неизвестна размерность, которая определяется в процессе выполнения программы. Когда нужная размерность массива становится известна, она в VBA Excel переопределяется с помощью оператора ReDim:

Public Massiv1() As Integer

Dim Massiv2() As String

ReDim Massiv1(1 To 20)

ReDim Massiv2(3, 5, 4)

При переопределении размерности массива вместо верхнего индекса можно использовать переменную:

Dim Massiv1() as Variant, x As Integer

x = 20

ReDim Massiv1(1 To x)

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

С помощью оператора ReDim невозможно изменить обычный массив, объявленный с заранее заданной размерностью. Попытка переопределить размерность такого массива вызовет ошибку компиляции с сообщением: Array already dimensioned (Массив уже измерен).

При переопределении размерности динамических массивов в VBA Excel теряются значения их элементов. Чтобы сохранить значения, используйте оператор Preserve:

Dim Massiv1() As String

операторы

ReDim Massiv1(5, 2, 3)

операторы

ReDim Preserve Massiv1(5, 2, 7)

Обратите внимание!
Переопределить с оператором Preserve можно только последнюю размерность динамического массива. Это недоработка разработчиков, которая сохранилась и в VBA Excel 2016. Без оператора Preserve можно переопределить все размерности.

Максимальный размер

Размер массива – это произведение длин всех его измерений. Он представляет собой общее количество элементов, содержащихся в данный момент в массиве.

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

Использование массивов

Приведу два примера, где не обойтись без массивов.

1. Как известно, функция Split возвращает одномерный массив подстрок, извлеченных из первоначальной строки с разделителями. Эти данные присваиваются заранее объявленному строковому (As String) одномерному динамическому массиву. Размерность устанавливается автоматически в зависимости от количества подстрок.

2. Данные в массивах обрабатываются значительно быстрее, чем в ячейках рабочего листа. Построчную обработку информации в таблице Excel можно наблюдать визуально по мерцаниям экрана, если его обновление (Application.ScreenUpdating) не отключено. Чтобы ускорить работу кода, можно значения из диапазона ячеек предварительно загрузить в динамический массив с помощью оператора присваивания (=). Размерность массива установится автоматически. После обработки данных в массиве кодом VBA полученные результаты выгружаются обратно на рабочий лист Excel. Обратите внимание, что загрузить значения в диапазон ячеек рабочего листа через оператор присваивания (=) можно только из двумерного массива.

Функции Array, LBound, UBound

Функция Array

Функция Array возвращает массив элементов типа Variant из первоначального списка элементов, перечисленных через запятую. Нумерация элементов в массиве начинается с нуля. Обратиться к элементу массива можно, указав в скобках его номер (индекс).

Sub Test1()

Dim a() As Variant

a = Array(«text», 25, «solo», 35.62, «stop»)

MsgBox a(0) & vbNewLine & a(1) & vbNewLine _

& a(2) & vbNewLine & a(3) & vbNewLine & a(4)

End Sub

Скопируйте код в модуль VBA Excel и запустите его на выполнение. Информационное сообщение MsgBox покажет значения массива, извлеченные по индексу.

Функция LBound

Функция LBound возвращает значение типа Long, равное наименьшему (нижнему) доступному индексу в указанном измерении массива.
Синтаксис:
LBound (arrayname[, dimension])

  • arrayname — это имя переменной массива, является обязательным аргументом;
  • dimension — это номер измерения массива, необязательный аргумент, по умолчанию принимает значение 1.

Наименьший индекс по-умолчанию может быть равен 0 или 1 в зависимости от настроек оператора Option Base. Нижняя граница архива, полученного с помощью функции Array, всегда равна 0.

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

Функция UBound

Функция UBound возвращает значение типа Long, равное наибольшему (верхнему) доступному индексу в указанном измерении массива.
Синтаксис:
UBound( arrayname[, dimension])

  • arrayname — это имя переменной массива, является обязательным аргументом;
  • dimension — это номер измерения массива, необязательный аргумент, по умолчанию принимает значение 1.

Функция UBound используется вместе с функцией LBound для определения размера массива.

Sub Test2()

Dim a(2 To 53) As String

MsgBox «Наименьший индекс = « & LBound(a) & _

vbNewLine & «Наибольший индекс = « & UBound(a)

End Sub

Скопируйте код в модуль VBA Excel и запустите его на выполнение. Информационное сообщение MsgBox покажет значения наименьшего и наибольшего индекса переменной массива a.

Обход массива циклом

Обход одномерного массива циклом For… Next, в котором для определения границ массива используются функции UBound и LBound:

Sub Test3()

Dim a() As Variant, i As Long

a = Array(«text», 25, «solo», 35.62, «stop»)

    For i = LBound(a) To UBound(a)

        Debug.Print «a(« & i & «) = « & a(i)

    Next

End Sub

Результат работы цикла вы увидите в окне Immediate.

Очистка (обнуление) массивов

Первый способ

Очистить любой массив, статический или динамический, без использования цикла можно с помощью оператора Erase. Термин «обнуление» можно применить только к массиву числового типа.

Dim Massiv1(4, 3) As String,  Massiv2() As Variant

операторы

‘переопределяем динамический массив

ReDim Massiv2(2, 5, 3)

операторы

‘очищаем массивы

Erase Massiv1

Erase Massiv2

Обратите внимание, что оба массива при таком способе очистки будут возвращены в исходное состояние, которое они имели сразу после объявления:

  • статический Massiv1 сохранит размерность (4, 3);
  • динамический Massiv2 не сохранит размерность ().

Второй способ

Динамический массив можно очистить (обнулить) без использования цикла с помощью оператора ReDim. Просто переопределите его с той же размерностью.

Dim Massiv() As Double

операторы

‘переопределяем массив

ReDim Massiv(5, 6, 8)

операторы

‘очищаем массив

ReDim Massiv(5, 6, 8)


Содержание

  1. Использование массивов
  2. Изменение нижней границы
  3. Хранение значений Variant в массивах
  4. Использование многомерных массивов
  5. См. также
  6. Поддержка и обратная связь
  7. VBA Multi-Dimensional Array (2D Arrays)
  8. Multi-Dimensional Array (2D Arrays)
  9. Declare a 2D Array
  10. Populating a 2D Array
  11. Populating a 2D Array from Excel data
  12. Resizing using ReDim and Re-Dim Preserve
  13. VBA Coding Made Easy
  14. VBA Code Examples Add-in
  15. Использование двумерных массивов в VBA на уроках информатики
  16. Библиографическое описание:
  17. Похожие статьи
  18. Алгоритм интервального оценивания параметров нелинейных.
  19. Методика проведения лабораторной работы по дисциплине.
  20. Анализ эффективности алгоритмов сортировки и вcтроенных.
  21. Использование алгоритмов нечеткого поиска при решении задачи.
  22. Размножение объектов массивом в системе моделирования.
  23. Сравнительный анализ алгоритмов сортировки данных в массивах
  24. Методика формирования информационных файлов для.
  25. Алгоритмические аспекты доминирования в графах
  26. Заполнение двумерного массива vba excel

Использование массивов

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

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

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

Изменение нижней границы

Используйте оператор Option Base в верхней части модуля , чтобы изменить индекс по умолчанию первого элемента с 0 на 1. В следующем примере инструкция Option Base изменяет индекс для первого элемента, а инструкция Dim объявляет переменную массива с 365 элементами.

Можно также в явном виде установить нижнюю границу массива, используя выражение To, как показано в следующем примере.

Хранение значений Variant в массивах

Существует два способа создания массивов значений Variant . Один способ — объявление массива с типом данных Variant, как показано в следующем примере:

Другой способ — присвоение массива, возвращаемого функцией Array, переменной Variant, как показано в следующем примере.

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

Использование многомерных массивов

В Visual Basic допускается объявлять массивы с 60 размерностями, максимум. Например, следующий оператор объявляет 2-мерный массив 5 на 10.

Если рассматривать массив как матрицу, первый аргумент представляет строки, а второй аргумент представляет столбцы.

Использовать вложенные для. Следующие операторы для обработки многомерных массивов. Следующая процедура позволяет заполнить двумерный массив значениями Single.

См. также

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

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

Источник

VBA Multi-Dimensional Array (2D Arrays)

In this Article

This tutorial will discuss 2-d and multi-dimensional arrays in VBA.

Multi-Dimensional Array (2D Arrays)

Multi-dimensional Arrays are arrays that contain more than one dimension, usually two or three dimensions, but arrays can have up to 32 dimensions.

Declare a 2D Array

To create an array with more than one dimension, use commas to define each separate dimension:

Populating a 2D Array

Your Excel spreadsheet should then be populated as follows.

Populating a 2D Array from Excel data

The code below will populate a 2D array from an Excel worksheet and then populate a different sheet with the data.

Resizing using ReDim and Re-Dim Preserve

You can resize an array using ReDim (learn more).

When you redeclare the array, you will lose any data previously held in the array unless you use the ReDim Preserve Statement.

You can only resize the last dimension of an Array if want to keep the original data in the Array with Re-Dim Preserve.

When you click debug, the error will be highlighted showing that the first dimension in the array is not the same as the first dimension when the array size was originally declared.

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

VBA Code Examples Add-in

Easily access all of the code examples found on our site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

Источник

Использование двумерных массивов в VBA на уроках информатики

Рубрика: Информационные технологии

Дата публикации: 10.02.2018 2018-02-10

Статья просмотрена: 4145 раз

Библиографическое описание:

Алексеев, Н. Л. Использование двумерных массивов в VBA на уроках информатики / Н. Л. Алексеев. — Текст : непосредственный // Молодой ученый. — 2018. — № 6 (192). — С. 15-20. — URL: https://moluch.ru/archive/192/48265/ (дата обращения: 20.03.2023).

VBA — универсальный язык программирования. С помощью его можно создавать полноценные приложения на Visual Basic, поскольку эти языки — близкие родственники. Создавать программы на нем можно очень быстро и легко, не нужно заботиться об установке и настройке среды программирования и наличии нужных библиотек на компьютере пользователя — MS Office есть практически на любом компьютере. Рассмотрим пример создания программы с использованием двумерных массивов.

Удобство среды VBA заключается в том, что она внедрена в пакет прикладных программ Microsoft Office и, соответственно, является доступной практически на любом ПК, не требует установки дополнительного программного обеспечения.

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

Массив — набор однотипных переменных, объединенных одним именем и доступных через это имя и порядковый номер переменной в наборе. Организуем в электронных таблицах Excel двумерный массив А, состоящий из 20 х 10 = 200 элементов. Для этого в Excel создадим поле, в котором определим элементы массива целыми случайными числами от 1 до 100.

Рис. 1. Поле двумерного массива в Excel

Перейдём во вкладку Разработчик → Visual Basic. Затем вкладка Insert → Module. Откроется окно для создания программного кода.

Рис. 2. Окно для создания программного кода

Dim A(20, 10) As Integer

For i = 1 To 20 ‘Число строк в массиве

For j = 1 To 10 ‘Число столбцов в массиве

A(i, j) = Int(Rnd * 100 + 1) ‘Задание массива целыми числами от 1 до 100

При выполнении программы на активном листе Excel образуется следующее поле:

Рис. 3. Заполнение двумерного массива в Excel

Определим переменные для нахождения максимального, минимального, среднего значения в таблице, кроме того, вычислим сумму и размах таблицы. Все перечисленные переменные целые, кроме действительного среднего значения. Присвоим им соответствующие типы данных: Dim Max, Min, Сумма, Размах As Integer, Среднее As Single.

Используя принцип математической индукции, найдём наибольшее и наименьшее значения таблицы: If A(i, j) >Max Then Max = A(i, j)

If A(i, j) = Max Then Max = A(i, j) ‘Вычисление Максимального элемента в массиве

If A(i, j) A(i, j) / 2 And A(i, j) 3 <> A(i, j) / 3 And A(i, j) 5 <> A(i, j) / 25 Then Cells(i, j + 22) = «*»

If A(i, j) 2 = A(i, j) / 2 Then Кратные2 = Кратные2 + 1 ‘Подсчёт количества чисел кратных 2

If A(i, j) 3 = A(i, j) / 3 Then Кратные3 = Кратные3 + 1 ‘Подсчёт количества чисел кратных 3

If A(i, j) 5 = A(i, j) / 5 Then Кратные5 = Кратные5 + 1 ‘Подсчёт количества чисел кратных 5

If Cells(i, j + 22) = «*» Then Звезд = Звезд + 1 ‘Подсчёт количества «*»

Range(«O22″).Value = «Копия Таблицы»

Range(«Z22″).Value = «Обработанная таблица»

Range(«W22″).Value = «Кратные 2″ ‘Вывод результатов

Range(«W23″).Value = «Кратные 3″

Range(«W24″).Value = «Кратные 5″

Рис. 5. Обработанная таблица

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

  1. И. Г. Фризен. Офисное программирование: Учебное пособие / М. Издательско-торговая корпорация «Дашков и К», 2013 г.
  2. Языки управления приложениями: Учебно-методическое пособие. — М.: Издательский отдел факультета ВМиК МГУ имени М. В. Ломоносова № 05899; 2015 г.
  3. https://studfiles.net/preview/2897110/
  4. https://www.intuit.ru/studies/courses/23/23/info

Похожие статьи

Алгоритм интервального оценивания параметров нелинейных.

m — число параметров функции-модели; n — число точек регрессии; step0, step — начальный и рабочий шаг исходного многогранника (симплекса)

F(1 to m + 4) — массив значений ЦФ или ШФ в вершинах ДМ

Методика проведения лабораторной работы по дисциплине.

поиска максимального элемента в одномерном массиве; 7) пример программы вычисления суммы элементов одномерного массива и количества отрицательных элементов в массиве; 8) особенности работы с двумерными массивами; 9).

Анализ эффективности алгоритмов сортировки и вcтроенных.

Рис. 1. Исходный код сортировки выбором. В таблице 1 приведен расчет времени, необходимый для успешного выполнения сортировки

Учитывая это, сложность алгоритма сортировки вставками определена как O(n^2), где n — количество элементов массива.

Использование алгоритмов нечеткого поиска при решении задачи.

Пусть, например, в качестве аргументов заданы две строки «Привет» и «Превед» и некоторая максимальная длина подстрок, скажем, 4, тогда получаем значения коэффициента, равные 0,75, при n=1; 0,4 при n=2

Сравнительный анализ алгоритмов сортировки данных в массивах.

Размножение объектов массивом в системе моделирования.

По умолчанию максимальное число элементов массива, построенного одной командой, равно 100000.

Если задать большое количество строк и столбцов, построение массива может занять некоторое время.

Сравнительный анализ алгоритмов сортировки данных в массивах

При сортировке подсчетом используется диапазон чисел сортируемого массива для подсчёта совпадающих элементов [2, с. 24]..

Использование алгоритмов нечеткого поиска при решении задачи устранения дубликатов в массивах данных.

Методика формирования информационных файлов для.

— составление графа -«дерево» учебных элементов по теме. — определение понятийных и эмпирических индикаторов.

Размеpы двумеpного массива могут меняться в зависимости от объема pаздела (количество стpок в одной задаче и общее количество задач или вопpосов).

Алгоритмические аспекты доминирования в графах

В дальнейшем эти числа используются для вычисления числа доминирования графа.

Данные структуры инициализируются для работы с заданным деревом в программном виде.

1) структура графа в виде массива окрестностей каждой вершины.

Источник

Заполнение двумерного массива vba excel

Добрый день!
Подскажите, пожалуйста, как реализовать заполнение динамического массива. Приведенный ниже код не работает, ругается на ошибку синтаксиса в выражении massive(, k) = Cells(i, 3).Value(), а как сделать так, чтобы не ругался, тяму не хватает. С одномерным массивом все работает корректно.

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub massiveTest()
Dim i, k As Integer
ReDim massive(0, 0) As String
i = 2
k = 0

Do While Cells(i, 1) <> 0
k = k + 1
ReDim Preserve massive(k, k) As String
massive(k) = Cells(i, 2).Value()
massive(, k) = Cells(i, 3).Value()
i = i + 1
MsgBox massive(k, k)
Loop

Смысл кода: есть таблица о трех колонках. Первая колонка: порядковый номер, вторая — имя, третья — фамилия. Количество строк все время меняется, потому и нужен динамический массив.

Добрый день!
Подскажите, пожалуйста, как реализовать заполнение динамического массива. Приведенный ниже код не работает, ругается на ошибку синтаксиса в выражении massive(, k) = Cells(i, 3).Value(), а как сделать так, чтобы не ругался, тяму не хватает. С одномерным массивом все работает корректно.

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub massiveTest()
Dim i, k As Integer
ReDim massive(0, 0) As String
i = 2
k = 0

Do While Cells(i, 1) <> 0
k = k + 1
ReDim Preserve massive(k, k) As String
massive(k) = Cells(i, 2).Value()
massive(, k) = Cells(i, 3).Value()
i = i + 1
MsgBox massive(k, k)
Loop

Смысл кода: есть таблица о трех колонках. Первая колонка: порядковый номер, вторая — имя, третья — фамилия. Количество строк все время меняется, потому и нужен динамический массив. tsch

Сообщение Добрый день!
Подскажите, пожалуйста, как реализовать заполнение динамического массива. Приведенный ниже код не работает, ругается на ошибку синтаксиса в выражении massive(, k) = Cells(i, 3).Value(), а как сделать так, чтобы не ругался, тяму не хватает. С одномерным массивом все работает корректно.

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub massiveTest()
Dim i, k As Integer
ReDim massive(0, 0) As String
i = 2
k = 0

Do While Cells(i, 1) <> 0
k = k + 1
ReDim Preserve massive(k, k) As String
massive(k) = Cells(i, 2).Value()
massive(, k) = Cells(i, 3).Value()
i = i + 1
MsgBox massive(k, k)
Loop

Смысл кода: есть таблица о трех колонках. Первая колонка: порядковый номер, вторая — имя, третья — фамилия. Количество строк все время меняется, потому и нужен динамический массив. Автор — tsch
Дата добавления — 01.02.2017 в 17:45

_Boroda_ Дата: Среда, 01.02.2017, 17:55 | Сообщение № 2

Ответить

tsch Дата: Среда, 01.02.2017, 18:18 | Сообщение № 3
tsch Дата: Среда, 01.02.2017, 18:45 | Сообщение № 4

_Boroda_, можно еще один вопрос в рамках решения все той же задачи?

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub massiveTest()
arr = Range(«B2:C» & Range(«A» & Rows.Count).End(xlUp).Row)
arrLength = UBound(arr) — LBound(arr) + 1

Const writeFile As String = «C:Inteltest.txt»
‘Dim i As Integer

Open writeFile For Output As #1
For i = 1 To arrLength Step 1
Print #1, arr(i, 1) & » » & arr(i, 2)
Next i
Close #1

Почему-то в файл записывается на одну строчку больше, чем длина массива, хотя в дебаггере четко видно, что на i=5 (например), происходит выход из цикла, но строчке в файле получается 6. Я честно пробовал во всех местах -1 подставить, но тогда на одну строчку меньше выходит и все равно с пустой строкой.

_Boroda_, можно еще один вопрос в рамках решения все той же задачи?

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub massiveTest()
arr = Range(«B2:C» & Range(«A» & Rows.Count).End(xlUp).Row)
arrLength = UBound(arr) — LBound(arr) + 1

Const writeFile As String = «C:Inteltest.txt»
‘Dim i As Integer

Open writeFile For Output As #1
For i = 1 To arrLength Step 1
Print #1, arr(i, 1) & » » & arr(i, 2)
Next i
Close #1

Почему-то в файл записывается на одну строчку больше, чем длина массива, хотя в дебаггере четко видно, что на i=5 (например), происходит выход из цикла, но строчке в файле получается 6. Я честно пробовал во всех местах -1 подставить, но тогда на одну строчку меньше выходит и все равно с пустой строкой. tsch

Сообщение _Boroda_, можно еще один вопрос в рамках решения все той же задачи?

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub massiveTest()
arr = Range(«B2:C» & Range(«A» & Rows.Count).End(xlUp).Row)
arrLength = UBound(arr) — LBound(arr) + 1

Const writeFile As String = «C:Inteltest.txt»
‘Dim i As Integer

Open writeFile For Output As #1
For i = 1 To arrLength Step 1
Print #1, arr(i, 1) & » » & arr(i, 2)
Next i
Close #1

Почему-то в файл записывается на одну строчку больше, чем длина массива, хотя в дебаггере четко видно, что на i=5 (например), происходит выход из цикла, но строчке в файле получается 6. Я честно пробовал во всех местах -1 подставить, но тогда на одну строчку меньше выходит и все равно с пустой строкой. Автор — tsch
Дата добавления — 01.02.2017 в 18:45

bmv98rus Дата: Среда, 01.02.2017, 19:45 | Сообщение № 5

вам точно нужно это [vba]

[/vba] Step 1 — по умолчанию. Но это мелочи.

вам точно нужно это [vba]

[/vba] Step 1 — по умолчанию. Но это мелочи.

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

вам точно нужно это [vba]

[/vba] Step 1 — по умолчанию. Но это мелочи.

tsch Дата: Четверг, 02.02.2017, 10:34 | Сообщение № 6

bmv98rus, «Даже с вашим кодом все работает нормально.» — ну, не такой уж и позорный у меня код.

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

[/vba]
Нужен, мне же надо что-то в массив складывать. Или речь о том, почему у _Boroda_ А1, а у меня B2? Тогда отвечу: если оставлять А1, то в массив складываются названия колонок, а мне они в массиве не нужны. Или вопрос в том, что если я меняю A1:C на B2:C, то мне и Range(«A» & Rows.Count) на Range(«B» & Rows.Count) надо поменять? Суть в том, что мне ни названия колонок, ни порядковый номер в массиве оказались не нужны, только имя и фамилия, а порядковым номером выступает место в массиве.

bmv98rus, «Даже с вашим кодом все работает нормально.» — ну, не такой уж и позорный у меня код.

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

[/vba]
Нужен, мне же надо что-то в массив складывать. Или речь о том, почему у _Boroda_ А1, а у меня B2? Тогда отвечу: если оставлять А1, то в массив складываются названия колонок, а мне они в массиве не нужны. Или вопрос в том, что если я меняю A1:C на B2:C, то мне и Range(«A» & Rows.Count) на Range(«B» & Rows.Count) надо поменять? Суть в том, что мне ни названия колонок, ни порядковый номер в массиве оказались не нужны, только имя и фамилия, а порядковым номером выступает место в массиве.

Сообщение bmv98rus, «Даже с вашим кодом все работает нормально.» — ну, не такой уж и позорный у меня код.

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

[/vba]
Нужен, мне же надо что-то в массив складывать. Или речь о том, почему у _Boroda_ А1, а у меня B2? Тогда отвечу: если оставлять А1, то в массив складываются названия колонок, а мне они в массиве не нужны. Или вопрос в том, что если я меняю A1:C на B2:C, то мне и Range(«A» & Rows.Count) на Range(«B» & Rows.Count) надо поменять? Суть в том, что мне ни названия колонок, ни порядковый номер в массиве оказались не нужны, только имя и фамилия, а порядковым номером выступает место в массиве.

bmv98rus Дата: Четверг, 02.02.2017, 11:04 | Сообщение № 7

там нет лишней строки просто последний символ выводимой строки — это как раз симол перевода строки. В редакторе вы видете, что есть пустая строка, но это только визуализация.

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

там нет лишней строки просто последний символ выводимой строки — это как раз симол перевода строки. В редакторе вы видете, что есть пустая строка, но это только визуализация.

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

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

там нет лишней строки просто последний символ выводимой строки — это как раз симол перевода строки. В редакторе вы видете, что есть пустая строка, но это только визуализация.

Ну и я не хотел унижать, просто подтвердил что код работает нормально, и придирки не влияют на конечный результат. Автор — bmv98rus
Дата добавления — 02.02.2017 в 11:04

_Boroda_ Дата: Четверг, 02.02.2017, 11:12 | Сообщение № 8

Да. Вдруг получится так, что в А у Вас 20 строк, а в В 19? Ну мало ли, всякое бывает .

Немного поясню про массив. Если мы берем массив приравниванием с листа , то этот массив начинается с единицы (если явно не указано иное — у нас не указано, да и зачем?). Поэтому UBound LBound этого массива мы знаем заранее и нет нужды еще раз его определять. Определить можно, но зачем ?

Да. Вдруг получится так, что в А у Вас 20 строк, а в В 19? Ну мало ли, всякое бывает .

Немного поясню про массив. Если мы берем массив приравниванием с листа , то этот массив начинается с единицы (если явно не указано иное — у нас не указано, да и зачем?). Поэтому UBound LBound этого массива мы знаем заранее и нет нужды еще раз его определять. Определить можно, но зачем ? _Boroda_

Скажи мне, кудесник, любимец ба’гов.
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

Ответить

Да. Вдруг получится так, что в А у Вас 20 строк, а в В 19? Ну мало ли, всякое бывает .

Немного поясню про массив. Если мы берем массив приравниванием с листа , то этот массив начинается с единицы (если явно не указано иное — у нас не указано, да и зачем?). Поэтому UBound LBound этого массива мы знаем заранее и нет нужды еще раз его определять. Определить можно, но зачем ? Автор — _Boroda_
Дата добавления — 02.02.2017 в 11:12

bmv98rus Дата: Четверг, 02.02.2017, 11:30 | Сообщение № 9
Замечательный Временно просто медведь , процентов на 20.

Ответить

_Boroda_ Дата: Четверг, 02.02.2017, 11:43 | Сообщение № 10

Ответить

tsch Дата: Четверг, 02.02.2017, 16:06 | Сообщение № 11
Piru Дата: Пятница, 28.04.2017, 09:32 | Сообщение № 12

Ребята подскажите пожалуйста, что с этим кодом не так. Как только row_num = 9 выскакивает ошибка

Dim DynMas() As Variant
Dim File_Path As String

File_Path = «C:UsersAdminDesktopMaz T044SS (OOO NPP SGT).txt»
row_num = 1
ReDim DynMas(1 To row_num, 1 To 5)
Open File_Path For Input As #1

Do Until EOF(1)
Line Input #1, Line_FromFile
Line_Items = Split(Line_FromFile, «,»)
If row_num > 7 Then
For i = 1 To 5
DynMas(UBound(DynMas, 1), i) = Line_Items(i — 1)
Next i
ReDim Preserve DynMas(1 To UBound(DynMas, 1) + 1, 1 To 5)
End If

row_num = row_num + 1
Loop
Close #1
End Sub

Ребята подскажите пожалуйста, что с этим кодом не так. Как только row_num = 9 выскакивает ошибка

Dim DynMas() As Variant
Dim File_Path As String

File_Path = «C:UsersAdminDesktopMaz T044SS (OOO NPP SGT).txt»
row_num = 1
ReDim DynMas(1 To row_num, 1 To 5)
Open File_Path For Input As #1

Do Until EOF(1)
Line Input #1, Line_FromFile
Line_Items = Split(Line_FromFile, «,»)
If row_num > 7 Then
For i = 1 To 5
DynMas(UBound(DynMas, 1), i) = Line_Items(i — 1)
Next i
ReDim Preserve DynMas(1 To UBound(DynMas, 1) + 1, 1 To 5)
End If

row_num = row_num + 1
Loop
Close #1
End Sub Piru

Остановите эту планету! Я сойду.

Ответить

Сообщение Ребята подскажите пожалуйста, что с этим кодом не так. Как только row_num = 9 выскакивает ошибка

Dim DynMas() As Variant
Dim File_Path As String

File_Path = «C:UsersAdminDesktopMaz T044SS (OOO NPP SGT).txt»
row_num = 1
ReDim DynMas(1 To row_num, 1 To 5)
Open File_Path For Input As #1

Do Until EOF(1)
Line Input #1, Line_FromFile
Line_Items = Split(Line_FromFile, «,»)
If row_num > 7 Then
For i = 1 To 5
DynMas(UBound(DynMas, 1), i) = Line_Items(i — 1)
Next i
ReDim Preserve DynMas(1 To UBound(DynMas, 1) + 1, 1 To 5)
End If

row_num = row_num + 1
Loop
Close #1
End Sub Автор — Piru
Дата добавления — 28.04.2017 в 09:32

Источник

Adblock
detector

Андрей VG, спасибо за замечания.
Nordheim, вам тоже спасибо. Массив не такой уж большой, 227 значений получилось, выгрузка за полгода. Resize, в итоге, я и хочу использовать.

В общем, задача полностью выглядит так: у меня есть данные по отпускам, и две колонки с датами — одна это дата начала отпуска, вторая это дата конца отпуска. Суть в том, что если месяца не одинаковые (например, я вышел в отпуск в июле, и пришел из отпуска в августе) — то я хочу, чтобы в самом низу создалась еще одна строка с датой конца отпуска.

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

Выше текст написал на всякий случай, вдруг кому интересно. :)

real_x

0 / 0 / 0

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

Сообщений: 5

1

Заполнение многомерного массива

12.10.2010, 07:23. Показов 21135. Ответов 7

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


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

Доброго времени суток,

Помогите разобраться.
Как заполнить двумерный массив после его объявления?

Visual Basic
1
2
3
4
5
'...
Dim Arr(1 to 2, 1 to 3) as string
Arr() = Array(("a", "b", "c"), ("d", "e", "f")) 'ОШИБКА
Arr() = Array(Array("a", "b", "c"), Array("d", "e", "f")) 'ОШИБКА Can't to assign array
'...

Заранее спасибо



0



Busine2009

Заблокирован

12.10.2010, 09:36

2

real_x,

Visual Basic
1
2
3
4
5
6
7
8
9
Sub m_1()
Dim Arr(1 To 2, 1 To 3) As String
Arr(1, 1) = "a"
Arr(1, 2) = "b"
Arr(1, 3) = "c"
Arr(2, 1) = "d"
Arr(2, 2) = "e"
Arr(2, 3) = "f"
End Sub
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub m_2()
Dim Arr(1 To 2, 1 To 3) As String
Dim x As Long
x = 96
For i = 1 To 2
    For j = 1 To 3
        x = x + 1
        Arr(i, j) = Chr(x)
    Next j
Next i
End Sub



1



0 / 0 / 0

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

Сообщений: 5

12.10.2010, 16:25

 [ТС]

3

да это то понятно. я имел ввиду средствами функции Array()



0



Busine2009

Заблокирован

12.10.2010, 16:55

4

real_x,
первую ошибку уже вижу. Вот выдержка из «VBA для чайников»:

Массив слева (тот, которому присваиваются значения) должен быть динамическим,
и VBA переопределит его автоматически в соответствии с размерностью и размерами масси-
ва справа.

Цитата с др. сайта:

Удобным способом определения одномерных массивов является функция Array



0



EducatedFool

0 / 0 / 0

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

Сообщений: 88

13.10.2010, 06:41

5

Visual Basic
1
2
3
4
5
Sub ВотТакРаботает()
    Dim Arr() ' не надо указывать размерность массива!
    ' он будет размерами (0 to 1, 0 to 2)
    Arr = Array(Array("a", "b", "c"), Array("d", "e", "f"))
End Sub



0



real_x

0 / 0 / 0

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

Сообщений: 5

13.10.2010, 07:21

 [ТС]

6

Да и так я пробовал…

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

Visual Basic
1
2
3
4
5
Sub ВотТакРаботает()
    Dim Arr() ' не надо указывать размерность массива!
    ' он будет размерами (0 to 1, 0 to 2)
    Arr = Array(Array("a", "b", "c"), Array("d", "e", "f"))
End Sub

но вот попробуйте обратиться к одному из элементов этого массива

Visual Basic
1
2
3
4
5
Sub ВотТакНеРаботает()
    Dim Arr()
    Arr = Array(Array("a", "b", "c"), Array("d", "e", "f"))
    MsgBox Arr(0,0) 'у меня "вылетает" ошибка Subscript out of range.... 
End Sub

Busine2009, за чайника обидно…



0



Vlanib

Частенько бываю

749 / 330 / 42

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

Сообщений: 854

13.10.2010, 07:44

7

Visual Basic
1
2
3
4
5
Sub ВотТакРАБОТАЕТ()
    Dim Arr
    Arr = Array(Array("a", "b", "c"), Array("d", "e", "f"))
    MsgBox Arr(1)(0)
End Sub



2



0 / 0 / 0

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

Сообщений: 5

11.11.2010, 18:54

 [ТС]

8

Vlanib и EducatedFool, спасибо!



0



Понравилась статья? Поделить с друзьями:
  • Excel vba запись в txt
  • Excel vba если оператор if
  • Excel vba записать ячейку как число
  • Excel vba если нет данных
  • Excel vba заменить файл