Saya ingin cek kosong array. Google memberiku beragam solusi tapi tidak ada yang berhasil. Mungkin aku tidak menerapkannya dengan benar.
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
Di sini jika FileNamesList
array kosong, GetBoiler(SigString)
tidak boleh disebut sama sekali. Ketika FileNamesList
array kosong, SigString
juga kosong dan ini panggilan GetBoiler()
fungsi dengan string kosong. Saya mendapatkan error di line
Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
sejak sFile
kosong. Cara untuk menghindari itu?
Pergi dengan triple negatif:
If (Not Not FileNamesList) <> 0 Then
' Array has been initialized, so you're good to go.
Else
' Array has NOT been initialized
End If
Atau hanya:
If (Not FileNamesList) = -1 Then
' Array has NOT been initialized
Else
' Array has been initialized, so you're good to go.
End If
Di VB, untuk alasan apapun, Tidak myArray
kembali SafeArray pointer. Untuk uninitialized array, ini akan mengembalikan -1. Anda dapat Tidak
ini untuk XOR dengan -1, sehingga kembali nol, jika anda lebih suka.
(Not myArray) (Not Not myArray)
Uninitialized -1 0
Initialized -someBigNumber someOtherBigNumber
Jika anda tes pada sebuah array dengan fungsi it'll bekerja untuk semua batas-batas:
Function IsVarArrayEmpty(anArray As Variant)
Dim i As Integer
On Error Resume Next
i = UBound(anArray,1)
If Err.number = 0 Then
IsVarArrayEmpty = False
Else
IsVarArrayEmpty = True
End If
End Function
Aku melihat jawaban yang sama di sini... tapi bukan milikku...
Ini adalah bagaimana saya unfortunatley akan berurusan dengan itu... saya suka len(bergabung(arr)) > 0 pendekatan, tapi itu tidak't bekerja jika array adalah sebuah array dari emptystrings...
Public Function arrayLength(arr As Variant) As Long
On Error GoTo handler
Dim lngLower As Long
Dim lngUpper As Long
lngLower = LBound(arr)
lngUpper = UBound(arr)
arrayLength = (lngUpper - lngLower) + 1
Exit Function
handler:
arrayLength = 0 'error occured. must be zero length
End Function
Ketika menulis VBA ada kalimat ini di kepala saya: "Bisa jadi mudah, tapi..."
Berikut adalah apa yang saya diadopsi ke:
Private Function IsArrayEmpty(arr As Variant)
' This function returns true if array is empty
Dim l As Long
On Error Resume Next
l = Len(Join(arr))
If l = 0 Then
IsArrayEmpty = True
Else
IsArrayEmpty = False
End If
If Err.Number > 0 Then
IsArrayEmpty = True
End If
On Error GoTo 0
End Function
Private Sub IsArrayEmptyTest()
Dim a As Variant
a = Array()
Debug.Print "Array is Empty is " & IsArrayEmpty(a)
If IsArrayEmpty(a) = False Then
Debug.Print " " & Join(a)
End If
End Sub
Kode ini doesn't melakukan apa yang anda harapkan:
If Dir(SigString) <> "" Then
Signature = GetBoiler(SigString)
Else
Signature = ""
End If
Jika anda melewati sebuah string kosong (","
) atau vbNullString
untuk Dir
, itu akan mengembalikan nama file dalam direktori saat ini jalur (path kembali oleh CurDir$
). Jadi, jika SigString
kosong, anda Jika
kondisi akan mengevaluasi untuk Benar
karena Dir
akan kembali non-string kosong (nama file dalam direktori saat ini), dan GetBoiler
akan disebut. Dan jika SigString
kosong, panggilan untuk fso.GetFile
akan gagal.
Anda harus mengubah kondisi anda untuk memeriksa bahwa SigString
isn't kosong, atau menggunakan FileSystemObject.FileExists
metode bukan Dir
untuk memeriksa apakah file ada. Dir
adalah sulit untuk menggunakan justru karena itu hal-hal yang anda mungkin tidak berharap untuk melakukan. Secara pribadi, saya akan menggunakan Scripting.FileSystemObject
atas Dir
karena ada's tidak ada bisnis lucu (FileExists
mengembalikan True
jika file ada, dan, well, False
jika itu doesn't). Apa's lebih, FileExists
mengungkapkan niat kode anda lebih jelas daripada Dir
.
Metode 1: Periksa bahwa SigString
non-kosong pertama
If SigString <> "" And Dir(SigString) <> "" Then
Signature = GetBoiler(SigString)
Else
Signature = ""
End If
Metode 2: Gunakan FileSystemObject.FileExists
metode
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(SigString) Then
Signature = GetBoiler(SigString)
Else
Signature = ""
End If
Saya hanya paste di bawah kode oleh Chip Pearson. Karya pesona. Berikut ini's-nya halaman pada fungsi array.
Saya harap ini membantu.
Public Function IsArrayEmpty(Arr As Variant) As Boolean
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' IsArrayEmpty
' This function tests whether the array is empty (unallocated). Returns TRUE or FALSE.
'
' The VBA IsArray function indicates whether a variable is an array, but it does not
' distinguish between allocated and unallocated arrays. It will return TRUE for both
' allocated and unallocated arrays. This function tests whether the array has actually
' been allocated.
'
' This function is really the reverse of IsArrayAllocated.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim LB As Long
Dim UB As Long
err.Clear
On Error Resume Next
If IsArray(Arr) = False Then
' we weren't passed an array, return True
IsArrayEmpty = True
End If
' Attempt to get the UBound of the array. If the array is
' unallocated, an error will occur.
UB = UBound(Arr, 1)
If (err.Number <> 0) Then
IsArrayEmpty = True
Else
''''''''''''''''''''''''''''''''''''''''''
' On rare occasion, under circumstances I
' cannot reliably replicate, Err.Number
' will be 0 for an unallocated, empty array.
' On these occasions, LBound is 0 and
' UBound is -1.
' To accommodate the weird behavior, test to
' see if LB > UB. If so, the array is not
' allocated.
''''''''''''''''''''''''''''''''''''''''''
err.Clear
LB = LBound(Arr)
If LB > UB Then
IsArrayEmpty = True
Else
IsArrayEmpty = False
End If
End If
End Function
Auth paling dekat tapi jawabannya melempar kesalahan type mismatch.
Adapun jawaban yang lain anda harus menghindari menggunakan sebuah kesalahan untuk menguji kondisi, jika anda bisa, karena setidaknya itu mempersulit debugging (apa yang jika ada sesuatu yang lain yang menyebabkan kesalahan itu).
Berikut ini's sederhana, solusi lengkap:
option explicit
Function foo() As Variant
Dim bar() As String
If (Not Not bar) Then
ReDim Preserve bar(0 To UBound(bar) + 1)
Else
ReDim Preserve bar(0 To 0)
End If
bar(UBound(bar)) = "it works!"
foo = bar
End Function
Berdasarkan ahuth's jawaban;
Function AryLen(ary() As Variant, Optional idx_dim As Long = 1) As Long
If (Not ary) = -1 Then
AryLen = 0
Else
AryLen = UBound(ary, idx_dim) - LBound(ary, idx_dim) + 1
End If
End Function
Periksa array kosong; is_empty = AryLen(some_array)=0
Anda dapat menggunakan fungsi di bawah ini untuk memeriksa apakah varian atau string array kosong di vba
Function IsArrayAllocated(Arr As Variant) As Boolean
On Error Resume Next
IsArrayAllocated = IsArray(Arr) And _
Not IsError(LBound(Arr, 1)) And _
LBound(Arr, 1) <= UBound(Arr, 1)
End Function
Contoh penggunaan
Public Function test()
Dim Arr(1) As String
Arr(0) = "d"
Dim x As Boolean
x = IsArrayAllocated(Arr)
End Function
Metode lain yang akan melakukannya lebih cepat. Anda dapat membuat sebuah variabel Boolean dan set ke true setelah anda memuat data ke array. jadi semua yang anda benar-benar butuhkan adalah sederhana jika pernyataan ketika anda memuat data ke dalam array.
Berikut adalah cara lain untuk melakukannya. Saya telah digunakan dalam beberapa kasus dan's bekerja.
Function IsArrayEmpty(arr As Variant) As Boolean
Dim index As Integer
index = -1
On Error Resume Next
index = UBound(arr)
On Error GoTo 0
If (index = -1) Then IsArrayEmpty = True Else IsArrayEmpty = False
End Function
Function IsVarArrayEmpty(anArray As Variant) as boolean
On Error Resume Next
IsVarArrayEmpty = true
IsVarArrayEmpty = UBound(anArray) < LBound(anArray)
End Function
Mungkin ubound
crash dan itu tetap benar, dan jika ubound < lbound
, it's kosong
Untuk memeriksa apakah sebuah Byte array kosong, cara paling sederhana adalah dengan menggunakan fungsi VBA StrPtr()
.
Jika Byte array kosong, StrPtr()
kembali 0
; jika tidak, mengembalikan nilai non-nol (namun, hal's alamat elemen pertama).
Dim ar() As Byte
Debug.Assert StrPtr(ar) = 0
ReDim ar(0 to 3) As Byte
Debug.Assert StrPtr(ar) <> 0
Namun, ini hanya bekerja dengan Byte array.
Anda dapat memeriksa jika array kosong dengan mengambil total elemen menghitung menggunakan JScript's VBArray()
objek (bekerja dengan array jenis varian, single atau multidimensi):
Sub Test()
Dim a() As Variant
Dim b As Variant
Dim c As Long
' Uninitialized array of variant
' MsgBox UBound(a) ' gives 'Subscript out of range' error
MsgBox GetElementsCount(a) ' 0
' Variant containing an empty array
b = Array()
MsgBox GetElementsCount(b) ' 0
' Any other types, eg Long or not Variant type arrays
MsgBox GetElementsCount(c) ' -1
End Sub
Function GetElementsCount(aSample) As Long
Static oHtmlfile As Object ' instantiate once
If oHtmlfile Is Nothing Then
Set oHtmlfile = CreateObject("htmlfile")
oHtmlfile.parentWindow.execScript ("function arrlength(arr) {try {return (new VBArray(arr)).toArray().length} catch(e) {return -1}}"), "jscript"
End If
GetElementsCount = oHtmlfile.parentWindow.arrlength(aSample)
End Function
Bagi saya itu membutuhkan waktu sekitar 0.3 mksec untuk setiap elemen + 15 msec inisialisasi, sehingga para 10M elemen membutuhkan waktu sekitar 3 detik. Fungsi yang sama dapat dilaksanakan melalui ScriptControl
ActiveX (hal ini tidak tersedia dalam 64-bit MS Office versi, sehingga anda dapat menggunakan solusi seperti ini).
Secara pribadi, saya pikir salah satu dari jawaban di atas dapat dimodifikasi untuk memeriksa jika array memiliki isi:
if UBound(ar) > LBound(ar) Then
Ini menangani negatif nomor referensi dan membutuhkan waktu kurang dari beberapa pilihan lainnya.
I'll menggeneralisasi masalah dan Pertanyaan seperti yang dimaksudkan. Tes assingment pada array, dan akhirnya menangkap kesalahan
Function IsVarArrayEmpty(anArray as Variant)
Dim aVar as Variant
IsVarArrayEmpty=False
On error resume next
aVar=anArray(1)
If Err.number then '...still, it might not start at this index
aVar=anArray(0)
If Err.number then IsVarArrayEmpty=True ' neither 0 or 1 yields good assignment
EndIF
End Function
Yakin itu meleset array dengan semua negatif indeks atau semua > 1... apakah itu mungkin? di weirdland, ya.