Дополнительно
Как проверить пустой массив в макросе vba
Я хочу проверить пустые массивы. Google дал мне различные решения, но ничего не помогло. Возможно, я применяю их неправильно.
Function GetBoiler(ByVal sFile As String) As String
'Email Signature
Dim fso As Object
Dim ts As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
GetBoiler = ts.ReadAll
ts.Close
End Function
Dim FileNamesList As Variant, i As Integer
' activate the desired startfolder for the filesearch
FileNamesList = CreateFileList("*.*", False) ' Returns File names
' performs the filesearch, includes any subfolders
' present the result
' If there are Signatures then populate SigString
Range("A:A").ClearContents
For i = 1 To UBound(FileNamesList)
Cells(i + 1, 1).Formula = FileNamesList(i)
Next i
SigString = FileNamesList(3)
If Dir(SigString) <> "" Then
Signature = GetBoiler(SigString)
Else
Signature = ""
End If
Здесь, если массив FileNamesList
пуст, GetBoiler(SigString)
вообще не должен вызываться. Когда массив FileNamesList
пуст, SigString
также пуст, и это вызывает функцию GetBoiler()
с пустой строкой. Я получаю ошибку в строке
Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
поскольку sFile
пуст. Есть ли способ избежать этого?
57
20
Поскольку вы имеете дело со строковым массивом, рассматривали ли вы вариант Join?
Ехать с тройным негативным:
Или просто:
В VB, по каким-то причинам, не с myarray` возвращает указатель типа safearray. Для неинициализированных массивов, это возвращает -1. Вы можете " не " это XOR это с -1, таким образом, возвращается ноль, если вы предпочитаете.
Source
Если вы тест на функцию массив это'будете работать за всякие границы:
Я вижу подобные ответы здесь... но не мое...
Это как я к сожалению буду с этим бороться... Мне нравится лен(присоединиться(Арр)) и gt; 0, но это не'т работать, если массив был массив emptystrings...
При написании на VBA есть эта фраза в моей голове: "не может быть так просто, но..."и
Вот что я приняла его:
Этот код делает не то, что вы ожидаете:
Если вы передадите пустую строку (
"""
) илиvbNullString
вDir
, он вернет имя первого файла в текущем пути к каталогу (путь, возвращаемыйCurDir$
). Таким образом, еслиSigString
пуст, ваше условиеIf
будет оценено какTrue
, потому чтоDir
вернет непустую строку (имя первого файла в текущем каталоге), и будет вызванGetBoiler
. Если жеSigString
будет пустым, вызовfso.GetFile
завершится неудачей.Вам следует либо изменить условие, чтобы проверить, что
SigString
не пуст, либо использовать методFileSystemObject.FileExists
вместоDir
для проверки существования файла. МетодDir
сложен в использовании именно потому, что он делает то, чего вы, возможно, не ожидаете от него. Лично я бы использовалScripting.FileSystemObject
вместоDir
, потому что здесь нет ничего смешного (FileExists
возвращаетTrue
, если файл существует, иFalse
, если не существует). Более того,FileExists
выражает намерение вашего кода гораздо яснее, чемDir
.Метод 1: Сначала проверьте, что
SigString
не является пустым.Метод 2: Используйте метод
FileSystemObject.FileExists
.Я просто скопировав ниже код великого чипа Пирсона. Это работает Шарм. Здесь's его страницы на функции массив.
Я надеюсь, что это помогает.
Двиг был ближе всех, но его ответ выдает ошибку несоответствия типов.
Что же касается других ответов вы должны избегать использования ошибка для проверки условия, если вы можете, потому что, по крайней мере, это затрудняет отладку (если что-то еще может быть причиной этой ошибки).
Здесь'простой, комплексное решение:
Упрощенная проверка на пустой массив:
На основе ahuth'ы ответ;
Проверка на пустой массив;
is_empty = AryLen(some_array)=0
Вы можете использовать следующие функции, чтобы проверить, если вариант или строку пустой массив в VBA
Другой способ будет сделать это раньше. Вы можете создать логическую переменную и присвоить ему значение true после того, как вы загрузите данные в массив. поэтому все, что вам действительно нужно, это простой, если заявление При загрузке данных в массив.
Вот еще один способ сделать это. Я использовал его в некоторых случаях и это's работает.
Может быть,
метод ubound
падает и он остается в true, а если `метод ubound < lbound, это'ы пустЧтобы проверить, является ли байтовый массив пуст, то самый простой способ-использовать функцию VBA в <код>StrPtr()</код>.
Если массив пуст, но <код>В StrPtr()</код> возвращает <код>0</код>; в противном случае она возвращает ненулевое значение (впрочем, это'ы <б>нет</б> адрес первого элемента).
Однако, он работает только с массивом байтов.
Вы можете проверить свой счет.
Вот дур - это массив.
Я надеюсь, что это помогает. Иметь хороший день!
Вы можете проверить, если массив пуст, получая общее количество элементов с помощью JScript'VBArray с
()
объект (работы с массивами типа Variant, одно-или многомерного):Для меня это занимает около 0.3 mksec для каждого элемента + 15 инициализация МС, поэтому массив 10М элементов занимает около 3 сек. Такую же функциональность можно реализовать через ScriptControl` элементы (он не доступен в 64-разрядных MS Office версий, так что вы можете использовать обходной путь, как этот).
Лично я думаю, что одним из ответов может быть изменен, чтобы проверить, если массив имеет содержание:
Это обрабатывает отрицательные числа ссылок и занимает меньше времени, чем некоторые из других вариантов.
Я'обобщу проблему и вопрос по назначению. Протестируйте ассистирование на массиве и поймайте возможную ошибку
Конечно, он пропускает массивы со всеми отрицательными индексами или со всеми > 1... вероятно ли это? в странной стране, да.