VBA avancé

Résolu
Bonjour,

Je souhaite réalisé quelque chose d'assez complexe sur VBA
A partir d'une feuille de calcul comprenant un tableau de 9 colonnes et d'un nombre indéterminé (et non infini, c'est juste que c'est un nombre variable) de lignes..
La première colonne m'est inutile, la deuxième, contient un numéro, je souhaite qu'à partir d'un intervalle de 27 numéros, Excel sélectionne, copie et colle dans une autre feuille les colonnes qui suivent la seconde (celle contenant le numéro)
Le problème est que la plage à sélectionner n'a pas un nombre de lignes déterminé, ce dernier dépend du nombre d'écritures rattachées à ce numéro, donc est imprévisible... j'ai pensé que la meilleure solution serait de lui indiquait de copier tant que la cellule de la colonne "numéro" est vide, et une fois qu'elle ne l'est plus, qu'il vérifie si le numéro fait parti de l'intervalle... si oui qu'il continue le copiage, si non, qu'il passe au suivant
J'espère m'être bien exprimé
merci

14 réponses

  1. Contributeur
    Bonjour,

    peux tu préciser
    je souhaite qu'à partir d'un intervalle de 27 numéros

    quels sont ces 27 numéros?, où se trouvent leur source?
    Tu copies où?
    quelle est la ligne de départ du tableau source ?

    Au besoin, mettre le classeur sans données confidentielles en pièce jointe (format XL97-2003) sur
    http://cijoint.fr/
    et coller le lien proposé (clic droit-copier l'adresse) dans le message de réponse
    0
    1. http://www.cijoint.fr/cjlink.php?file=cj201105/cijqpBpic1.xls
      voilà, super ton site
      merci
      0
      1. Contributeur
        OK, merci mais il me faut ta liste des 27.... (une macro a besoin de données précises)
        0
        1. le probleme est que le fichier original est trop lourd et contient des données confidentielles... J'ai donc fait ce fichier exemple qui reprend la meme logique que l'original mais a echelle réduite
          Le principe serait donc exactement le meme
          Moi de mon coté je continue d'avancer, j'ai réussi a rajouter une condition qui permet de copier les lignes des cellules vides
          mais le soucis c'est qu'elle renvoie l'ensemble des lignes, donc meme celles qui ne font pas parties de la liste des comptes désirés
          Merci en tout cas pour ton aide, des que j'ai du nouveau je te tiens au courant
          0
          1. Contributeur
            Bis:...
            OK, merci mais il me faut ta liste des 27....

            C'est curieux comme il faille supplier des renseignements pour essayer de donner un coup de main
            Michel
            0
            1. http://www.cijoint.fr/cjlink.php?file=cj201105/cijmI7Ig45.docx voilà la liste, j'éspère qu'elle te sera utile
              0
              1. Contributeur
                Merci, j'ai pu regardé le problème....

                Où copie t'on ? les uns à la suite des autres ou 1 feuille par numéro?
                et dans ce dernier cas comment sont nommés les 27 feuilles ?

                0
                1. Contributeur
                  c'est prêt: il ne manque plus que ta réponse à cette question de destination

                  Sub ventiler_numero()
                  Dim Num As Object
                  Dim Cptr As Byte, Ref As Long
                   Dim nbre As Byte, lig As Integer, fin As Integer, T_out
                   
                  With Sheets("param")
                       Set Num = CreateObject("scripting.dictionary")
                  'liste des numéros
                       For Cptr = 2 To 28
                            Ref = .Cells(Cptr, 1)
                            Num.Add Ref, Ref
                       Next
                   End With
                   
                   With Sheets(1)
                       nbre = Application.CountA(.Range("B2:B65500"))
                       lig = 1
                       For Cptr = 1 To nbre
                            lig = .Columns(2).Find("*", .Cells(lig, 2)).Row
                            If Num.exists(.Cells(lig, 2).Value) Then
                                 fin = .Columns(2).Find("*", .Cells(lig, 2)).Row - 1
                                           If fin = 0 Then fin = .Range("E65500").End(xlUp).Row
                                  T_out = .Range(.Cells(lig, 3), .Cells(fin, 8)).Value
                            End If
                       Next
                            ' EN ATTENTE DESTINATION
                   End With
                       
                  End Sub
                  0
              2. Tout d'abord merci
                Je ne sais pas combien de temps ça t'a pris... moi il me faudrait des années pour écrire un tel code
                Pour la destination, tout dans une seule et même feuille...
                Est ce que tu pourrais me poster le fichier excel sur ton site? As-tu un bon livre ou site à me conseiller..
                Merci encore
                0
                1. C'est magique :D
                  Je suis un peu déçu parce que ce matin j'avais réussi une solution, mais genre système D quoi... et quand je vois la tienne, wow, la mienne trouve sa place dans la corbeille
                  Merci
                  Ça te générais de m'aider sur un autre truc, un peu plus compliqué que celui là ?
                  0
                  1. Contributeur
                    Envoie toujours la b^te, sois précis et complet dans ta demande

                    je marque ce post "résolu"; relance en un autre, merci
                    0
                    1. Ok, ca va me prendre un peu de temps, parce que c'super complexe à expliquer.
                      Je vais essayer d'être le plus exhaustif possible
                      Je peux juste te demander un peu d'explication sur tes codes? Ils m'aident énormément, mais j'ai l'impression que tu fais le travail à ma place, tu le fais super bien en plus, c'est juste que tes explications me permettraient de m'améliorer;
                      Si j'ai bien compris je dois lancer un nouveau sujet ?
                      Merci pour tout
                      0
                      1. Contributeur
                        je dois lancer un nouveau sujet ?

                        oui
                        0
                        1. En fait j'ai encore un léger soucis...
                          J'extrait la colonne B d'un autre logiciel,
                          le souci est que les comptes sont en format Texte, et donc impossible de les utiliser, si tu te mets sur un de ces comptes tu remarqueras un ' avant le numéro
                          Excel propose via son Collage Spécial de régler ce problème
                          Tu choisis une autre cellule, dans laquelle tu mets 1
                          ensuite tu Copie, et choisi Collage Spécial sur la Colonne B
                          Mais le problème avec cette manip comme tu peux le voir en Feuil2 est que l'intégralité de la colonne B est remplie désormais
                          Ce qui fait qu'Excel beug quand j'applique un code.
                          As - tu un moyen qui permette d'effectuer la manip jusqu'à la dernière ligne remplie
                          Evidemment cette dernière cellule n'est pas fixe, elle dépend de l'export

                          http://www.cijoint.fr/cjlink.php?file=cj201106/cij5nvw5PI.xls

                          Merci
                          0
                          1. Contributeur
                            bonjour

                            essaies cette bidouille
                            Sub convertir()
                            T_chifre = Application.Transpose(Range("B2:B" & Range("B65500").End(xlUp).Row).Value)
                            For cptr = 1 To UBound(T_chifre)
                                 If T_chifre(cptr) <> "" Then T_chifre(cptr) = CLng(T_chifre(cptr))
                            Next
                            Range("B2:B" & Range("B65500").End(xlUp).Row) = Application.Transpose(T_chifre)
                            End Sub
                            
                            0
                          2. Merci encore pour ton aide,
                            Mais il m'indique un Erreur '13' au niveau Then T_chifre(cptr) = CLng(T_chifre(cptr))
                            Sais-tu c'est du a quoi ?
                            Merci
                            0
                          3. Contributeur
                            L'incompatibilité de type 13 se produit lorsque le '123456 comporte une lettre ou un point ou un tiret Ou... etc
                            bref de ce fait ne peut être transformé en nombre

                            Il y a donc ce cas dans la liste....
                            0
                          4. Comment tu sais tout ca ?
                            Ben j'ai pas été trés futé ce coup la, j'appliquais ton code sur la feuille déja convertie.. grace a ton explication, le probleme est résolu.
                            Je peux te demander ca fait combien de temps que tu es sur VBA, ou VB en général ?
                            Merci énormément
                            0
                          5. Nouveau sujet lancé... je ne sais pas comment tu fais pour le retrouver
                            en tout cas j'ai posté un fichier sur cijoint et le lien dans le nouveau sujet
                            Merci
                            0