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 :

Autofill uniquement les cellules vides [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Par défaut Autofill uniquement les cellules vides
    Bonjour !

    J'ai une colonne A avec des données jusqu'à la cellule A300. Certaines sont vides, d'autres non.

    En VBA, je rentre une formule dans la cellule A1 puis j'utilise la fonction Autofill pour la rentrer dans toute ma colonne A (Jusqu'à A300).

    Le problème est que les données contenues dans les cellules non vides de la colonne A sont elles aussi écrasées !

    J'ai essayer de filtrer sur les cellules vides avant d'appliquer l'autofill mais ça refill également les cellules filtrées...

    Y a-t-il un moyen d'ajouter un paramètre "only empty cells" à l'autofill ?

    Pour rappelle voici la ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ws.Range("A1").Select
    Selection.AutoFill Destination:=ws.Range(ws.Cells(1, 1), ws.Cells(300, 1))
    Et la ligne de code pour le filtre sur cellules vides :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ws.Range("$A$1:$A$300").AutoFilter Field:=1, Criteria1:="="

    On ne peut pas écrire un truc ressemblant à ça ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.AutoFill Destination:=ws.Range(ws.Cells(1, 1), ws.Cells(300, 1)), Criteria1:="="

    Merci de votre attention.

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").Copy Range("A2:A300").SpecialCells(xlCellTypeBlanks)

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Par défaut
    Bonjour désolé du temps de réponse. Merci beaucoup je pense que c'est ce qu'il me fallait. N'étant pas sur mon lieu de travail je vous tiendrais au courant du résultat demain. Encore merci !

    EDIT : ça fonctionne parfaitement merci !

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Par défaut
    Ok je me suis emballé un peu vite...

    Il y a un problème connu avec le "SpecialCells(xlCellTypeBlanks).Select".

    La formule que je colle dans les "cellules vides" est une formule de type RECHERCHEV + IF, qui renvoi "" (vide) si le recherchev ne trouve pas de correspondance. Puis je fais un copier coller des cellules pour transformer les résultats de formule en donnée brut.

    Le problème se trouve là. Lorsque que l'on copie colle une cellule vide, on la voit vide, mais il y a des données cachées qu'Excel considère comme non vide (quelques sujets en parle sur le forum, ils expliquent bien mieux que moi)

    En gros lors du premier jet, les cellules sont réellement vides. La formule copie colle ces cellules. Elles restent vides, mais ne sont plus considérées comme vide.

    Lors du deuxième (et suivants) jet, on obtient alors une erreur 1004 "pas de cellule correspondante" car en effet, il ne détecte plus les cellules comme vides.

    Je ne sais donc pas comment contourner ce problème...

  5. #5
    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 maximeozenne Voir le message
    Il y a un problème connu avec le "SpecialCells(xlCellTypeBlanks).Select".
    Je ne t'ai certainement pas conseillé de mettre un Select.
    Je peux même te conseiller d'éviter autant que possible d'éviter ce membre.

    La formule que je colle dans les "cellules vides" est une formule de type RECHERCHEV + IF, qui renvoi "" (vide) si le recherchev ne trouve pas de correspondance. Puis je fais un copier coller des cellules pour transformer les résultats de formule en donnée brut.
    Si tu n'indiques pas le contenu de cette formule, comment imagines-tu qu'on puisse t'indiquer comment l'adapter ?

    Le problème se trouve là. Lorsque que l'on copie colle une cellule vide, on la voit vide, mais il y a des données cachées qu'Excel considère comme non vide (quelques sujets en parle sur le forum, ils expliquent bien mieux que moi)
    Une cellule contenant une formule n'est pas vide, même si son résultat est une chaine de caractère de longueur nulle.

    Dans ce cas, il faudra faire une boucle qui scrute chaque cellule, vérifie avec la propriété Text si elle est vide et, si c'est le cas, fasse un coller dedans.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Par défaut
    A vrai dire la formule renvoie nulle, puis je fais un copier coller de la range modifiée pour transformer les formule en donnée brut (exemple si je marque "=1+1" ça sera marqué 2 dans la case mais =1+1 dans la formule. Après ma manip', ça sera marqué 2 dans la case ET dans la formule.)

    Du coup les cellules vides résultants du renvoi de nulle par la formule, sont bel et bien vides. Si je filtre sur "non vide" ma colonne, elles disparaissent. Ma feuille les considère comme vide, mais pas le code VBA.

    Je ne me suis pas douté qu'un problème pareil existait et j'ai simplifié mon problème au maximum pour la compréhension.

    Dans un soucis d'optimisation je veux éviter les boucles, car pour 300 lignes ça va, mais quand j'en aurais 20000 ça sera pas aussi drôle.


    EDIT : Voici le lien du topic qui explique ce phénomène : http://www.developpez.net/forums/d52...ule-convaincu/

  7. #7
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour,
    essaie comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub copie()
    Range("A2:A300").SpecialCells(xlCellTypeBlanks).Value = Range("A1").Value
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Par défaut
    Bonjour,

    Merci pour ta réponse, mais ça ne fonctionne pas. ça copie le résultat de la formule et non la formule en elle même. Du coup le résultat correspond au résultat pour la première ligne, pas pour la ligne dans laquelle on copie...

    Exemple :

    Je met =LIGNE() dans la cellule A2, la Value de la cellule A2 sera 2. Si je copie le .Value dans la .Value de la cellule A3, on va se retrouver avec "2" dans la cellule A3, alors que l'on aurait voulu "3" !

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2015
    Messages : 80
    Par défaut
    Bon tant pis je passe par une boucle. Merci pour votre aide !

  10. #10
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    bon j'arrive après faut voir si cela peut convenir (personnellement je trouve pas ça super beau, mais bon à tester) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub copie()
    Application.ScreenUpdating = False
        With Range("A2:A300").SpecialCells(xlCellTypeBlanks)
            .FormulaLocal = Range("A1").FormulaLocal
        End With
            Range("A2:A300").Copy
            Range("A2:A300").PasteSpecial Paste:=xlValues
    Application.ScreenUpdating = True
    Application.CutCopyMode = False
    End Sub
    Comme cela c'est mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub copie2()
    Application.ScreenUpdating = False
        With Range("A2:A300")
            .SpecialCells(xlCellTypeBlanks).FormulaLocal = Range("A1").FormulaLocal
            .Value = .Value
        End With
    Application.ScreenUpdating = True
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

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

Discussions similaires

  1. Supprimer les cellules vides d'une sélection
    Par Franc dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/03/2008, 16h04
  2. bordure pour les cellules vides
    Par jawed84 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 14/01/2008, 15h39
  3. bordures pour les cellules vides
    Par luimême dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 26/12/2007, 13h12
  4. Enlever les cellules vide dans un ComboBox
    Par Dream Master dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 31/05/2007, 17h14
  5. Afficher les cellules vides...
    Par Invité dans le forum ASP
    Réponses: 1
    Dernier message: 31/08/2005, 18h32

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