Soucis avec With et .range
Bonjour à tous,
je suis nouveau sur le forum et utilisateur semi-debutant de vba sous Excel.
Je vous expose mon problème:
Sur une feuil1 j'ai un bouton qui déclenche un Sub quand je clique dessus. Cette sub doit traiter la Feuil5 en faisant:
- a partir de la ligne 6, lister toutes les lignes non vide
- supprimer ces lignes
- puis créer de nouvelles lignes en allant piocher des informations dans un 3eme Feuille.
Pour l'instant de me focalise sur les 2eres points. J'ai donc créé cette fonction:
Sub Test (à
Dim k, j As Integer
With Sheets(5)
.Unprotect Password:=Pass
'recuperer l'index de la premiere ligne non vide de la colonne C
k = .Range("C" & Rows.Count).End(xlUp).Row
' supprimer les lignes entre la ligne 5 et la première ligne non vide
.Range(Rows(6), Rows(k)).EntireRow.Select
Selection.Delete
' a completer pour le point 3
.Unprotect Password:=Pass
End With
End Submalheureusement cela ne fonctionne pas... j'ai l'erreur 1004. Je vois pas trop ce que je fais de travers.
Un peu d'aide serait bienvenue
Merci
Bonjour,
Essaie ainsi :
Public Sub Test()
Dim k As Long
Application.ScreenUpdating = False
With Worksheets(5)
.Unprotect "Pass"
'recuperer l'index de la premiere ligne non vide de la colonne C
k = .Range("C" & Rows.Count).End(xlUp).Row
' supprimer les lignes entre la ligne 5 et la première ligne non vide
.Range("C6:C" & k).EntireRow.Delete
' a completer pour le point 3
.Protect Password:="Pass"
End With
End SubBonjour,
Cool ça fonctionne...
Par contre, peux-tu m'expliquer ce qui n'allait pas dans mon code, histoire que je comprenne le fonctionnement.
De plus, pourquoi mettre plutôt "Long" que "Integer" pour la variable k?
Je vais pouvoir m'atteler à la création de mes nouvelles lignes avec mise en place de mise place conditionnelle, mise en page et tout le toutime... j'espere que cela ne va pas être trop coton.
Dernière question: Je souhaite mettre en place un calcul matriciel sur les lignes que je vais créer, c'est faisable en passant par vba?
Merci
Bonjour,
si je peux me permettre Jean-Eric...
Long à la place de Integer parce que les lignes dans excel vont au-delà de 32000 !
En effet lorsque l'on définit une variable Integer sa valeur est comprise entre -32000 (et des poussières) et + 32000 (et des poussières)
Hors excel avait 66536 ligne pour les version antérieure à 2007 et 1 000 000 de lignes et des poussières depuis 2007 !
Donc Long évitera des erreurs si votre tableau s'agrandi... Enfin je pense.
Ensuite lorsque vous écrivez :
.Range(Rows(6), Rows(k)).EntireRow.Select
il faut savoir que range est sous la forme Colonne-Ligne par exemple Range("A3")
hors dans votre écriture cela revien à dire Range(6,13) !
donc
.Range("C6:C" & k).EntireRow.Delete
précise bien la zone sous la forme Lettre-chiffre en correspondance avec les colonnes-Lignes.
ensuite vous sélectionnez pour après supprimer la sélection, hors sous VBA Excel, il n'est pas nécessaire de sélectionner pour travailler sur les cellules donc le code :
.Range(Rows(6), Rows(k)).EntireRow.Select
Selection.Delete
est judistieusement remplacer par:
.Range(Rows(6), Rows(k)).EntireRow.Delete
plus après le correction au niveau de la sélection de zone :
.Range("C6:C" & k).EntireRow.Delete
@ bientôt
LouReeD
Bonjour Loureed,
Merci pour ces explications très clairs et précises.
@+