EXCEL97

Résolu
Bonjour,

Je suis rouillée question code, mais si vous m'expliquez ça peut revenir. Voilà j'ai une imputbox, qui demande le nombre de ligne utilisé (nombre), et je souhaiterai donc faire un range de A, nombre : IU nombre.... le coller c'est autre chose.

Moi j'avais pensé à ça , mais ça ne marche pas :

Range("(Cells(nombre, a).Value) : (Cells(nombre,iu).value")).Select

Le code que j'ai pour le moment c'est ça :
Range("A12:IU41").Select
Selection.Copy

Sheets("Synthèse").Select
Range("A12:IU41").Select
ActiveSheet.Paste
Range("a1").Select

Sheets("LS").Select
Range("a1").Select
Application.CutCopyMode = False

LOULOU
Configuration: Windows XP
Internet Explorer 6.0

27 réponses

Résumé de la discussion

Problème rencontré : construire en VBA une plage dynamique allant de la colonne A jusqu'à IU pour une ligne déterminée par une valeur saisie via une InputBox, afin d'effectuer ensuite copier-coller ou traitement. Plusieurs réponses préconisent d'assembler dynamiquement l'adresse de la plage avec la concaténation des numéros de ligne, par exemple Range("A" & i_ls & ":IU" & i_ls).Select, puis d'ajouter une seconde variable i_lsa si nécessaire. En pratique, des essais ont montré des erreurs de compilation liées à des séparateurs ou guillemets manquants, et l'approche Range("A" & i_ls & ":IU" & i_lsa).Select est privilégiée pour délimiter les bornes.

Bobot (l’IA à votre service)
  1. Salut loulou je n'ai pas eu le temps de m'occuper de ton problème.

    Qui plus est, Eriic s'occupait de toi.

    A priori, tu n'est pas en RSO. Donc tu dois le simuler. A savoir: considérant les services TOTO, TITI, TATA qui doivent chacun inscrire leur planning dans le tableau "Synthèse"

    Essaye de créer une feuille cachée avec une ligne qui récupère la dernière ligne inscrite.

    Tu ajoutes un espace. La prochaine fois, le bouton ajouter le tableau se remettra en place. C'est difficile d'être vraiment clair, mais l'idée est là.

    J'attend un fichier d'avancement, afin que nous ne nous "marchions pas dessus".

    Rassure toi ceux qui aident font aussi cela e nplus de leur boulot.
    1
    1. A la place de

      Sheets("Synthèse").Select
      Range("A12:IU41").Select
      ActiveSheet.Paste
      Range("a1").Select


      Essayes

      Worksheets("Synthèse").Paste Destination:=Worksheets("Synthèse").Range("A1") 'Pour coller à partir de A1
      0
      1. Bonjour,

        Merci pour ton aide Dandypunk mais ce n'est pas ce que je veux. Ton code m'a aidé, et appris des choses.

        En faite si tu veux, j'ai un tableau sur feuille 2, il tient sur les lignes A12 : Iu41. Et je voudrai changer ça, car si un jour il devait tenir sur 42 ?

        Je voudrai le rendre variable. Ma solution du nombre est plus compliquée que je ne le pensais.

        Aurais tu un moyen pour sélectionner les lignes utilisés sachant que comme c'est un planning, il y a des colonnes qui n'ont rien d'écrit mais une case coloré...et surtout je voudrai qu'il arrête la sélection des lignes quand il y a 2 lig d'affilé vide.

        Aidez moi svp !!!

        Loulou
        0
        1. Slt,

          CurrentRegion ne prend pas en compte les cellules coloriés.
          0
          1. Sub hide()
            'A1:c50 correspond a ta plage de cellule que tu souhaite verifier

            Range("A1:c50").Select

            For Each o In Selection
            If o.Value = "" Then
            o.EntireRow.Hidden = True
            End If
            Next

            End Sub

            Je voudrai essayer autre chose, cacher les lignes vides en cliquant sur un bouton. Mais je souhaiterai qu'il ne cache que lorsqu'il y a 2 linges vides l'une au dessus de l'autre.

            J'avais pensé rajouté au if : (O.value +1)="" then

            Quand pensez vous ?? Car ça ne marche pas ?
            loulou
            0
            1. https://www.cjoint.com/?cfntNC6AS3

              Dandypunk merci de ton attention

              Pour mieux se comprendre, je t'ai mis sur cjoint un fichier rar car même en supprimant des onglets mon fichier est gros !!

              Tu as le tableau 1 : synthèse
              Tu as le tableau 2 : LS // service du pdg

              Une colonne client, projet, travaux (description), R pour responsable, i pour intervenant et aprés le calendrier, mois et jour, et dans les cases on y met une couleur.

              En fait , les couleurs correspondent :

              Rouge : absence
              bleu : travail confirmé au bureau
              vert : rendez-vous confirmé en clientèle
              jaune : tâche prévisionnelle (bureau ou clientèle)

              Ensuite, on met "M" ou "A" dans la case si ne concerne que la 1/2 journée. (Certains colorient en hachuré pour le rendre plus visible)

              Et donc pour différencier les projets et client en cours pour un service, ils espacent d'une ligne et donc dans ma sélection ça me gêne pour délimiter le tableau.

              voilà j'espère qu'on se comprendra mieux

              loulou
              0
              1. Désollé d'avoir été si long à répondre, mais ces deux jous ont été très chargés pour moi. (Je ne vais pas me plaindre d'avoir des clients.)

                1) Je crois avoir compris ce que tu désirais.
                2) J'ai légèrement modifié ton code de Sub hide

                Je te joint déjà le fichier modifié (.zip) https://www.cjoint.com/?cguA7YLQP2

                Le code modifié se trouve dans le module 10 et dans ThisWorbook

                1) J'ai pris une base de 41 comme demandé au départ, mais avec ton tableau qui va jusque 43, il suffira de modifier cette valeur
                2) Le variables et constantes de type PUBLIC ne 'appliquent qu'au module en cours. L'idéal est donc de copier toutes tes macros dans un seul module, sinon, l'initialisation ne sera pas prise en compte.
                3) Afin d'éviter, de cacher des lignes (procédure hide()), je vais essayer de m'inspirer de cela pour la sélection, dans le style iDerniereLIgnevalide; Je n'ai pas encore eu le temps de me pencher sur le problème.
                4) Je serai absent de la toile jusque mardi, voire mercredi et je ne sais pas si demain j'aurai le temps.

                En espérant que cela t'aura aidé, je reste à ta disposition.
                0
                1. Contributeur
                  Bonsoir tout le monde,

                  je n'ai pas pris le temps de regarder les classeurs mais pour répondre à ta 1ère question tu peux te fabriquer ton range ainsi :
                  i=42
                  range("A12:IU" & i).cequetuveux

                  il suffit de concatener
                  eric
                  0
                  1. Exact, j'avais oublié le &. Cela simplifie un peut le code.
                    Merci pour lui.
                    0
                2. Pour elle !!

                  Oui en effet ça m'aide merci

                  Je vais voir ça aujourd'hui.

                  Je souhaite en effet que le nombre de ligne soit variables mais le mieux c'est que l'utilisateur sache combien il en a utilisé. Et je pense mettre un compteur, en bas de la première colonne, un count. et je prendrai ce chiffre comme repère pour tout !!

                  Je pense ça va marcher !! merci de vos aides, je pense pas avoir été clair, mais je mettrai le tableau une fois fini !!
                  0
                  1. Désolé pour le pour lui il est vrai que tu avais écrit rouillée
                    0
                    1. Ce n'est pas grave !!

                      De ton code, je voudrai arriver à faire, que le compteur qui est notre information sur la sélection du nombre de ligne soit conservé et utilisé dans les autres codes pour tout le temps savoir le nombre de lignes.

                      Je ne sais plus comment, je faisais avant pour avoir cette donnée d'accessible à tout. Là où la procédure est appelé, on aura le icompteurligne ? Qu’en penses tu ?

                      Sub Selection_ls()
                      '
                      ' Macro enregistrée le 07/02/2008 par
                      '
                      Dim bLignePrecedenteVide As Boolean
                      Dim iCompteurLigne As Integer
                      Dim sCelluleAVerifier As String

                      bLignePrecedenteVide = False

                      For iCompteurLigne = 15 To iLigneMax 'Les infos intéressantes commencent ligne 15

                      sCelluleAVerifier = ("A&iCompteurLigne")
                      Range(sCelluleAVerifier).Select

                      If (Selection.Value = "") And (bLignePrecedenteVide = False)
                      Then ‘ la cellule est vide et la ligne précédente non
                      bLignePrecedenteVide = True ' on passe que la ligne est vide pour le reste du code
                      ' on continue d'incrémenter le compteur, car une seule ligne vide doit être comptée !
                      Else ‘ la cellule n’est pas vide et 'bLignePrecedenteVide est à vrai
                      If (Selection.Value = "") ‘ si la ligne est vide
                      Then 'bLignePrecedenteVide est donc vrai et fin sélection
                      IcompteurLigne = IcompteurLigne – 1 ‘ On enlève 1 au compteur pour enlever la deuxième ligne vide.
                      Else
                      bLignePrecedenteVide = False
                      End If

                      End If

                      Next
                      '
                      End Sub
                      0
                      1. J'exécute ce code pas à pas, et tout ce fait ok, le compteur s'arrête bien à 23, ce qui correspond bien à mon test mais en revanche le logiciel bug, comme si j'étais en boucle infernal. Peux tu m'aider ?

                        Sub Selection_ls()
                        '
                        ' Macro enregistrée le 07/02/2008 par
                        '
                        Dim bLignePrecedenteVide As Boolean
                        Dim iCompteurLigne As Integer
                        Dim sCelluleAVerifier As String

                        bLignePrecedenteVide = False
                        iLigne_max_ls = 50

                        For iCompteurLigne = 15 To iLigne_max_ls 'Les infos intéressantes commencent ligne 15

                        sCelluleAVerifier = "A" + CStr(iCompteurLigne)
                        Range(sCelluleAVerifier).Select

                        If (Selection.Value = "") And (bLignePrecedenteVide = False) Then ' la cellule est vide et la ligne précédente non
                        bLignePrecedenteVide = True ' on passe que la ligne est vide pour le reste du code
                        ' on continue d'incrémenter le compteur, car une seule ligne vide doit être comptée !
                        Else ' la cellule n'est pas vide et 'bLignePrecedenteVide est à vrai
                        If (Selection.Value = "") Then 'bLignePrecedenteVide est donc vrai et fin sélection
                        iCompteurLigne = iCompteurLigne - 1 ' On enlève 1 au compteur pour enlever la deuxième ligne vide.
                        Else
                        bLignePrecedenteVide = False
                        End If
                        End If

                        Next
                        '
                        End Sub
                        0
                        1. j'ai oublié je mets :

                          return iCompteurLigne

                          aprés icompteurligne = icompteurligne - 1

                          sinon je ne sortait pas effectivement

                          mais je ne sais plus voir même on peut dire pas, renvoyer une valeur !! j'ai honte !!

                          merci de votre aide
                          0
                          1. oublier ces deux derniers post !!

                            Grâce à ton aide dandypunk, je m'y suis remise.

                            reste comment on écrit ça :

                            Range("A"&i_ls:"iu"&i_ls).Select ça ne marche pas trop

                            loulou
                            0
                            1. Contributeur
                              Bonsoir,

                              le : doit ête dans les ""
                              Range("A" & i_ls ":iu" & i_ls).Select

                              mais je te rappelle qu'au début tu voulais sélectionner A12:IUxx
                              Avec ta formule tu ne sélectionneras que la ligne i_ls

                              eric
                              0
                              1. Bonjour,

                                Oui au début j'avais besoin de ça. Mais maintenant pour les autres tableaux, qui se mettent aprés le premier, je ne peux plus savoir où cela se termine et où commencer le tableau .

                                merci mais ça ne fonctionne pas

                                Range("A & i_ls :IU & i_ls").Select
                                0
                                1. Contributeur
                                  Bonsoir,

                                  Range("A" & i_ls & ":IU" & i_ls").Select

                                  Mais vu que tu n'as qu'une variable i_ls tu ne selectionneras qu'une ligne

                                  eric
                                  0
                                  1. bonjour

                                    oui désolée, en fait j'ai été trop vite

                                    Range("A" & i_ls & ":IU" & i_lsa").Select

                                    il y a une deuxième variable !!

                                    merci je vais tester !!!

                                    loulou
                                    0
                                    1. rebonjour,

                                      cela ne fonctionne pas, il me met message d'erreur: Erreur de compilation, attendu : séparateur de liste ou)

                                      Range("A" & i_ls & ":IU" & i_lsa").select

                                      si tu as une autre idée

                                      merci de ton aide

                                      loulou
                                      0
                                      • 1
                                      • 2