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