web-dev-qa-db-fra.com

Excel Visual Basic - détecter si la plage est vide

Je ne sais pas si c'est possible, mais je veux vérifier si une plage dans Excel est vide. Alors, comment puis-je écrire si:

Range("A38":"P38")

Est vide dans le code VBA? 

Merci d'avance.

26
Kano

J'ai trouvé une solution à partir des commentaires que j'ai obtenus.

Sub Empty()
    If WorksheetFunction.CountA(Range("A38:P38")) = 0 Then
        MsgBox "Empty"
    Else
        MsgBox "Not Empty"
    End If
End Sub
47
Kano

IsEmpty renvoie True si la variable n'est pas initialisée ou est explicitement définie sur Empty; sinon, il retourne False. False est toujours renvoyé si expression contient plus d'une variable. IsEmpty ne renvoie que des informations significatives pour les variantes. ( https://msdn.Microsoft.com/en-us/library/office/gg264227.aspx ). Donc, vous devez vérifier chaque cellule dans la plage séparément:

    Dim thisColumn as Byte, thisRow as Byte

    For thisColumn = 1 To 5
        For ThisRow = 1 To 6
             If IsEmpty(Cells(thisRow, thisColumn)) = False Then
                 GoTo RangeIsNotEmpty
             End If
        Next thisRow
    Next thisColumn
    ...........
    RangeIsNotEmpty: 

Bien sûr, il y a plus de code qu'en solution avec la fonction CountA qui ne compte pas les cellules vides, mais GoTo peut interrompre les boucles si au moins une cellule non vide est trouvée et faire votre code plus rapidement, surtout si la plage est grande et vous devez détecter ce cas. De plus, ce code est plus facile à comprendre pour moi que pour Excel CountA, qui n'est pas une fonction VBA.

3
Sharunas Bielskis
Dim M As Range

    Set M = Selection

If application.CountIf(M, "<>0") < 2 Then
    MsgBox "Nothing selected, please select first BOM or Next BOM"
Else

'Your code here

End If

Par expérience, je viens d'apprendre que vous pourriez faire:

If Selection.Rows.Count < 2 
Then End If`

Clarification à fournir un peu plus tard (maintenant je travaille) 

3
DeerSpotter

Si vous vous trouvez dans une situation où il est absolument nécessaire de parcourir chaque cellule d'une plage au lieu d'utiliser CountA, il est alors beaucoup plus rapide de convertir cette plage en tableau et de boucler les valeurs de ce tableau plutôt que de parcourir plusieurs plages cellules. 

Function IsRangeEmpty(ByVal rng As Range) As Boolean

    'Converts a range to an array and returns true if a value is found in said array

    Dim area As Range
    For Each area In rng.areas

        Dim arr As Variant
        arr = area.value

        For i = LBound(arr, 2) To UBound(arr, 2)        'columns
            For j = LBound(arr, 1) To UBound(arr, 1)    'rows

                'if cell is not empty then
                If Len(Trim(arr(j, i))) > 0 Then
                    IsRangeEmpty = False
                    Exit Function
                End If

            Next j
        Next i

    Next area

    IsRangeEmpty = True

End Function

Exemple d'utilisation:

Sub Test()
    Debug.Print IsRangeEmpty(Range("A38:P38"))
End Sub

Si Range("A38:P38") est vide, cela afficherait True; sinon, il afficherait False.

1
Marcucciboy2

Une autre solution possible. Compter les cellules vides et soustraire cette valeur du nombre total de cellules

Sub Emptys()

Dim r As range
Dim totalCells As Integer

'My range To check'
Set r = ActiveSheet.range("A1:B5")

'Check for filled cells'
totalCells = r.Count- WorksheetFunction.CountBlank(r)


If totalCells = 0 Then
    MsgBox "Range is empty"
Else
    MsgBox "Range is not empty"
End If

End Sub
0
DJK
Dim cel As Range, hasNoData As Boolean

    hasNoData = True
    For Each cel In Selection
        hasNoData = hasNoData And IsEmpty(cel)
    Next

Ceci renverra True si aucune cellule dans Selection ne contient de données. Pour une plage spécifique, remplacez simplement RANGE(...) par Selection.

0
TomM