IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Pb OffSet / Resize sur le résultat d'un Find


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Oenologue
    Inscrit en
    Juin 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Oenologue
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 79
    Par défaut Pb OffSet / Resize sur le résultat d'un Find
    Bonjour la communauté,

    Je galère depuis ce matin et j'en appelle donc à vos lumières. J'ai rédiger le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Sub EssaiSupp()
     
    Dim NmEssai As String
    Dim C As Variant
    Dim firstAddress As Variant
     
    NmEssai = InputBox("Veuillez indiquer le numéro de l'essai à supprimer :", "Suppression d'un essai dans la feuille de saisie")
        If NmEssai <> "" Then
            With Worksheets("SAISIE").[C:C]
                Set C = .Find(NmEssai, LookIn:=xlValues)
                If Not C Is Nothing Then
                    firstAddress = C.Address
                    Do
                        C.Offset(-2, 0).Resize(0, 9).Delete Shift:=xlUp
                        Set C = .FindNext(C)
                    Loop While Not C Is Nothing
                End If
            End With
        End If
     
    End Sub
    L'objectif et de trouver dans la colonne C une valeur (qui peut exister sur plusieurs lignes. Une fois la valeur trouvée je supprime les valeurs de cette ligne de la colonne A à J ... ainsi de suite.

    Mais arrivé à l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C.Offset(-2, 0).Resize(0, 9).Delete Shift:=xlUp
    patatra ça plante !

    Erreur d'exécution'1004' : Erreur définie par l'application ou par l'objet

    Je pensais que la réponse de Find était un Range stocké dans C et bien non j'ai essayé avec firstAddress qui lui stocke bien une info type Range $C$5 mais ça plante aussi

    Je suis sur que c'est un truc évident mais je cale.

    Merci d'avance.

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Les paramètres ligne/colonne de ton Offset sont inversés.

    Et le Resize ne doit pas avoir de paramètre "0". Ca signifierait que tu ne prends aucune ligne. Il faut le mettre à 1.
    Et si tu veux A à J, il faut mettre 10 et non 9.
    Resize n'agrandit pas, il redéfinit la dimension. On ne doit donc pas mettre en paramètre le supplément mais la taille finale.

    Cela dit, si c'est toute la ligne que tu veux supprimer, il y a plus simple :

  3. #3
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Autre méthode, on passe par un filtre et on supprime la zone filtrée correspondant au critère choisi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub EssaiSupp()
        Dim NmEssai As String, firstAddress As String
        Dim C As Range
        Dim Sh As Worksheet
        Set Sh = Sheets("SAISIE")
        DerLig = Sh.Range("C" & Rows.Count).End(xlUp).Row
        NmEssai = InputBox("Veuillez indiquer le numéro de l'essai à supprimer :", "Suppression d'un essai dans la feuille de saisie")
        If NmEssai <> "" Then
            If Sh.AutoFilterMode = False Then Sh.Rows(1).AutoFilter 'Ajoute un filtre sur la 1ère ligne
            Sh.Range("A3:J" & DerLig).AutoFilter Field:=3, Criteria1:=NmEssai 'Filtre sur la colonne C
            Sh.Rows("2:" & DerLig).SpecialCells(xlCellTypeVisible).Delete 'Supprime toutes les lignes avec le critère "NbEssai"
            ActiveSheet.AutoFilterMode = False 'on enlève le filtre
        End If
    End Sub
    Cdlt

  4. #4
    Membre confirmé
    Homme Profil pro
    Oenologue
    Inscrit en
    Juin 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Oenologue
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 79
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Bonjour,

    Autre méthode, on passe par un filtre et on supprime la zone filtrée correspondant au critère choisi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub EssaiSupp()
        Dim NmEssai As String, firstAddress As String
        Dim C As Range
        Dim Sh As Worksheet
        Set Sh = Sheets("SAISIE")
        DerLig = Sh.Range("C" & Rows.Count).End(xlUp).Row
        NmEssai = InputBox("Veuillez indiquer le numéro de l'essai à supprimer :", "Suppression d'un essai dans la feuille de saisie")
        If NmEssai <> "" Then
            If Sh.AutoFilterMode = False Then Sh.Rows(1).AutoFilter 'Ajoute un filtre sur la 1ère ligne
            Sh.Range("A3:J" & DerLig).AutoFilter Field:=3, Criteria1:=NmEssai 'Filtre sur la colonne C
            Sh.Rows("2:" & DerLig).SpecialCells(xlCellTypeVisible).Delete 'Supprime toutes les lignes avec le critère "NbEssai"
            ActiveSheet.AutoFilterMode = False 'on enlève le filtre
        End If
    End Sub
    Cdlt
    Bonjour ARTURO83,

    Merci pour cette proposition mais elle ne me correspond pas il me semble. Voici la feuille en question :

    Nom : Sans titre-1.jpg
Affichages : 438
Taille : 590,4 Ko

    Les boutons je peux éventuellement les placer au dessus du tableau pour ne pas les supprimer.

    Le plus gênant c'est que par exemple la colonne G contient une formule matricielle type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {=SI(E2 <> "";INDEX(DensitéDATA;EQUIV(A2&" "&B2-1;IDDATA&" "&DateDATA;0));"")}
    et cela me créé des erreurs #REF dans les cellules restantes.
    Je garde tout de même ta solution sous le coude au cas où je n'y arrive pas autrement. J'adapterais mon tableau en fonction.

    Merci.

    Cordialement.

  5. #5
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Pour les boutons, il faut aller dans les propriétés et sélectionner
    "Ne pas déplacer ou dimensionner avec les cellules"

    Pour la formule, il suffit de l'enregistrer avec l'aide de l'enregistreur de macros, et de la recopier en fin de code pour l'appliquer sur les lignes restantes après filtrage

  6. #6
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Voilà la macro avec l'insertion de la formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub EssaiSupp()
        Dim NmEssai As String, firstAddress As String
        Dim C As Range
        Dim Sh As Worksheet
        Set Sh = Sheets("SAISIE")
        DerLig = Sh.Range("C" & Rows.Count).End(xlUp).Row
        NmEssai = InputBox("Veuillez indiquer le numéro de l'essai à supprimer :", "Suppression d'un essai dans la feuille de saisie")
        If NmEssai <> "" Then
            If Sh.AutoFilterMode = False Then Sh.Rows(1).AutoFilter 'Ajoute un filtre sur la 1ère ligne
            Sh.Range("A3:J" & DerLig).AutoFilter Field:=3, Criteria1:=NmEssai 'Filtre sur la colonne C
            Sh.Rows("2:" & DerLig).SpecialCells(xlCellTypeVisible).Delete 'Supprime toutes les lignes avec le critère "NbEssai"
            ActiveSheet.AutoFilterMode = False 'on enlève le filtre
        End If
        DerLig = Sh.Range("C" & Rows.Count).End(xlUp).Row
        Range("G2").FormulaArray = "=IF(RC[-2] <> """",INDEX(DensitéDATA,MATCH(RC[-6]&"" ""&RC[-5]-1,IDDATA&"" ""&DateDATA,0)),"""")"
        Range("G2").AutoFill Destination:=Range("G2:G16"), Type:=xlFillDefault
    End Sub
    Edit:
    j'ai déposé un peu vite, vu qu'il fallait m'absenter, et en ai oublié de modifier la dernière ligne: volilà la correction
    Range("G2").AutoFill Destination:=Range("G2:G" & DerLig), Type:=xlFillDefault

  7. #7
    Membre confirmé
    Homme Profil pro
    Oenologue
    Inscrit en
    Juin 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Oenologue
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 79
    Par défaut
    Effectivement j'avais corrigé l'Offset mais pas le Resize dont je ne maitrise pas trop l'utilisation.

    Avec cette ligne corrigée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C.Offset(0, -2).Resize(1,10).Delete Shift:=xlUp
    La première occurrence est trouvée et supprimée. Par contre cela génère une nouvelle erreur puisque j'ai touché à C

    erreur '1004' : Impossible de lire la propriété FindNext de la classe Range

    Je vais essayé de reboucler avant le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set C = .Find(NmEssai, LookIn:=xlValues)

  8. #8
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par PaulG2B Voir le message
    Par contre cela génère une nouvelle erreur puisque j'ai touché à C
    erreur '1004' : Impossible de lire la propriété FindNext de la classe Range
    Supprime le "C" en paramètre dans FindNext.
    De toutes façon, il est inutile : étant donné que tu supprimes les lignes trouvées, le FindNext ne risque pas de les trouver de nouveau.

  9. #9
    Membre confirmé
    Homme Profil pro
    Oenologue
    Inscrit en
    Juin 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Oenologue
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 79
    Par défaut
    Bonjour,

    Je passe juste pour remercier Menhir et ARTURO83 j'ai synthétisais leurs propositions pour ma suppression de ligne et virer la formule matricielle (d'ailleurs j'ai l'impression que cela allège le fichier).

    Bonne continuation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide sur le résultat d'un test
    Par Invité dans le forum ASP
    Réponses: 3
    Dernier message: 27/09/2006, 10h32
  2. Réponses: 11
    Dernier message: 11/08/2006, 17h52
  3. comparaison de valeur sur un résultat de requete
    Par griese dans le forum Langage
    Réponses: 5
    Dernier message: 28/06/2006, 16h23
  4. Réponses: 3
    Dernier message: 11/01/2006, 19h35
  5. [Firebird] DELETE sur le résultat d'une requete d'un IBQUERY
    Par shashark dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/06/2005, 19h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo