web-dev-qa-db-fra.com

ActiveSheet.UsedRange.Columns.Count - 8 qu'est-ce que cela signifie?

que signifie ActiveSheet.UsedRange.Columns.Count - 8 dans vba?

Comment vba connaît la gamme utilisée?

14
strangeQuirks

Voici la définition exacte de UsedRange ( Référence MSDN ):

Chaque objet de feuille de calcul a une propriété UsedRange qui renvoie un objet Range représentant la zone d'une feuille de calcul en cours d'utilisation. La propriété UsedRange représente la zone décrite par les cellules non vides les plus éloignées en haut à gauche et en bas à droite de la feuille de calcul et inclut toutes les cellules entre les deux.

Donc, fondamentalement, ce que cette ligne fait est:

  1. .UsedRange -> "Dessine" un cadre autour des cellules les plus à l'extérieur avec un contenu à l'intérieur.
  2. .Columns -> Sélectionne les colonnes entières de ces cellules
  3. .Count -> Retourne un entier correspondant au nombre de colonnes (dans cette sélection)
  4. - 8 -> Soustrait 8 de l'entier précédent.

Je suppose que VBA calcule le UsedRange en recherchant les cellules non vides avec les valeurs d'index le plus bas et le plus élevé.

Le plus souvent, vous obtenez une erreur car le nombre de lignes de votre plage est inférieur à 3 et que, par conséquent, le nombre renvoyé est négatif.

19
Bernard Saucier

BernardSaucier vous a déjà donné une réponse. Mon article n’est pas une réponse, mais une explication de la raison pour laquelle vous ne devriez pas utiliser UsedRange.

UsedRange est très peu fiable, comme indiqué ICI

Pour trouver la dernière colonne contenant des données, utilisez .Find, puis soustrayez-vous.

With Sheets("Sheet1")
    If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
        lastCol = .Cells.Find(What:="*", _
                      After:=.Range("A1"), _
                      Lookat:=xlPart, _
                      LookIn:=xlFormulas, _
                      SearchOrder:=xlByColumns, _
                      SearchDirection:=xlPrevious, _
                      MatchCase:=False).Column
    Else
        lastCol = 1
    End If
End With

If lastCol > 8 Then
    'Debug.Print ActiveSheet.UsedRange.Columns.Count - 8

    'The above becomes

    Debug.Print lastCol - 8
End If
5
Siddharth Rout

On dirait que vous voulez vous déplacer. Essaye ça:

ActiveSheet.UsedRange.select

résulte en.... 

enter image description here

Si vous voulez déplacer cette sélection de 3 rangées vers le haut, essayez ceci

ActiveSheet.UsedRange.offset(-3).select

est ce que ca...

enter image description here

1
whytheq

Je pense que si vous essayez:

Sub Macro3()
a = ActiveSheet.UsedRange.Columns.Count - 3
End Sub  

avec une montre sur a, vous verrez que cela fait une différence.

0
pnuts

UsedRange représente non seulement les cellules non vides, mais également les cellules formatées sans aucune valeur. Et c'est pourquoi vous devriez être très vigilant.

0
Leszek