Cara cek array kosong di vba macro

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?

Mengomentari pertanyaan (1)

Sebagai anda berurusan dengan sebuah string array, anda dianggap Bergabung?

If Len(Join(FileNamesList)) > 0 Then
Komentar (8)

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

Source

Komentar (3)

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
Komentar (3)

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
Komentar (0)

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
Komentar (2)

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
Komentar (0)

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
Komentar (1)

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
Komentar (0)

Modern periksa Array Kosong:

Dim exampleArray() As Variant 'Any Type

If ((Not Not exampleArray) = 0) Then
      'Array is Empty
Else
      'Array is Not Empty
End If
Komentar (1)

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

Komentar (0)
Public Function IsEmptyArray(InputArray As Variant) As Boolean

   On Error GoTo ErrHandler:
   IsEmptyArray = Not (UBound(InputArray) >= 0)
   Exit Function

   ErrHandler:
   IsEmptyArray = True

End Function
Komentar (2)

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) 
Komentar (0)

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.

Komentar (0)

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
Komentar (0)
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

Komentar (0)

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.

Komentar (0)

Anda dapat memeriksa count.

Di sini cid adalah sebuah array.

if (jsonObject("result")("cid").Count) = 0 them
MsgBox "Empty Array"

Saya harap ini membantu. Have a nice day!

Komentar (0)

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).

Komentar (1)

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.

Komentar (1)

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.

Komentar (1)