Как из двумерного массива сделать одномерный excel

Обновлено: 04.07.2024

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

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

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

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

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

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

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

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

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

Пример 1

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

у меня есть двумерный массив, и мне нужно, чтобы преобразовать его в список (тот же объект). Я не хочу делать это с for или foreach цикл, который будет принимать каждый элемент и добавлять его в список. Есть ли другой способ сделать это?

Преобразование double[, ] to List<double> ? Если вы ищете однострочный, вот идет

Ну, вы можете заставить его использовать копию "blit", хотя это означает создание дополнительной копии : (

если вы довольны одномерным массивом, конечно, просто проигнорируйте последнюю строку:)

Buffer.BlockCopy реализуется как собственный метод, который я ожидал использовать чрезвычайно эффективное копирование после проверки. The List<T> constructor , которая принимает IEnumerable<T> оптимизирован для случая, когда он реализует IList<T> , as double[] делает. Оно будет создайте резервный массив нужного размера и попросите его скопировать себя в этот массив. Надеюсь, что будет использовать Buffer.BlockCopy или что-то подобное тоже.

вот быстрый тест из трех подходов (для цикла, Cast<double>().ToList() , и буфера.BlockCopy):

Результаты (время в миллисекундах);

EDIT: изменив цикл for для вызова array.GetLength() на каждой итерации цикл for и копия блока занимают примерно одно и то же время.

A for loop-самый быстрый способ.

вы можете сделать это с помощью LINQ, но это будет медленнее. И хотя вы сами не пишете цикл, под капотом все еще есть цикл.

  • для зубчатого массива вы, вероятно, можете сделать что-то вроде arr.SelectMany(x=>x).ToList() .
  • On T[,] вы можете просто сделать arr.ToList() С IEnumerable<T> of T[,] возвращает все элементы в 2D массива. похоже, что 2D-массив реализует только IEnumerable а не IEnumerable<T> поэтому вам нужно вставить Cast<double> как предложил yetanothercoder. Что сделает его еще медленнее из-за бокса.

единственное, что может сделать код быстрее, чем наивный цикл, - это вычислить количество элементов и построить список с правильной емкостью, поэтому ему не нужно расти.
Если Ваш массив прямоугольный, вы можете получить размер как width*height , с зубчатыми массивами это может быть сложнее.

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

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

как объявить 2-мерный массив в JavaScript? (если это возможно)

Как я могу получить доступ к его членам? ( myArray[0][1] или myArray[0,1] ?)

вы просто делаете каждый элемент в массиве массивом.

подобно ответу activa, вот функция для создания n-мерного массива:

Javascript имеет только одномерные массивы, но вы можете создавать массивы массивов, как указывали другие.

для построения 2-d массива фиксированных размеров можно использовать следующую функцию:

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

тогда вы можете просто позвонить:

самый простой способ:

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

Итак, это причина конфликтующих точек зрения.

немногие люди показывают использование push:
Чтобы принести что-то новое, я покажу вам, как инициализировать матрицу с некоторым значением, например: 0 или пустой строкой "".
Напоминая, что если у вас есть массив из 10 элементов, в javascript последний индекс будет 9!

Он будет генерировать массив a длины 10, заполненные массивы. (Push добавляет элемент в массив и возвращает новую длину)

самый здравый ответ, кажется,

самый простой способ:

вот чего я достиг:

это заколдовало меня бинишкумар

2 и 4 первого и второго измерений соответственно.

мы используем Array.from , который может принимать array-like param и необязательное сопоставление для каждого из элементов.

другой вариант (но более неэффективных 12% с n = 10,000 )

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

последующие

почему это не работает?

в то время как он возвращает, по-видимому, желаемый двумерный массив ( [ [ <4 empty items> ], [ <4 empty items> ] ] ), есть уловка: первые массивы измерений были скопированы по ссылке. Это означает arr[0][0] = 'foo' фактически изменил бы две строки вместо одной.

двумерные массивы создаются так же, как одномерные массивы. И вы получаете к ним доступ, как array[0][1] .

Я не уверен, что кто - то ответил на это, но я обнаружил, что это сработало для меня довольно хорошо -

для 2-мерного массива, например.

чтобы создать 2D-массив в javaScript, мы можем сначала создать массив, а затем добавить массивы в качестве его элементов. Этот метод вернет 2D-массив с заданным количеством строк и столбцов.

для создания массива используйте этот метод, как показано ниже.

Использовать Массив Понимания

в JavaScript 1.7 и выше вы можете использовать выделения массива для создания двумерных массивов. Вы также можете фильтровать и / или манипулировать записями при заполнении массива и не использовать циклы.

вы можете создать любое n x m массив, который вы хотите, и заполните его значением по умолчанию, вызвав

больше примеров и документации можно найти здесь.

обратите внимание, что это не стандартная функция, но.

для любителей одного лайнера массив.от ()

еще один (из комментария по dmitry_romanov) использовать Array ().fill ()

мой подход очень похож на ответ @Bineesh, но с более общим подходом.

вы можете объявить двойной массив следующим образом:

и хранение и доступ к содержимому следующим образом:

это напечатает ожидаемый результат

Я нашел ниже самый простой способ:

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

Не стесняйтесь, чтобы оптимизировать и / или указать на ошибки :)

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

Пример Кода:

ниже одного, создает матрицу 5x5 и заполняет их null

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

вы можете легко превратить эту функцию в функцию в ES5.

почему это работает: new Array(n) конструктор создает объект с прототипом Array.prototype и затем присваивает объекту length , что приводит к ненаселенному массиву. Из-за отсутствия фактических членов мы не можем запустить Array.prototype.map функция на нем.

однако, когда вы предоставляете более одного аргумент конструктора, например, когда вы делаете Array(1, 2, 3, 4) конструктор будет использовать arguments объект для создания и заполнения Array правильно объект.

по этой причине, мы можем использовать Array.apply(null, Array(x)) , потому что apply функция распространит аргументы в конструктор. Для разъяснения, делает Array.apply(null, Array(3)) эквивалентно doing Array(null, null, null) .

теперь, когда мы создали фактический заполненный массив, все, что нам нужно сделать, это вызвать map и создать второй слой ( y ).

вы можете выделить массив строк, где каждая строка представляет собой массив одинаковой длины. Или вы можете выделить одномерный массив с элементами строк * столбцов и определить методы сопоставления координат строк/столбцов индексам элементов.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция Array

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

Читайте также: