Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/22: Рейтинг темы: голосов - 22, средняя оценка - 4.95
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259

Передать определенные строки Excel в массив

12.08.2021, 16:33. Показов 4841. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня уважаемые!
Решил все таки начать разбираться с массивами и полдня бьюсь с одной задачей.

Есть таблица Excel


передать все сразу в массив могу несколькими способами
в основном пользуюсь этим (мне кажется он легче), только вот сначала приходится активировать лист5, иначе ругается.
Visual Basic
1
2
3
4
Dim Data()
Sheets(5).Activate
Data = Sheets(5).Range(Cells(2, 1), Cells(iLastrow, 6)).Value
Userform1.ListBox1.List = Data
А вот как вывести определенные позиции в зависимости к примеру от столбца 7 (Признак удаления) не получается нормально.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sheets(5).Activate
iLastrow = Sheets(5).Cells(Rows.Count, 1).End(xlUp).Row
 
'Заполнение Lisbox1 через массив перебором
    Dim Data()
    ReDim Preserve Data(1 To iLastrow, 1 To 6)
 
For i = 1 To iLastrow
 If Sheets("Список смет").Cells(i, 1) = "" Then GoTo Выход
     If Sheets("Список смет").Cells(i, 7) = 0 Then
        For j = 1 To 6
         Data(i, j) = Sheets("Список смет").Cells(i, j).Value
        Next j
        
    Else
    End If
 
Next i
при выводе в listbox выводит пустые строки там где они не удовлетворяют значениям. То есть просто на Data(i,j) записывает 0


Как включить в массив только удовлетворяющих условиям строки из Excel?

Заранее благодарен
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.08.2021, 16:33
Ответы с готовыми решениями:

Из Datagridview сохранить в excel только определенные строки
Привет! В Datagridview данные попадают из excel. здесь все хорошо. Из datagridview данные сохраняются в excel так: ...

Excel Выделить цветом определенные строки в столбце
В excel файле столбец А выглядит так: 2005 инф инф инф 2006 инф инф 2007 инф

Найти определенные строки (содержащие определенные слова) и сохранить найденные строки из массива в один файл
Имеется массив строк. Подскажите пожалуйста, как можно найти определенные строки (содержащие определенные слова) и сохранить найденные...

20
665 / 334 / 135
Регистрация: 16.07.2020
Сообщений: 957
12.08.2021, 18:20
Проблема в строке If Sheets("Список смет").Cells(i, 7) = 0 Then .Внутренний цикл не будет выполнен, т.е. элементам строки не будут присвоены значения и управление передается внешнему циклу, а он перейдет к следующей строке. В результате - пустая строка.
По возможности приложите файл или его сокращенный набросок с пояснениями.
0
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
12.08.2021, 18:26  [ТС]
Цитата Сообщение от AlexOld Посмотреть сообщение
Проблема в строке If Sheets("Список смет").Cells(i, 7) = 0 Then .Внутренний цикл не будет выполнен, т.е. элементам строки не будут присвоены значения и управление передается внешнему циклу, а он перейдет к следующей строке.
не много не понял. Я как понимаю это, идет проверка условия и если оно выполняется, то уже переходит ниже на проход по всей строке.
А так он получается независимо от этого что то добавляет в массив?
0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 538
12.08.2021, 18:35
Цитата Сообщение от Авдей Посмотреть сообщение
при выводе в listbox выводит пустые строки там где они не удовлетворяют значениям. То есть просто на Data(i,j) записывает 0
Как включить в массив только удовлетворяющих условиям строки из Excel?
не знаю, пoпрoбуйте
Вложения
Тип файла: xls Авдей.xls (55.5 Кб, 19 просмотров)
0
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
12.08.2021, 18:43  [ТС]
Хм..Работает..а как в листбокс это вывести без использования доп.листа??

По замечанию, понял..исправлюсь
0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 538
12.08.2021, 20:15
Цитата Сообщение от Авдей Посмотреть сообщение
а как в листбокс это вывести без использования доп.листа??
так вывожайте не лист а в листбокс
Вложения
Тип файла: xls Авдей_01.xls (77.5 Кб, 18 просмотров)
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4159 / 2448 / 508
Регистрация: 13.12.2016
Сообщений: 8,327
Записей в блоге: 5
13.08.2021, 09:27
Если таблицу сделать умной, то передача данных в массив произойдет одной строкой
Data()= имя_таблицы
ну а потом уже можно проверять условия...
так намного проще и нет привязки к листу.
0
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
13.08.2021, 12:12  [ТС]
Цитата Сообщение от АЕ Посмотреть сообщение
Если таблицу сделать умной, то передача данных в массив произойдет одной строкой
Что то новенькое...это как?
0
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
13.08.2021, 12:19  [ТС]
Цитата Сообщение от elixi Посмотреть сообщение
так вывожайте не лист а в листбокс
Так пробовал..проблема в том что если в таблице будет только 1 строка к примеру из 5 с признаком 1, то в Listbox выводится в столбец все.
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4159 / 2448 / 508
Регистрация: 13.12.2016
Сообщений: 8,327
Записей в блоге: 5
13.08.2021, 12:21
Авдей, наберите в гугле умные таблицы в экселе и узнаете что это давно уже старенькое. Чуть позже покажу на файле elixi, если он не будет возражать.
0
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
13.08.2021, 13:14  [ТС]
Не стал изобретать велосипед не получается у меня массивы, хоть тресни
сделал по старинке

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
 For i = 2 To iLastrow
        If Sheets(5).Cells(i, 7) = 1 Then
        ListBox1.AddItem Sheets(5).Cells(i, 1).Value
        ListBox1.List(ListBox1.ListCount - 1, 1) = Sheets(5).Cells(i, 2).Value
        ListBox1.List(ListBox1.ListCount - 1, 2) = Sheets(5).Cells(i, 3).Value
        ListBox1.List(ListBox1.ListCount - 1, 3) = Sheets(5).Cells(i, 4).Value
        ListBox1.List(ListBox1.ListCount - 1, 4) = Sheets(5).Cells(i, 5).Value
        ListBox1.List(ListBox1.ListCount - 1, 5) = Sheets(5).Cells(i, 6).Value
        Else
        End If
 Next i
0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 538
13.08.2021, 15:13
Цитата Сообщение от АЕ Посмотреть сообщение
Авдей, наберите в гугле умные таблицы в экселе и узнаете что это давно уже старенькое. Чуть позже покажу на файле elixi, если он не будет возражать.
Не вoзражаю. Зачем мне вoзражать?
0
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
13.08.2021, 15:34  [ТС]
Я балбес..читаю про умные таблицы, готовлюсь к командировке и оказывается...прикольная это штука.

А я как раскраску ее воспринимал
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4159 / 2448 / 508
Регистрация: 13.12.2016
Сообщений: 8,327
Записей в блоге: 5
13.08.2021, 15:47
Лучший ответ Сообщение было отмечено Авдей как решение

Решение

Авдей, посмотрите пример
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Sub fnMas()
Dim d: Dim f()
d = [Таблица1]: j = 1
For i = 1 To UBound(d)
    If d(i, 7) = 1 Then
    ReDim f(1 To j)
    f(j) = d(i, 1) & vbTab & d(i, 2) & vbTab & d(i, 3) & vbTab & _
    d(i, 4) & vbTab & d(i, 5) & vbTab & d(i, 6)
    Debug.Print f(j) ' тут переменная f(j) которая набита отобранными данными _
    можете дальше использовать ее по своему усмотрению
    j = j + 1
    End If
Next
End Sub
Вложения
Тип файла: xls Умная таблица и массив.xls (43.0 Кб, 25 просмотров)
1
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
13.08.2021, 16:37  [ТС]
Цитата Сообщение от АЕ Посмотреть сообщение
Авдей, посмотрите пример
Отлично, через такие таблицы даже удобнее..


но все равно опять с выводом в listbox проблемы
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4159 / 2448 / 508
Регистрация: 13.12.2016
Сообщений: 8,327
Записей в блоге: 5
13.08.2021, 17:49
Цитата Сообщение от Авдей Посмотреть сообщение
Как включить в массив только удовлетворяющих условиям строки из Excel?
я этот массив вам сформировал. Да и тема звучит "Передать определенные строки Excel в массив"
Ну я гляну позже

Добавлено через 57 минут
Авдей, вот код для списка, но обратите внимание, что его надо вешать на активацию формы
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub UserForm_Activate()
Dim d: Dim f()
d = [Таблица1]: j = 1
For i = 1 To UBound(d)
    If d(i, 7) = 1 Then
    ReDim Preserve f(1 To j)
    f(j) = d(i, 1) & vbTab & d(i, 2) & vbTab & d(i, 3) & vbTab & _
    d(i, 4) & vbTab & d(i, 5) & vbTab & d(i, 6)
    j = j + 1
    End If
Next
ListBox1.List = f
End Sub
Добавлено через 3 минуты
в коде (первом) я упустил одну деталь ReDim Preserve а это важно.
Каждый раз создавалась новая копия массива, а это позволяло видеть только последнюю запись. Мой косяк. Каюсь.
1
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
13.08.2021, 17:56  [ТС]
Вроде работает, но проблема в том что сбивается растановка по listbox почему то..

0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 538
13.08.2021, 19:31
Цитата Сообщение от Авдей Посмотреть сообщение
Так пробовал..проблема в том что если в таблице будет только 1 строка к примеру из 5 с признаком 1, то в Listbox выводится в столбец все.
Если сделать транспонировку данных собственным кодом а не функцией Application.Transpose(...), то данные в листбоксе отображаются правильно. Странно. Может, кто-то из взрослых программистов знает почему с Application.Transpose(...) работает это не так?
Вложения
Тип файла: xls Авдей_02.xls (90.5 Кб, 15 просмотров)
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4159 / 2448 / 508
Регистрация: 13.12.2016
Сообщений: 8,327
Записей в блоге: 5
13.08.2021, 21:27
Авдей, я сделал одну текстовую длинную переменную через табуляцию между полями (это видно из кода)
Хотите по столбцам в листбоксе - сделайте! Что мешает сделать f переменную массива многомерной? Вы этого не видите или не хотите видеть и говорите сбивается что-то?
Впрочем, если объясните зачем вам много столбцов в листбоксе -посмотрю.
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4159 / 2448 / 508
Регистрация: 13.12.2016
Сообщений: 8,327
Записей в блоге: 5
14.08.2021, 08:28
Лучший ответ Сообщение было отмечено Авдей как решение

Решение

Цитата Сообщение от Авдей Посмотреть сообщение
проблема в том что сбивается растановка по listbox почему то..
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
Private Sub UserForm_Activate()
Dim d: Dim f()
d = [Таблица1]: j = 0
For i = 1 To UBound(d)
    If d(i, 7) = 1 Then
        j = j + 1
    End If
Next
ReDim Preserve f(j, 7): j = 0
For i = 1 To UBound(d)
    If d(i, 7) = 1 Then
        For r = 1 To 7
            f(j, r) = d(i, r)
        Next
        j = j + 1
    End If
Next
With ListBox1
    .ColumnCount = 7
    .Clear
    .List = f
 End With
End Sub
этот код передает со столбцами
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.08.2021, 08:28
Помогаю со студенческими работами здесь

Как скопировать в массив определенные ячейки из Excel?
Помогите пожалуйста есть файл excel с несколькими листами, нужно в c#, windows forms, с определенного листа excel скопировать в...

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

Прочитать определенные строки из файла, занести в массив и вывести в консоль
есть файл { Имя : Александр, Фамилия : Александров, Возраст : 20 }, { Город : Москва, Дети : 2} как считать только...

Как из TDBGrid передать в Excel только выделенные строки?
Подскажите как из TDBGrid передать в Excel только!!! выделенные строки.

Передать параметр процедуре в Excel (вставка строки со сдвигом)
например, вставляю строку так: Variant C; Excel.OlePropertyGet("WorkSheets",1).OleProcedure("Select"); ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru