0 / 0 / 0
Регистрация: 04.03.2018
Сообщений: 38
1

Занесение в массив значений с первого столбца всех листов

20.03.2018, 10:02. Показов 1576. Ответов 8
Метки нет (Все метки)

Здравствуйте!
Необходимо в общий массив massiv занести строки со значениями со всех перечисленных листов из столбца А.
На каждом листе определяется общее кол-во строк с данными.
Массив создается, но происходит пробежка по всем листам, что само по себе уже не быстро.

есть ли способ внесения данных в массив более быстрый ?
знаний и поиска в интеренете хватило пока только на такой вариант,
если есть способ изящнее - помогите с кодом )

Спасибо!

ниже код:
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
Sub Список_Кнопка1_Щелчок()
 
    Dim lLastRow As Long 'переменная для определения последней строки на листе
    Dim Sheet1_WS, Sheet2_WS As Worksheet
    Dim list  As Variant, a As Byte, b As Long, k As Long
    Dim i As Long, massiv()
    k = 0
    list = Array("", "Лист1", "Лист3", "Лист8", "Лист9", "Лист6", "Лист10", "Лист11", "Лист12", "Лист13") ' массив листов из которых брать данные
    For a = 1 To 9 ' 9- индекс кол-ва листов из массива list
    
    ' ---определение кол-ва строк на листе
    Sheets(list(a)).Select
    Set Sheet1_WS = Application.ThisWorkbook.Sheets(list(a))
    lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
    ' ---определение кол-ва строк на листе
    
    For b = 1 To lLastRow
        k = k + 1 ' общее кол-во строк в массиве
        ReDim Preserve massiv(k + 1)
        massiv(k) = Cells(b, 1)
        Debug.Print massiv(k)
    Next b
 
    Next a
sub end
Добавлено через 19 минут
Уважаемые, не сразу сообразил что у меня ещё debug выводил данные, он и тормозил процесс.
все в лёт быстрее без него.

а как выгрузить на Лист 3 в столбец B весь массив для проверки ?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2018, 10:02
Ответы с готовыми решениями:

Определить наименьшее из всех значений элементов первого столбца матрицы и вывести его на экран
Решите пожалуйста задачу. Задан двумерный массив М(N, M). Определить наименьшее из всех значений...

Найти итоги из всех листов другой книги и записать в факт для всех выделенных значений рабочей книги
Написал макрос для проверки итогов с фактом. Как запустить всё это по циклу? Чтоб отрабатывался для...

Занесение значений БД в массив
Добрый день, имею метод, в котором заношу данные из БД в массив, но после "SQLDataReader" программа...

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

8
3476 / 2132 / 708
Регистрация: 02.11.2012
Сообщений: 5,579
20.03.2018, 10:12 2
1. зачем 13 строка если вы её далее нигде не используете?
2. от Select желательно избавится.
3. в начале Application.ScreenUpdating = False 'отключаем обновление экрана,
ну а затем в конце кода возвращаем Application.ScreenUpdating = True 'включаем обновление экрана

Добавлено через 2 минуты
Visual Basic
1
Sheets("Лист3").Range("A1").Resize(Ubound(massiv))=massiv
Добавлено через 1 минуту
у вас цикл по определенным листам или все таки по всем?
1
15038 / 6362 / 1726
Регистрация: 24.09.2011
Сообщений: 9,971
20.03.2018, 10:14 3
barsuuuk,
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Список_Кнопка1_Щелчок()
 
    Dim WS As Worksheet, b As Long, k As Long, massiv(), v()
    ReDim massiv(0 To 0)
    For Each WS In Worksheets(Array("Лист1", "Лист3", "Лист8", "Лист9", "Лист6", "Лист10", "Лист11", "Лист12", "Лист13"))   ' массив листов из которых брать данные
      v = WS.Range("A1", WS.Cells(Rows.Count, 1).End(xlUp)).Value 'массив данных очередного листа
      b = UBound(massiv)
      ReDim Preserve massiv(UBound(massiv) + UBound(v))
      For k = 1 To UBound(v)
        massiv(b + k) = v(k, 1)
      Next
    Next
End Sub
Данные в massiv будут начинаться с 1 элемента, massiv(0) останется пустым.
1
6857 / 2792 / 529
Регистрация: 19.10.2012
Сообщений: 8,521
20.03.2018, 10:14 4
Да и redim preserve массива в цикле - тормоз.
Я бы посоветовал вместо этого собирать данные в коллекцию, но не перебором ячеек, а из массива.
Ну а на финише уже под известный размер создаём массив (двумерный!), в него циклом перекладываем данные из коллекции, массив выгружаем на лист.
0
0 / 0 / 0
Регистрация: 04.03.2018
Сообщений: 38
20.03.2018, 10:55  [ТС] 5
Vlad999, цикл да, по определенным листам

спасибо всем, буду переваривать инфу

Добавлено через 34 минуты
Vlad999,

Visual Basic
1
Sheets("Лист3").Range("A1").Resize(UBound(massiv)) = massiv
не заполняет, данные не заносятся на Лист3
0
6857 / 2792 / 529
Регистрация: 19.10.2012
Сообщений: 8,521
20.03.2018, 11:11 6
Цитата Сообщение от Hugo121 Посмотреть сообщение
создаём массив (двумерный!)
- не обратили внимание? Нужно было жирно красным наверное...
0
0 / 0 / 0
Регистрация: 04.03.2018
Сообщений: 38
20.03.2018, 11:16  [ТС] 7
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub Список_Кнопка1_Щелчок()
 
    Dim WS As Worksheet, b As Long, k As Long, massiv(), v()
    ReDim massiv(0 To 0)
    For Each WS In Worksheets(Array("Лист1", "Лист3", "Лист8", "Лист9", "Лист6", "Лист10", "Лист11", "Лист12", "Лист13"))   ' массив листов из которых брать данные
      v = WS.Range("A1", WS.Cells(Rows.Count, 1).End(xlUp)).Value 'массив данных очередного листа
      b = UBound(massiv)
      ReDim Preserve massiv(UBound(massiv) + UBound(v))
      For k = 1 To UBound(v)
        massiv(b + k) = v(k, 1)
      Next
    Next
End Sub
 
Sheets("Лист").Range("A1").Resize(UBound(massiv)) = massiv
сейчас работает данный вариант от Казанского , но массив как на лист "Лист" как вывести ?
0
15038 / 6362 / 1726
Регистрация: 24.09.2011
Сообщений: 9,971
20.03.2018, 11:29 8
Лучший ответ Сообщение было отмечено barsuuuk как решение

Решение

Цитата Сообщение от barsuuuk Посмотреть сообщение
массив как на лист "Лист" как вывести ?
Visual Basic
1
range("Лист!A1").resize(ubound(massiv)+1).value=worksheetfunction.transpose(massiv)
Сработает, если массив не очень большой.
Если предполагается вывод массива на лист в столбец, то, конечно, его изначально надо создавать двумерным, "вертикальным".
1
0 / 0 / 0
Регистрация: 04.03.2018
Сообщений: 38
20.03.2018, 11:31  [ТС] 9
Казанский, все работает, Спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2018, 11:31

Заполнение первого столбца автоматически во всех DataGridView
Здравствуйте) Подскажите пожалуйста как реализовать: Имеется 10 DataGridView, когда в...

Найти сумму всех элементов первого столбца.
Определить двумерный массив 12Х12, заполнить его с помощью генератора случаеных чисел, присвоить...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.