powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как проверить, что массив пустой?
21 сообщений из 21, страница 1 из 1
Как проверить, что массив пустой?
    #34577116
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пишу
Код: plaintext
if Ubound(massiv) =  0 
выдаёт Subscript of range
Код: plaintext
if Len(massiv) =  0 
сообщает Variable required

вот нашёл выход из ситуации

но может быть всё-таки есть нормальный способ?
функции IsEmpty IsNull, проверяют только переменные типа Variant
а у меня массив объявлен как
Код: plaintext
Public massiv() As Date
в Модуле1 в Excel-е
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #34577201
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/topic/338013&hl=
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #34577247
Фотография Дадахан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michael R/topic/338013&hl=
мдя.
klen_ но может быть всё-таки есть нормальный способ?
не знаю на сколько он нормальный но все же...
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #34577281
Фотография Дадахан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Дадахан]не знаю на сколько он нормальный но все же.../quot]
тут глянул еще раз. сорри. не правильно понял
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #34577328
Фотография Дадахан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в таком случае действительно, самое простое -обработка ошибки
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #34577494
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй эту фишку
но корректно работает с string

Dim massiv() As String

If Join(massiv) = Empty Then
MsgBox ""
End If
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #34578132
Диса
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_пишу
Код: plaintext
if Ubound(massiv) =  0 
выдаёт Subscript of range
Код: plaintext
if Len(massiv) =  0 
сообщает Variable required

вот нашёл выход из ситуации

но может быть всё-таки есть нормальный способ?
функции IsEmpty IsNull, проверяют только переменные типа Variant
а у меня массив объявлен как
Код: plaintext
Public massiv() As Date
в Модуле1 в Excel-е

а ты попробуй так:)

Код: plaintext
if Ubound(massiv)-Lbound(massiv)=  0  Then
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #34578376
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всех благодарю.
Видимо придётся писать с анализом на ошибку
Код: plaintext
1.
2.
3.
4.
5.
Dim ub As Integer
On Error Resume Next
ub = Ubound(massiv)
If Err Or ub =  0  Then
    'заполняю массив
End If
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #34578685
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_Всех благодарю.
Видимо придётся писать с анализом на ошибку
Код: plaintext
1.
2.
3.
4.
5.
Dim ub As Integer
On Error Resume Next
ub = Ubound(massiv)
If Err Or ub =  0  Then
    'заполняю массив
End If


klen_, необязательно с анализом.

Этот подход должен работать с любыми нестроковыми массивами:

1. В модуль:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)
Public Declare Function VarPtrArray Lib "msvbvm60.DLL" Alias "VarPtr" (Ptr() As Any) As Long

Public Function ArrayHasElements(arrTest As Long) As Boolean
    Dim lResult As Long
    CopyMemory lResult, ByVal arrTest,  4  ' This is evil code
    ArrayHasElements = lResult
End Function

2. В форму, поставив заранее кнопку:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub Command1_Click()
    Dim Result As Boolean
    Dim AnotherResult As Boolean
    Dim dtmArray() As Date
    Dim dtmAnotherArray() As Date

    ReDim dtmArray( 1 )

    dtmArray( 0 ) = CDate("05/07/2007")
    Result = ArrayHasElements(VarPtrArray(dtmArray))
    AnotherResult = ArrayHasElements(VarPtrArray(dtmAnotherArray))

    Debug.Print Result & " " & AnotherResult
    
End Sub 

Ты увидишь, что это предотвратит ошибку 9, связанную с Ubound на пустых (неимеющих элементов) массивах.

Успехов
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #34579681
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю!
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #34580552
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что мудрить:
------------------------------------------
GetArrayDimensions - возвращает размерность массива или 0 если массив не инициализирован.

UBoundArray - возвращает кол-во элементов в указанной размерности массива или -1 если данная размерность не инициализирована.

То есть UBoundArray неинициализированного массива вернет -1.
------------------------------------------
Public Function UBoundArray(ArrayName As Variant, Optional Dimension As Integer = 1) As Long
    If Dimension < 1 Or Dimension > GetArrayDimensions(ArrayName) Then
        UBoundArray = -1
    Else
        UBoundArray = UBound(ArrayName, Dimension)
    End If
End Function

Public Function GetArrayDimensions(arr As Variant) As Integer
    Dim a As Long

    CopyMemory a, ByVal VarPtr(arr) + 8, 4
    CopyMemory a, ByVal a, 4
    If a Then CopyMemory GetArrayDimensions, ByVal a, 2
End Function
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #34580718
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
у меня = Макрос1(F2,G2,H2) со своим расчётом, он выполняется как пользовательская функция
в каждой ячейке колонки " ИТОГО ". То есть
чем меньше команд в макросе, тем быстрее Excel работает.
Поэтому я остановился на обработчике ошибок. Всего две команды.
Код: plaintext
1.
2.
Dim ub As Integer
ub = Ubound(massiv)
if Err Or ub =  0  Then заполняю массив
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #34584977
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_Спасибо.
у меня = Макрос1(F2,G2,H2) со своим расчётом, он выполняется как пользовательская функция
в каждой ячейке колонки " ИТОГО ". То есть
чем меньше команд в макросе, тем быстрее Excel работает.
Поэтому я остановился на обработчике ошибок. Всего две команды.
Код: plaintext
1.
2.
Dim ub As Integer
ub = Ubound(massiv)
if Err Or ub =  0  Then заполняю массив


klen_,

Так ошибки не обрабатываются. В VB6 для этих целей используют конструкцию On Error.

Успехов
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как проверить, что массив пустой?
    #39533814
EVA123456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Введи переменную, например Arr=false. При заполнении массива присваивай Arr=true. При обращении к массиву сначала проверяй переменную.
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #39534371
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EVA123456Введи переменную, например Arr=false. При заполнении массива присваивай Arr=true. При обращении к массиву сначала проверяй переменную.хоть вопрос уже десять лет как протух, отмечусь

есть такая недокументированная фича:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Dim arr() 

If (Not arr) = -1 Then
    Debug.Print "array has not been initialized"
Else
    Debug.Print "array has been initialized " & UBound(arr)
End If
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #39534441
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

Из-за которой потом вылезают баги при работе с FPU.
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #39534848
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ATM-TURBO 2Antonariy,

Из-за которой потом вылезают баги при работе с FPU.например?
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #39534952
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim arr()

If (Not arr) = -1 Then
    Debug.Print "array has not been initialized"
Else
    Debug.Print "array has been initialized " & UBound(arr)
End If

Debug.Print 2 / 5



Проблему решает мой Add-in. http://www.cyberforum.ru/blogs/354370/blog4409.html
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #39535073
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем больше смотрю на другие языки, тем больше нравится Дефли Жесть какая-то, конечно.
Length(Array) = 0.
Сорри за оффтоп.
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #39535265
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ATM-TURBO 2Antonariy,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim arr()

If (Not arr) = -1 Then
    Debug.Print "array has not been initialized"
Else
    Debug.Print "array has been initialized " & UBound(arr)
End If

Debug.Print 2 / 5

Expression too comlpex

прикольно

а addin нафига? так второе деление работает:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim arr()

If (Not arr) = -1 Then
    Debug.Print "array has not been initialized"
Else
    Debug.Print "array has been initialized " & UBound(arr)
End If
On Error GoTo errh
Debug.Print 2 / 5
errh:
Debug.Print 2 / 5


и так:
Код: vbnet
1.
2.
3.
On Error Resume Next
Debug.Print 2 / 5
Debug.Print 2 / 5
...
Рейтинг: 0 / 0
Как проверить, что массив пустой?
    #39535292
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

автора addin нафига? так второе деление работает:
Чтобы всегда работало.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как проверить, что массив пустой?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]