Résolu Besoin d'explications VBA

Dim.Reichart

XLDnaute Occasionnel
Bonjour à tous, (ou re-bonjour pour certains)
Je suis entrain d'essayer de coder ma première macro, et j'ai une erreur que je ne parviens pas à résoudre dès le départ (ça commence mal…)

VB:
Sub test()
Dim c As Range, n As Long
With ActiveSheet
c = Cells.Find("", "a1", LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, matchbyte:=False)
If c Is Nothing Then
MsgBox "vide"
Else
n = c.Row
MsgBox "n"
End If
End With
End Sub
Le débogueur remonte une erreur type 13: Incompatibilité de type, sur la variable C, et je ne comprend pas comment je devrais la déclarer pour que cela fonctionne.
J'explique mon raisonnement, vous me direz à quel moment j'ai faux (ou bon si c'est plus rapide):
-C cherche la première cellule vide colonne A, il va donc remonter une adresse, donc type range ou nothing que je traite avec IF
-N compte le numéro de ligne de la cellule trouvée en C, c'est donc un entier, donc type long

Donc, qu'en pensez vous?
Merci.
 

Fichiers joints

JM27

XLDnaute Impliqué
Bonjour
Comme cela peut être
Deux solutions
VB:
Sub test()
Dim c As Range, n As Long
    With Worksheets("Feuil1").Range("A1:A1000")
       Set c = .Find("", LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, matchbyte:=False)
        If c Is Nothing Then
            MsgBox "vide"
        Else
            n = c.Row
            MsgBox n
        End If
    End With
End Sub


Sub PremièreLigneVide()
    Dim derligne As Long
    derligne = Range("A1").End(xlDown) + 1
    MsgBox derligne
End Sub
 

Ikito

XLDnaute Occasionnel
Bonjour à vous deux,

Juste pour information pour l'auteur de ce post, pour les types de variables avec des entiers :

TypeStorageRange of Values
Byte1 byte0 to 255
Integer2 bytes-32,768 to 32,767
Long4 bytes-2,147,483,648 to 2,147,483,647

Integer pourrait certainement suffire ici ?
 

Roblochon

XLDnaute Accro
Re bonjour,

"With ActiveSheet" n'est pas indispensable ici. Les objets Range ont pour parent par défaut la feuille Active. Si vous vouliez travailler sur une autre feuille que la feuille active à ce moment là ce serait utile. Et dans ce cas il faudrait écrire .Cells et non Cells sans point. (C'est une des bases...)

Regardez l'aide sur Find de l'objet range qui dit que le paramètre After attend une cellule (objet Range), dans votre code vous mettez "a1" qui est une chaine de caractère (string).

Find renvoie soit un objet range soit nothing donc: Set C = Cells.Find(.......) et ça fonctionnera
Cells.Find cherchera dans toutes les cellules de la feuille, vous risquez d'avoir de drôle de surprises.
Que ce soit dans les formules ou en vba, cadrez vos actions aux plage de cellules strictement nécessaires.

Comme je vous l'ai déjà dit, voyez les bases....

Versions corrigée ci-dessous.
 

Fichiers joints

Roblochon

XLDnaute Accro
Re bonsoir,

@Ikito Depuis excel 2007 déclarer une variable integer pour les lignes de feuille est de toute façon au moment de l'éxecution convertie par le moteur vb en long, qu'elle contienne 1 ou -2,147,483,648 to 2,147,483,647

En déclarant directement en long on évite une conversion inutile.

Cordialement
 

Dim.Reichart

XLDnaute Occasionnel
D'accord, je vois le truc, merci à vous trois.
Roblochon: Je vois les bases, j'ai une dizaine de tutos, d'explications et autre ouverts sur le PC, sans compter ceux fermés depuis le début de la semaine, mais visiblement, j'ai une mauvaise interpretation. Je commence seulement à comprendre les explications de l'aide, c'est dire...
Par exemple, pour moi "A1" correspondait à l'adresse d'une cellule, c'est en vous lisant que j'ai compris qu'avec ou sans "" il recherche la cellule, ou sa valeur, ce qui change à peu près tout.
Bref, je vais continuer et revenir surement avec une autre question sous peu. Je vous remercie aussi de votre patience.
 

Ikito

XLDnaute Occasionnel
Re bonsoir,

@Ikito Depuis excel 2007 déclarer une variable integer pour les lignes de feuille est de toute façon au moment de l'éxecution convertie par le moteur vb en long, qu'elle contienne 1 ou -2,147,483,648 to 2,147,483,647

En déclarant directement en long on évite une conversion inutile.

Cordialement
Intéressant :)
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas