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. 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. Contributeur
                                      Re,

                                      Effectivement j'avais laissé encore une erreur, la " du bout à enlever.
                                      Range("A" & i_ls & ":IU" & i_lsa).select
                                      eric
                                      0
                                      • 1
                                      • 2