Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/198: Рейтинг темы: голосов - 198, средняя оценка - 4.92
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2

Как проверить пуст ли массив?

22.07.2015, 09:47. Показов 39336. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
это продолжение темы. интересует грамотность записи
Visual Basic
1
If Массив(0) = "" Then ' вот эта проверка мне кажется неграмотная
Добавлено через 1 минуту
Еще интересно: как его грамотно начать заполнять. Так чтобы не было нулевой позиции в начале и постоянной проверки на ее заполненность в последующем
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.07.2015, 09:47
Ответы с готовыми решениями:

Как грамотно проверить: пуст ли массив?
Создал массив, инициализировал его. Нужно его заполнить сведениями из другого массива, который обновляется постоянно (в ряде итераций). То...

Как проверить, что выбранный диапазон ячеек пуст
Такой вопрос: есть такой код: Dim r As Range With Sheets("data1").Columns(Target.Column - 1).Find(Target.Value, LookAt:=xlWhole) ...

Как проверить в с++ пуст файл или нет?
Добрый день! Мне нужно написать программу, которая после открытия файла делает проверку, пуст этот файл или нет. Подскажите, пожалуйста,...

42
4088 / 1468 / 401
Регистрация: 07.08.2013
Сообщений: 3,668
23.07.2015, 11:33
Студворк — интернет-сервис помощи студентам
вот- а данные в массив получаете с листа - я правильно думаю?
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2
23.07.2015, 11:41  [ТС]
абсолютно верно. больше и неоткуда)))

Добавлено через 28 секунд
хотя в последнее время думаю о дополнении данных из Тырнета

Добавлено через 3 минуты
стоп.... в большой массив - данные с листа. а в реплик-массив - из большого массива данные идут...
0
4088 / 1468 / 401
Регистрация: 07.08.2013
Сообщений: 3,668
23.07.2015, 11:46
есть немножко другой подход
ADODB.Recordset
он работает намного быстрее чем перебор значений в цикле и отбрасывание лишнего

Добавлено через 2 минуты
Recordset очень легко проверить на пустоту
из него очень просто вставить данные на лист
2
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2
23.07.2015, 11:53  [ТС]
Я жеж неграмотный))) самопал. Я просто не знаю, что это такое.
И еще один момент - при чтении с листа большого массива я пользуюсь командой
Visual Basic
1
 mX = Range(Cells(1, 1), Cells(N, 22)).Value
получается достаточно быстро. А потом колбасю массив как мне надо

Добавлено через 3 минуты
А где можно почитать про этот Recordset? Может я его в класс к себе запихаю... там у меня возня с отбором данных в реплик-массивы происходит. Пока 2-100 записей - нечувствительно, как 400 и выше - уже в носу колупаться приходится
0
4088 / 1468 / 401
Регистрация: 07.08.2013
Сообщений: 3,668
23.07.2015, 11:55
а условий много?

Добавлено через 14 секунд
вот именно этот расколбас
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2
23.07.2015, 12:10  [ТС]
snipe, а вот условий, мягко говоря, дохренищщщщща.
Есть уже три десятка разных проверок, выявляющих в последовательном режиме разные типы ошибок. Количество проверок растет. Проверки производятся в соответствии с биологическими особенностями объектов проверок. Математика, как ни жаль, в данном случае не рулит вовсе.
Исправление одних ошибок позволяет выявить следующие и т.д.
В общем в зависимости от того какой тип ошибок ловим - отличаются задаваемые условия.

Добавлено через 56 секунд
теоретически количество условий 22! Но на практике их конечно значительно меньше за счет смысловых группировок
0
4088 / 1468 / 401
Регистрация: 07.08.2013
Сообщений: 3,668
23.07.2015, 12:27
Знакомо (я все это делал в аксе)
а код рекордесета ща найду

Добавлено через 4 минуты
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Set objConnection = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ActiveWorkbook.Path & "\" & ActiveWorkbook.Name & ";" & _
"Extended Properties=""Excel 12.0;HDR=Yes"";" 'HDR=Yes  первая строка используется как заголовки столбцов HDR=No - заголовков нет
 
sqlStr1 = "SELECT а2.[Номер выдачи], а2.[Номер страховки], а2.Работник"
sqlStr1 = sqlStr1 & " FROM [CRRATYLV$a2:f10000] AS а2"
rs.Open sqlStr1, objConnection, 3, 3
Worksheets("ISSUEDALL").Select
Cells(2, 8).CopyFromRecordset rs ' выгрузка рекордсета
MsgBox "Готово"
Добавлено через 3 минуты
проверка рекордсета на пустоту
Visual Basic
1
if rs.bof and rs.eof Then msgbox "Пустой"
воткнуть между 9 и 10 строкой
2
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2
23.07.2015, 12:34  [ТС]
буду попробуем)))
0
4088 / 1468 / 401
Регистрация: 07.08.2013
Сообщений: 3,668
23.07.2015, 12:39
забыл написать
редактор VBA
Tools-References
поставить галочку
Microsoft ActiveX Data Objects 2.6 Library

Добавлено через 1 минуту
если будете запускать в цикле
то перед next надо закрывать рекордсет
rs.close

Добавлено через 1 минуту
вот тело для цикла
Visual Basic
1
2
3
4
sqlStr1 = "SELECT а2.[Номер выдачи], а2.[Номер страховки], а2.Работник"
sqlStr1 = sqlStr1 & " FROM [CRRATYLV$a2:f10000] AS а2"
rs.Open sqlStr1, objConnection, 3, 3
Cells(2, 8).CopyFromRecordset rs ' выгрузка рекордсета
Добавлено через 47 секунд
надеюcь SQL вы знаете
1
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2
23.07.2015, 12:45  [ТС]
В принципе, я так понимаю, данные могут находиться в левом файле, который даже можно не открывать
0
4088 / 1468 / 401
Регистрация: 07.08.2013
Сообщений: 3,668
23.07.2015, 12:48
совершенно правильно

Добавлено через 1 минуту
вот это имя листа CRRATYLV знак доллара после имени обязателен
1
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2
23.07.2015, 12:57  [ТС]
а2. что такое не пойму
я понимаю что это таблица Sql типа, но как данные оказались там и под этим именем не уразумел пока
0
4088 / 1468 / 401
Регистрация: 07.08.2013
Сообщений: 3,668
23.07.2015, 12:59
это называется alias (псевдоним)
если бы не было его то запрос выглядел бы так
Visual Basic
1
2
sqlStr1 = "SELECT [CRRATYLV$a2:f10000].[Номер выдачи], [CRRATYLV$a2:f10000].[Номер страховки], [CRRATYLV$a2:f10000].Работник"
sqlStr1 = sqlStr1 & " FROM [CRRATYLV$a2:f10000]"]
согласитесь что так не удобно
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2
23.07.2015, 13:06  [ТС]
так... понял...
непонятка возникла из-за того, что отвык от SQL.
где создается сама таблица а2 - не увидел.
потом ей присваиваются наименования полей
а потом в поля заливается содержимое листа. а вот как поля назначаются столбцам? - по очередности?

Добавлено через 5 минут
по поводу "знаете SQL" - я всё что знаю - наколупал сам в книжках. Наколупывание связано с принципом ужаленности. Если ужаление не вызывает опухание корня хвоста, то инфа о действии антидота быстро улетучивается. так и с SQL случилось.... Когда-то читал... придется восстанавливать статус "немного слышал об этом"
0
4088 / 1468 / 401
Регистрация: 07.08.2013
Сообщений: 3,668
23.07.2015, 13:18
либо по имени (если HDR=Yes)
либо f1, f2,f3 (если HDR=No)
очередность столбцов задается в разделе Select
например можно сделать так (вариант для HDR=No)
Visual Basic
1
"Select a2.f5, a2.f3 a2.f1 From [CRRATYLV$a2:f10000] as a2 Where a2.f2>10 and a2.f4<100"
Добавлено через 1 минуту
в данном случае
первым будет столбец E потом С потом A
и условия для отбора прописаны для столбцов В и D

Добавлено через 9 минут
и тут для вас есть возможность
следующего типа
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dim a(1 to 3) as String
a(1)="10"
a(2)="20"
a(3)="30"
for i=1 to 3
sqlStr1 = "SELECT а2.[f1], а2.[f2], а2.f3"
sqlStr1 = sqlStr1 & " FROM [CRRATYLV$a2:f10000] AS а2"
sqlStr1 = sqlStr1 & " Where a2.f4>" & a(i)
rs.Open sqlStr1, objConnection, 3, 3
if rs.bof and ra.eof then
else
rs.movelast: rs.movefirst
if i=1 then df=2 
Cells(df, 8).CopyFromRecordset rs ' выгрузка рекордсета
df=df+rs.recordcount+1
end if
rs.close
next i
1
 Аватар для dzug
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
23.07.2015, 14:06
Можно так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Declare Function GetMem4 Lib "msvbvm60" (Src() As Any, Dst As Any) As Long
 
Dim D() As Long, l As Long
 ReDim D(10)
 GetMem4 D, l
 If l Then
   ' Инициализирован
 Else
   ' Неинициализирован
 End If
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2
23.07.2015, 15:03  [ТС]
С инициализацией вроде разобрались. А вот с проверкой заполненности пока еще не всё дошло до меня.
Массив может быть
1. объявлен, но не инициализирован
2. инициализирован
3. инициализирован и заполнен
4. инициализирован и опустошен

вот как запросить состояние в пунктах 3 и 4?
если инициализированный, но пустой - то нафех в ём копацо? всё равно пошлёт на далеко!
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
23.07.2015, 20:00
Цитата Сообщение от AndreA SN Посмотреть сообщение
если инициализированный, но пустой - то нафех в ём копацо? всё равно пошлёт на далеко!
Ну... я тут вижу только вариант объявить глобальный флаг boolean. Устанавливать его true как только вызвана операция заполнения.

Но касательно Вашей задачи у snipe правильный подход.
Там и часть математики можно будет отдать на совесть драйвера БД.
Прирост будет очень значительный + сбережете память ОЗУ.

Добавлено через 11 минут
Цитата Сообщение от Dragokas Посмотреть сообщение
только вариант объявить глобальный флаг boolean.
Еще есть такой подход как ступенчастое увеличение размерности массива.

На Псевдокоде:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Const Chunk as long = 100
 
Dim arr() as long
Dim idx as long ' текущая позиция в массиве
 
Sub Инициализация
  redim arr(0)
Sub
 
Sub Дополнение массива
  Buf_Size = Узнаем сколько у нас данных для дополнения
  if ubound(arr) < Buf_Size + idx then redim preserve arr ( UBound(arr) + Chunk * (Buf_Size \ Chunk + 1) )
  Записываем данные в массив
  idx = idx + Buf_Size
end sub
 
Sub Пример проверки заполнен ли массив
  if Ubound(arr) = 0 then Не заполнен
End Sub
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,218
Записей в блоге: 2
24.07.2015, 11:29  [ТС]
Dragokas, вот тут как раз и есть проблемка
Visual Basic
1
2
3
4
5
6
7
Public Sub массив_заполнен()
Dim arrr()
ReDim arrr(0)
Debug.Print UBound(arrr)
arrr(0) = 1
Debug.Print UBound(arrr)
End Sub
В обоих случаях дебугер будет выдавать нолики
Но в первом случае массив не заполнен, а во втором содержит данные.

Добавлено через 12 минут
Со snipe я тоже согласен. Но это будет актуально, когда прототип будет команда переделывать в коммерческую версию. Я задокументировал всё в коде как желательный альтернативный вариант. А пока я копаюсь в коде и упрощаю его (по возможности не в ущерб скорости) для того, чтобы:
1. толково поставить задачу
2. иметь рабочую базу по тестированию коммверсии
Цитата Сообщение от Dragokas Посмотреть сообщение
часть математики можно будет отдать на совесть драйвера БД
Тоже полностью согласен. Но сейчас именно разжевывание всей математики важно. Потом кодерам проще будет понять, чего я в истериках-то бьюся)))

Добавлено через 1 час 43 минуты
Цитата Сообщение от Dragokas Посмотреть сообщение
только вариант объявить глобальный флаг boolean. Устанавливать его true как только вызвана операция заполнения.
Вот и я думаю о том: неужели для массивов в VBA не предусмотрено такое простое свойство, как "инициализирован, но пустой". Увязка флага с состоянием массива - дополнительная болячка на седалище проги... не хотелось бы умножать уже дважды умноженное (Оккам из гроба жаловался намедни - вертеться устал)
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
24.07.2015, 11:32
Цитата Сообщение от AndreA SN Посмотреть сообщение
Dragokas, вот тут как раз и есть проблемка
Не будет, если оперировать буфером в несколько этапов так, как я написал. Либо использовать глобальный флаг.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.07.2015, 11:32
Помогаю со студенческими работами здесь

Как проверить пуст или нет буфер обмена?
Есть острая необходимость проверить пуст или нет БО. Как это можно сделать средствами vb.net? Раньше было просто: Public Declare...

Проверить, пуст ли файл
Как можно проверить пустоту файла? Поиск юзал. Добавлено через 17 минут fstream f; f.open(&quot;f.txt&quot;,ios::in);//открываем...

Проверить пуст ли Listbox
Добрый день! Помогите, пожалуйста. На форме есть список (listbox) по нажатию кнопки происходит добавление записей из списка в таблицу....

Списки. Не могу проверить, пуст ли список
Здравствуйте. Пишу лабу по прологу. Задание такое вывести список Пьес. Я написал код но в нем есть запинка. Я не могу проверить пуст ли...

SQL через ODBC: проверить перед вытаскиванием sqlread[0] что столбец не пуст
Имеется БД Access, беру оттуда строки. OdbcConnection connect = new OdbcConnection(&quot;Driver={Microsoft Access Driver...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru