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

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

22.07.2015, 09:47. Показов 40066. Ответов 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
3947 / 2340 / 790
Регистрация: 02.11.2012
Сообщений: 6,220
22.07.2015, 10:13
Цитата Сообщение от AndreA SN Посмотреть сообщение
чтобы не было нулевой позиции
перед внесением проверять.
если ячейка не пустая то вносим значение в массив.
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
22.07.2015, 11:12  [ТС]
Vlad999, согласен. Я постоянно так и делаю. Но проверять постоянно есть-ли запись в первой строке - это увеличение операций по заполнению массива в 2 раза. Вот я и спрашиваю: какие технологии заполнения массивов спецами используются. Чтобы не было лишних проверок состояния массива на "полный, пустой"
0
2062 / 491 / 134
Регистрация: 13.11.2008
Сообщений: 935
22.07.2015, 11:53
Трудно что-то советовать, когда не видно как Вы этот массив заполнять собрались.
Есть определенные костыли, чтобы проверить является ли переменная массивом и есть ли в нем хоть какое-то значение. Но здесь большую роль играет и то как переменная массива была объявлена - как массив
Dim Arr()
или как переменная типа Variant
Dim Arr
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
22.07.2015, 12:37  [ТС]
The_Prist, привожу пример
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
For i = 0 to дофига ' это цикл внешних проверок
Dim garbV As Long, is_ As Long
      varGarbagCombo = mc1.VarGARBAG_POST ' получаю данные из другого массива
      garbV = UBound(varGarbagCombo)
      For is_ = 0 To garbV
           If Iskl2(0) = "" Then ' вот эта проверка мне кажется неграмотная
                Iskl2(0) = varGarbagCombo(is_)
           Else 
                ReDim Preserve Iskl2(UBound(Iskl2) + 1) 
                Iskl2(UBound(Iskl2)) = varGarbagCombo(is_) 
           End If 
      Next is_
Next i
В первой части If заполняю первую позицию массива, а в части Else - постоянно проверяю на заполненность первую строку. Вот эта необходимость постоянной проверки вызывает вопрос.
Рабочий массив постоянно обновляется и дополняется частью глобального массива. Проводятся какие-то операции, потом рабочий массив очищается и снова всё повторяется. Вот такие циклы заполнения исчисляются десятками и сотнями тысяч. Соответственно число операций по проверке удваивает эту величину. И наворачивает код
0
2062 / 491 / 134
Регистрация: 13.11.2008
Сообщений: 935
22.07.2015, 12:50
Лучший ответ Сообщение было отмечено AndreA SN как решение

Решение

И все же не видно как объявлен этот массив. Где строка объявления Iskl2?
Он как объявлен?
dim Iskl2()? Или иначе?
В общем случае куда грамотнее завести отдельную переменную-счетчик
dim Iskl2_Cnt as Long
и потом просто её увеличивать:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Dim Iskl2_Cnt as Long
Dim garbV As Long, is_ As Long
For i = 0 to дофига ' это цикл внешних проверок
      varGarbagCombo = mc1.VarGARBAG_POST ' получаю данные из другого массива
      garbV = UBound(varGarbagCombo)
      For is_ = 0 To garbV
            ReDim Preserve Iskl2(Iskl2_Cnt) 
            Iskl2(Iskl2_Cnt) = varGarbagCombo(is_)
            Iskl2_Cnt = Iskl2_Cnt + 1
      Next is_
Next i
1
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
22.07.2015, 13:00  [ТС]
The_Prist, извиняюсь... проглядел ответный вопрос об объявлении массива
уточняю объявление
Visual Basic
1
Dim Iskl2() As String
в связке с этим вопросом интересует просто вопрос грамотной проверки массива на непустотность

Добавлено через 2 минуты
кстати. Спасибо за ответ для общего случая. Это, наверное, самый понятный мне подход...
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
22.07.2015, 13:44
Смотря что считать пустым массивом...

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Dim arr() As String
'сейчас массив пустой
redim arr(0)
'теперь уже не пустой
erase arr
'снова пустой
If Not Not arr Then
  Debug.Print "Not Empty"
Else
  Debug.Print "Empty"
End If
2
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,672
22.07.2015, 13:51
а массивы большие
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
22.07.2015, 13:52  [ТС]
Dragokas, спасибо)))
Самая крутая сводка пустых-непустых массивов)))
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
22.07.2015, 14:31
AndreA SN, только не забывайте, что результат операции - это не BOOL, а указатель на SAFEARRAY.
Так, что если нужно проверить на "Empty", пишем:

Visual Basic
1
If Not Cbool(Not Not arr) Then Debug.Print "Empty"
2
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
22.07.2015, 14:45  [ТС]
snipe, опять же смотря из какого объема действий исходить.
вот две обработки одного и того же суммирования
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
26
27
Public Sub Вложенность_циклов()
    Dim ndd, t, ewq, s
ndd = 1000
 
    DoEvents: t = Timer
    For idd = 1 To ndd
        For h = 1 To 6000
            s = s + 1
        Next h
    Next idd
    ewq = Timer - t
Debug.Print ewq, s
s = 0
    DoEvents: t = Timer
    For idd = 1 To ndd
        For h = 1 To 20
        For hh = 1 To 20
        For hhh = 1 To 15
            s = s + 1
        Next hhh
        Next hh
        Next h
    Next idd
    ewq = Timer - t
Debug.Print ewq, s
 
End Sub
в итоге получаем за счет суммирования 6000000
Но!
У меня по времени получилась разница в 1,5 раза
0,15625 6000000
0,2617188 6000000

а по максимальному размеру цикла - читай по Ubound(массив) разница составила 300 раз...
Хотя я понимаю, что мне сейчас выставят произведение размеров как конечное количество действий
но речь в данном случае всё таки о размерах обрабатываемой информации в зависимости от сложности шага обработки...

Добавлено через 13 минут
Dragokas,
Цитата Сообщение от Dragokas Посмотреть сообщение
If Not Cbool(Not Not arr) Then
очень прошу (хотя понимаю, что мой вопрос кошмарит грамотных людей), объяснить все эти Not понятным языком - что за что отвечает.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
22.07.2015, 22:31
Лучший ответ Сообщение было отмечено AndreA SN как решение

Решение

AndreA SN, да. Вы правы. Перемудрил. Можно проще.

Visual Basic
1
2
if -1 = not arr then debug.? "Empty"
if -1 <> not arr then debug.? "not Empty"
Если кратко, то оператор Not кроме основной функции (побитовое отрицание) умеет разыменовывать указатель,
что он и делает. Если указатель нулевой (т.е. массив неинициализирован), тогда Not 0 = -1.
1
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,672
23.07.2015, 04:02
AndreA SN, есть 2 функции Join и Split
первая собирает массив в текстовую переменную а вторая наоборот разбирает текстовую переменную в массив
если текстовая переменная выдержит то работать по идее это должно быстрее
вы ведь пытаетесь из много массивов сделать один
код будет выглядеть примерно так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
dim asd as string
for i=1 to m' где m количество массивов
' тут строка с проверкой массива на пустоту и если не пустой то
if asd="" Then
asd=Join(dfg(),"*")' где dfg имя массива
else
asd=asd & "*" & Join(dfg(),"*")
end if
next i
dim a() as string
a=Split(asd,"*")
1
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,672
23.07.2015, 04:09
Dragokas,
в коде VBA номера строк сползают вверх относительно текста строк
Миниатюры
Как проверить пуст ли массив?  
0
Эксперт NIX
3305 / 933 / 201
Регистрация: 14.01.2013
Сообщений: 4,775
23.07.2015, 06:54
В Опере всё норм выглядит.
Миниатюры
Как проверить пуст ли массив?  
1
23.07.2015, 09:01

Не по теме:

так я тоже в опере делал

0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
23.07.2015, 10:54  [ТС]
snipe,
Цитата Сообщение от snipe Посмотреть сообщение
из много массивов сделать один
нет... у меня задача другая... я делаю маленький реплик-массив из большого массива. причем оба они двумерны. реплик-массив как правило варьирует от 2 до нескольких десятков записей (встречаются редко случаи и до 2500), а большой массив может включать десятки тысяч записей. Постоянная перезапись реплик-массива с изменяющимися исходными условиями вынуждают при последующей работе проверять : а записалось ли чего-то в реплик-массив, или он при изменившихся условиях отбора записей остался пустым? Вот последнее хочется грамотно проверять, что Dragokas и подсказал как делать.

Добавлено через 11 минут
snipe, по поводу строчек... у меня в Chrom всё вроде норм выглядит
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,672
23.07.2015, 11:01
AndreA SN, вы тему разместили в разделе VBA, а в какой программе вы все это делаете?
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
23.07.2015, 11:25  [ТС]
snipe, толковый вопрос))) мне уже столько людей у виска пальцем крутит по поводу моего проекта в VBA))) И Вы почуяли, что моя задача монстрифицирована.
Пишу всё в Excel. Начиналось как побочная группа минимакросов по предварительной обработке данных. Разрослось до масштабного проекта по верификации сведений с функцией минимизации влияния "шаловливых ручек". В итоге на стадии завершения программа-прототип.
Конечный продукт будет рисоваться в Шарпее.

Добавлено через 9 минут
Просто почему VBA:
1. Если на VBA будет быстрей - то на шарпее будет летать аки бчёл!
2. excel - замечательный полигон для отладки работы с двумерными базами данных при сложном аналитическом инструментарии. Я вижу что происходит с данными и соответственно отлаживаю инструменты поиска
3. размечаю в цвете измененные позиции - получается учет изменений для оценки объемов корректировок
4. не нужно специального программного обеспечения - работаю на 5 машинах в разное время - нигде не ставлю шарпик
это быстрый список причин - почему VBA.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.07.2015, 11:25
Помогаю со студенческими работами здесь

Как проверить пуст или нет буфер обмена?
Есть острая необходимость проверить пуст или нет БО. Как это можно сделать средствами 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...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru