Help VBA

Résolu
Bonjour,
J'ai deux soucis assez importants sous VBA

Le 1er :

Voici un petit bout de mon code

derlig = Sheets(1).Range("A65536").End(xlUp).Row

Range("KPI!F6").Formula = "=SUMPRODUCT(('SIGMA'!K2:K" & derlig & "-'SIGMA'!N2:N" & derlig & ">2)*1)"
Range("KPI!D6").Formula = "=SUMPRODUCT(('SIGMA'!K2:K" & derlig & "-'SIGMA'!N2:N" & derlig & "<2)*1)"

Le colones K et N sont des dates. Ces calculs me permettent de savoir en fonction du nombre de lignes que j'ai dans mon fichier de calculer si une instruction est faite en retard ou non (retard = plus de 2 jours entre la date K et la date N).

Le souci est que j'ai des trous dans ma colonne N et avec ma fonction actuelle j'ai que des #VALEUR! dans mes cases de résultats...

Le 2ème :

J'ai un fichier texte intégré automatiquement dans un classeur excel.

Dans celle ci j'ai une colonne M dans laquelle j'ai des noms. Je souhaiterai garder seulement quelques noms et supprimer la ligne (en entier) des autres noms.

Comment faire ?

Merci.
Configuration: Windows XP / Internet Explorer 6.0

11 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    Bonjour,

    Pour le 1° problème
    Le souci est que j'ai des trous dans ma colonne N

    Je pense que ces trous ne sont pas des cellules vides mais plutôt des cellules dans lesquelles il y a du texte, peut-être des "espaces" car il n'y a pas de raison que cela donne une erreur. Si la cellule est vide c'est interprété comme un 0 et cela ne provoque pas d'erreur. La solution me semble être d'effacer en amont le contenu de ces cellules.

    Pour le 2° problème

    Il est possible de faire un code VBA qui supprime les lignes mais il faut un critère de suppression de la ligne. Quels sont les noms à garder ou à supprimer ?

    A+
    1. Pour la 1 vu que le fichier se charge en automatique et qu'il est assez conséquent, n'existe t-il pas une formule qui ne prend en compte que les cases non vides ?

      Pour la 2 j'ai une liste de 11 noms qui reviennent plusieurs fois (à savoir que mon fichier change tous les jours et varie entre 1000 et 6000 lignes)
      Je veux garder les 11 noms et supprimer le reste.

      Voici les 11 à garder.

      Arthur, Jean, Antoine, Alex, John, Etienne, Matthieu, Camille, Clotilde, Philippe, Sixtine.

      Merci d'avance
      1. Contributeur
        Bon, j'ai trouvé une formule matricielle qui fonctionne en faisant un test dans la formule. Voila la syntaxe pour le cas >2 :

        Range("KPI!F6").FormulaArray = "=SUMPRODUCT(IF(ISERROR(SIGMA!K2" & derlig & "-SIGMA!N2:N20),0,(SIGMA!K2:K" & derlig & "-SIGMA!N2:N20>2)*1))"


        Il y a peut-être plus simple.

        Une petite remarque comme le test est >2 ou <2 on est bien d'accord que les cas =2 n'est pas pris en compte. si c'est un oubli, il suffit de mettre >= ou <=.

        Pour le point 2, je prépare un petit bout de code

        Cordialement,
        1. Contributeur
          Attentioncomme j'ai testé avec 20 lignes j'ai oublié de remplacer par "derlig" dans le post précédent:

          Voila la bonne syntaxe :

          Range("KPI!F6").FormulaArray = "=SUMPRODUCT(IF(ISERROR(SIGMA!K2" & derlig & "-SIGMA!N2:N" & derlig & "),0,(SIGMA!K2:K" & derlig & "-SIGMA!N2:N" & derlig & ">2)*1))"
      2. Pour la formule :

        Il me met Impossible de définir la propriété FormulaArray de la classe range
        Et si je j'enlève le Array ça me met 0 dans mes cases que ce soir pour <2 ou >2
        1. Contributeur
          Je ne comprends pas car ce message peut arriver si la formule fait plus de 255 caractères , ce qui n'est pas le cas ou losqu'il y a une erreur de syntaxe (oubleir de remplacer les ; par des ,) ou oublier de traduire en anglais les fonctions. Mais la je ne comprends pas car cela fonctionne chez moi.
      3. Contributeur
        Peux-tu mettre un extrait de ton fichier (sans infos confidentielles) sur www.cijoint.fr et poster le lien pour que l'on puisse regarder cette erreur ?
        1. Contributeur
          Pour le problème 2 voila une proposition toute simple qui fonctionne sur la feuille courante en supposant que le nom est en colonne A:

          derlig = Range("A65536").End(xlUp).Row
          For ilig = derlig To 2 Step -1
              Nom = Range("A" & ilig).Value
              If Nom <> "Arthur" And Nom <> "Jean" And Nom <> "Antoine" And _
                 Nom <> "Alex" And Nom <> "John" And Nom <> "Etienne" And _
                 Nom <> "Matthieu" And Nom <> "Camille" And Nom <> "Clotilde" And _
                 Nom <> "Philippe" And Nom <> "Sixtine" Then
                  Rows(ilig).Delete Shift:=xlUp
              End If
          Next ilig
          --
          Cordialement,
          1. Voici le fichier les colones sont les K et N (en rouge)

            Merci pour l'autre formule ça marche parfaitement

            http://www.cijoint.fr/cjlink.php?file=cj201003/cijwPtNyRC.xls

            J'ai laissé le morceau de code que j'ai actuellement dans la macro
            1. Contributeur
              Bonjour Tonio,

              J'avoue que j'ai eu du mal à comprendre car en effet la formule ne fonctionne pas sur le fichier.

              En fait c'est parceque les cellules résultats sont fusionnées. Comme le résultat de la formule matricielle ne donne qu'une seule valeur cela semble le perturber.

              Bref, il suffit de défusionner les cellules D6 et F6.

              Par ailleurs, il y avait encore une petite erreur dans la formule voila les bonnes syntaxes :

              Range("KPI!F6").FormulaArray = "=SUMPRODUCT(IF(ISERROR(SIGMA!K2:K" & derlig & "-SIGMA!N2:N" & derlig & "),0,(SIGMA!K2:K" & derlig & "-SIGMA!N2:N" & derlig & ">2)*1))"
              
              Range("KPI!D6").FormulaArray = "=SUMPRODUCT(IF(ISERROR(SIGMA!K2:K" & derlig & "-SIGMA!N2:N" & derlig & "),0,(SIGMA!K2:K" & derlig & "-SIGMA!N2:N" & derlig & "<2)*1))"


              Je pense que maintenant c'est OK

              A+

              1. Un pb subsiste j'ai l'impression. Le résultat est 0 et 1 si on regarde manuellement on peut se rendre compte qu'il y a une instruction en retard et une qui n'est pas en retard ligne 31 et 62 (il n'y a que deux dates dans N dans le document que je t'ai donné.) si j'enlève maintenant toutes les infos dans N le résultat est 183 soit le nombre de lignes.

                A titre indicatif : le calcul effectué sert à savoir si une instruction est en retard.

                Elle est en retard si K - N > 2 sinon elle ne l'est pas.

                Je veux que soit calculé le nombre d'instruction en retard et "à l'heure".

                Lorsqu'il y a des blancs il n'y a pas d'opération à faire il faut juste les ignorer

                Merci pour tout :-)
                1. Contributeur
                  Je crois que c'est à cause du test strictement <2.
                  Donc je pense qu'en D6 le test doit être <=2

                  A+

                  Remarque : quand on enléve toutes les dates en colonne N, les valeurs passent à "vide" c'est à dire interprétée comme 0 donc tout est en retard.
              2. Tout marche !

                Merci beaucoup !!!
                1. Contributeur
                  Bonne continuation Tonio,

                  Je passe le sujet en résolu