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 Sub

malheureusement 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 Sub

Bonjour,

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.

@+

Rechercher des sujets similaires à "soucis range"