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. Bonjour à tous!

    J'ai quasiment fini mon planning !! 2 problèmes persistes :

    1) Je crée un goupe pour cacher les lignes vides sur un tableau D, mais si ce tableau n'a pas de groupe, je veux dire lors de la première utilisation, cela plante. Car dans mon code, je faisais enlever tout les groupes avant d'en recréer un

    ' on enlève tout group qui aurait pu être crée
    Range("A12:A" & début_selection_dev).Select // ce sera toujours de 12 à 132 (132 étant égal à deux max)
    selection.Rows.Ungroup
    selection.EntireRow.Hidden = False
    Range("a1").Select

    'on cache les lignes vides

    'Rows("fin_ls_lsa :avant_debut_devdiv").Select // j'ai contourné le problème en faisant un range
    Range("A" & fin_ls_lsa & ":A" & début_selection_dev).Select
    selection.Rows.Group
    selection.EntireRow.Hidden = True
    Range("a1").Select

    Il faudrait en faite faire un s'il n'y a pas de groupe alors groupe, s'il y en a un, alors enlevé groupe...A vos idées si vous m'avez comprises...mais cette aprés midi je mets le fichier en ligne.

    2) Les protections :

    Le tableau A, reçoit toutes les données des autres tableaux, et il je le protège mais en code vba quand je veux le dévérouiller ça ne fonctionne pas. J'ai mis ça :

    Sheets("Feuil1").Unprotect , password:="louise"

    Il faut forcément que ce soit dévérouillée par code vba, car pour le tableau d et e, il y a des éléments aussi qui doivent être vérouillée...

    bref je suis perdue dans le vérouillage !!!

    merci de votre aide

    loulou
    0
    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. Bonjour à tous,

        Eriic je comprends ton énèrvement mais si je suis venue poster c'est que ça ne fonctionait pas.

        'Rows(fin_ls_lsa :avant_debut_devdiv).Select // j'ai mis ça en commentaire pour pouvoir avancer (erreur 13, type incompatible)

        Rows("40:131").Select
        Selection.Rows.Group
        Selection.EntireRow.Hidden = True // je fais un groupe pour cacher les lignes vides.
        Range("a1").Select

        En effet, dandypunk, je vais te remettre un fichier de l'état d'avancement de mon projet. Mais pour le tableau C, il y a le A et le B qui sont en premier, du coup je suis obligée de laisser la place pour les maximums de A et C et afin qu'on ne voit pas les lignes blanches de 40 à 131 pour l'exemple d'ici car ce sera une donnée variable, je fais un hidden. ça marche super.

        Une fois finie ça, c'est beaucoup de copier coller, et aprés mettre des protections et ce sera ok. En revanche je voulais savoir est ce normal la taille du fichier excel. Est ce parce qu'il y a beaucoup d'onglets, ou le code un peu trop lourd, car je sais qu'on pourrait le simplifier mais bon...

        Si vous voulez je fais ça en plus de mon boulot, pour les besoins de la boite, mais au plus ça va, au plus je manque de temps alors....

        merci à tous de votre aide, et eriic j'essayerai de ne pas poster inutilement, mais c'était pour m'éviter de chercher....

        loulou
        0
        1. Bonjour à tous,

          Eriic je comprends ton énèrvement mais si je suis venue poster c'est que ça ne fonctionait pas.

          'Rows(fin_ls_lsa :avant_debut_devdiv).Select // j'ai mis ça en commentaire pour pouvoir avancer (erreur 13, type incompatible)

          Rows("40:131").Select
          Selection.Rows.Group
          Selection.EntireRow.Hidden = True // je fais un groupe pour cacher les lignes vides.
          Range("a1").Select

          En effet, dandypunk, je vais te remettre un fichier de l'état d'avancement de mon projet. Mais pour le tableau C, il y a le A et le B qui sont en premier, du coup je suis obligée de laisser la place pour les maximums de A et C et afin qu'on ne voit pas les lignes blanches de 40 à 131 pour l'exemple d'ici car ce sera une donnée variable, je fais un hidden. ça marche super.

          Une fois finie ça, c'est beaucoup de copier coller, et aprés mettre des protections et ce sera ok. En revanche je voulais savoir est ce normal la taille du fichier excel. Est ce parce qu'il y a beaucoup d'onglets, ou le code un peu trop lourd, car je sais qu'on pourrait le simplifier mais bon...

          Si vous voulez je fais ça en plus de mon boulot, pour les besoins de la boite, mais au plus ça va, au plus je manque de temps alors....

          merci à tous de votre aide, et eriic j'essayerai de ne pas poster inutilement, mais c'était pour m'éviter de chercher....

          loulou
          0
          1. De retour sur la toile.
            ARTICLE 1 NE JAMAIS FAIRE CONFIANCE AUX UTILISATEURS. (Oui je hurle)
            J'ai vu les précédent post. Je prense à étudier le 3) de mon post 7 à savoir :sélectionner uniquement les lignes nécessaires avant le copier coller.

            Bonne nuit.
            0
            1. Contributeur
              Hé loulou !!!!
              Tu crois pas que tu exagères ?
              Même si ce n'est pas la même fonction qu'en 21 regarde comment sont placées les " " et sers toi un peu de ta tete...

              "toto" est une chaine fixe, et on ne met pas les variables entre guillemets !
              De quoi à besoin rows(...) entre les ( ) ?
              Si tu hésites sur la réponse fais F1 sur rows

              eric
              0
              1. Bonjour

                et merci à tout le monde, je ne suis pas toujours très clair mais vous m'avez beaucoup aidé à remettre le pied à l'estrier !!

                Rows("& fin_ls_lsa :" & avant_debut_devdiv).Select

                je sélectionne les lignes de i à y mais encore une fois la stynthaxe me pose problème !!

                help please

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

                            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. 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. 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. 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. 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. Désolé pour le pour lui il est vrai que tu avais écrit rouillée
                                      0
                                      1. 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. 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
                                        • 1
                                        • 2