Hvordan sjekke for tom array i VBA-makro

stemmer
48

Jeg vil sjekke for tomme arrays. Google ga meg ulike løsninger, men ingenting virket. Kanskje jeg ikke bruke dem riktig.

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

Her hvis FileNamesListmatrise er tom, GetBoiler(SigString)bør ikke bli kalt i det hele tatt. Når FileNamesListmatrisen er tom, SigStringer også tom, og dette innebærer at GetBoiler()funksjonen med tom streng. Jeg får en feilmelding på linjen

Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)

siden sFileer tom. Noen måte å unngå det?

Publisert på 15/10/2008 klokken 18:31
kilden bruker
På andre språk...                            


23 svar

stemmer
4

Denne koden gjør ikke hva du forventer:

If Dir(SigString) <> "" Then
    Signature = GetBoiler(SigString) 
Else
    Signature = "" 
End If

Hvis du passerer en tom streng ( "") eller vbNullStringtil Dir, vil den returnere navnet på den første filen i den gjeldende katalogen bane (banen returnert av CurDir$). Så, hvis SigStringer tom, din Ifvil tilstanden evalueres til Truegrunn Dirvil returnere en ikke-tom streng (navnet på den første filen i den gjeldende katalogen), og GetBoilervil bli kalt. Og hvis SigStringer tom, kallet til fso.GetFilevil mislykkes.

Du bør enten endre tilstanden din for å sjekke at SigStringikke er tom, eller bruk FileSystemObject.FileExistsmetoden i stedet for Dirfor å sjekke om filen finnes. Direr vanskelig å bruke nettopp fordi det gjør ting du kanskje ikke forventer at det skal gjøre. Personlig ville jeg bruke Scripting.FileSystemObjecti løpet Dirfordi det er ingen morsom virksomhet ( FileExistsavkastning Truehvis filen finnes, og, vel, Falsehvis det ikke). Hva mer, FileExistsuttrykker intensjonen av koden din mye klarere enn Dir.

Metode 1: Sjekk at SigStringikke er tomt først

If SigString <> "" And Dir(SigString) <> "" Then
    Signature = GetBoiler(SigString) 
Else
    Signature = "" 
End If

Metode 2: Bruk FileSystemObject.FileExistsmetode

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

If fso.FileExists(SigString) Then
    Signature = GetBoiler(SigString) 
Else
    Signature = "" 
End If
Svarte 15/10/2008 kl. 19:14
kilden bruker

stemmer
66

Som du arbeider med en streng array, har du vurdert Delta?

If Len(Join(FileNamesList)) > 0 Then
Svarte 15/10/2008 kl. 19:14
kilden bruker

stemmer
0

Jeg skal generalisere problemet og spørsmålet som forutsatt. Test assingment på tabellen, og ta eventuelle feil

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

Klart det savner matriser med alle negative indekser eller alle> en ... er det sannsynlig? i weirdland, ja.

Svarte 12/11/2008 kl. 17:00
kilden bruker

stemmer
26

Hvis du tester på en rekke funksjon det vil fungere for alle grenser:

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
Svarte 06/03/2009 kl. 17:10
kilden bruker

stemmer
5

Når du skriver VBA det er denne setningen i hodet mitt: "Kan være så enkelt, men ..."

Her er hva jeg adoptert det til:

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
Svarte 01/04/2011 kl. 07:55
kilden bruker

stemmer
-1

En annen løsning for å teste for tom matrise

if UBound(ar) < LBound(ar) then msgbox "Your array is empty!"

Eller, hvis du allerede vet at LBound er 0

if -1 = UBound(ar) then msgbox "Your array is empty!"

Dette kan være raskere enn å delta (). (Og jeg sjekket ikke med negative indekser)

Her er min prøve å filtrere 2 streng arrays slik at de ikke deler samme strenger.

' Filtering ar2 out of strings that exists in ar1

For i = 0 To UBound(ar1)

    ' filter out any ar2.string that exists in ar1
    ar2 = Filter(ar2 , ar1(i), False)    

    If UBound(ar2) < LBound(ar2) Then
       MsgBox "All strings are the same.", vbExclamation, "Operation ignored":
       Exit Sub

    End If

Next

' At this point, we know that ar2 is not empty and it is filtered 
'
Svarte 15/07/2012 kl. 08:43
kilden bruker

stemmer
-1
Public Function arrayIsEmpty(arrayToCheck() As Variant) As Boolean
    On Error GoTo Err:
    Dim forCheck
    forCheck = arrayToCheck(0)
    arrayIsEmpty = False
    Exit Function
Err:
    arrayIsEmpty = True
End Function
Svarte 03/11/2012 kl. 14:38
kilden bruker

stemmer
49

Gå med en trippel negative:

If (Not Not FileNamesList) <> 0 Then
    ' Array has been initialized, so you're good to go.
Else
    ' Array has NOT been initialized
End If

Eller bare:

If (Not FileNamesList) = -1 Then
    ' Array has NOT been initialized
Else
    ' Array has been initialized, so you're good to go.
End If

I VB, uansett grunn, Not myArrayreturnerer SAFEARRAY pekeren. For initialisert matriser, returnerer -1. Du kan Notdette til XOR det med -1, og dermed returnere null, hvis du foretrekker det.

               (Not myArray)   (Not Not myArray)
Uninitialized       -1                 0
Initialized    -someBigNumber   someOtherBigNumber

Kilde

Svarte 17/01/2013 kl. 12:49
kilden bruker

stemmer
0

Personlig tror jeg en av svarene ovenfor kan modifiseres for å sjekke om matrisen har innholdet:

if UBound(ar) > LBound(ar) Then

Dette håndterer negativt tall referanser og tar mindre tid enn noen av de andre alternativene.

Svarte 27/03/2013 kl. 17:05
kilden bruker

stemmer
4

Jeg er rett og slett lime under koden ved den store Chip Pearson. Det fungerer en sjarm.
Her er hans side på array funksjoner .

Jeg håper dette hjelper.

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
Svarte 30/09/2013 kl. 11:52
kilden bruker

stemmer
1
Public Function IsEmptyArray(InputArray As Variant) As Boolean

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

   ErrHandler:
   IsEmptyArray = True

End Function
Svarte 15/01/2014 kl. 20:14
kilden bruker

stemmer
2

Auth var nærmest, men hans svar kaster en type mismatch feil.

Som for de andre svarene du bør unngå å bruke en feil for å teste for en tilstand, hvis du kan, fordi i det minste det kompliserer debugging (hva om noe annet som forårsaker denne feilen).

Her er en enkel, komplett løsning:

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
Svarte 08/04/2014 kl. 13:49
kilden bruker

stemmer
2

Forenklet sjekk for Empty Array:

Dim exampleArray() As Variant 'Any Type

If ((Not Not exampleArray) = 0) Then
      'Array is Empty
Else
      'Array is Not Empty
End If
Svarte 21/10/2014 kl. 13:25
kilden bruker

stemmer
0

Man kan bruke under funksjonen for å kontrollere om variant eller streng rekke er tom i 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

Prøve bruk

Public Function test()
Dim Arr(1) As String
Arr(0) = "d"
Dim x As Boolean
x = IsArrayAllocated(Arr)
End Function
Svarte 04/05/2015 kl. 07:43
kilden bruker

stemmer
6

Jeg ser lignende svar på her ... men ikke min ...

Dette er hvordan jeg unfortunatley kommer til å håndtere det ... Jeg liker len (delta (arr))> 0 tilnærming, men det ville ikke fungere hvis matrisen var en rekke 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
Svarte 26/06/2015 kl. 20:26
kilden bruker

stemmer
1

En annen metode ville være å gjøre det før. Du kan lage en boolsk variabel og sette den til true når du laster data til array. så alt du egentlig trenger er en enkel hvis setningen av når du legger inn data i tabellen.

Svarte 11/02/2016 kl. 12:22
kilden bruker

stemmer
1

Her er en annen måte å gjøre det. Jeg har brukt det i noen tilfeller, og det fungerer.

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
Svarte 12/05/2016 kl. 14:38
kilden bruker

stemmer
0

Man kan kontrollere om datatabellen er tom ved å hente totale elementer telling ved hjelp av JScript s VBArray()objekt (arbeider med matriser av variant typen, enkelt eller flerdimensjonal):

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

For meg tar det omtrent 0,3 mksec for hvert element + 15 msek initialiseringen, slik at rekken av elementer 10M tar ca 3 sek. Det samme funksjonalitet kan implementeres via ScriptControlActiveX (det er ikke tilgjengelig i 64-biters MS Office-versjoner, slik at du kan bruke midlertidig løsning som dette ).

Svarte 05/08/2016 kl. 09:45
kilden bruker

stemmer
0
Function IsVarArrayEmpty(anArray As Variant) as boolean
    On Error Resume Next
    IsVarArrayEmpty = true
    IsVarArrayEmpty = UBound(anArray) < LBound(anArray)
End Function

Kanskje uboundkrasjer og det er fortsatt på sant, og hvis ubound < lbound, det er tomt

Svarte 30/09/2016 kl. 14:49
kilden bruker

stemmer
1

For å sjekke om en byte array er tom, er den enkleste måten å bruke VBA-funksjonen StrPtr().

Dersom byte array er tom, StrPtr()returnerer 0; ellers, returnerer en verdi forskjellig fra null (men det er imidlertid ikke adressen til det første elementet).

Dim ar() As Byte
Debug.Assert StrPtr(ar) = 0

ReDim ar(0 to 3) As Byte
Debug.Assert StrPtr(ar) <> 0

Men det fungerer bare med Byte array.

Svarte 30/10/2016 kl. 04:49
kilden bruker

stemmer
0
if Ubound(yourArray)>-1 then
 debug.print "The array is not empty"
else
 debug.print "EMPTY"
end if
Svarte 01/12/2016 kl. 09:32
kilden bruker

stemmer
2

Basert på ahuth er svaret ;

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

Se etter en tom matrise; is_empty = AryLen(some_array)=0

Svarte 15/07/2017 kl. 21:28
kilden bruker

stemmer
0

Du kan sjekke sin teller.

Her cid er en matrise.

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

Jeg håper dette hjelper. Ha en fin dag!

Svarte 19/06/2018 kl. 15:43
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more