VBA Excel sélectionner la première colonne vide

Résolu
Jerome -  
 Jerome -
Bonjour,

Une nouvelle fois je viens faire appel à votre aide. J'ai créé grâce à l'enregistreur automatique une macro pour écrire sur la première colonne vide de la ligne 1
J'ai du coup sélectionné la colonne C1 et j'ai fait "ctrl + flèche droite" et encore une fois flèche à droite.

Range("C1").Select
Selection.End(xlToRight).Select
Range("R1").Select

Seulement voilà à la lecture de mon code il m'écrit sélection de la dernière cellule donc jusque là pas de problème, mais après il me sélectionne la cellule R1 qui est sûrement ma 1ère colonne vide, mais d'une semaine sur l'autre la sélection ne sera pas forcément la cellule R1 mais peut être S1 ou T1 ou U1 ou AA1 etc.

Sauriez vous comment réaliser ce code ?

Encore une fois merci pour votre aide,

Amicalement
Jérôme

Configuration: Windows / Chrome 103.0.0.0

29 réponses

  • 1
  • 2
Résumé de la discussion

Le problème consiste à déterminer dans Excel VBA la première colonne vide de la ligne 1 et à y écrire, alors que l’emplacement exact peut varier (R1, S1, etc.).
La solution fréquente consiste à calculer la colonne cible comme Range("C1").End(xlToRight).Column + 1, puis d’écrire ou de sélectionner Cells(1, y) pour la cellule correspondante à l'écran.
Des approches différentes proposent des variantes avec des références en Formule ou en R1C1, et expliquent qu'il faut éviter des enregistrements de macros qui ajoutent des instructions pas pertinentes.
En pratique, il suffit de calculer y comme Range("C1").End(xlToRight).Column + 1 et d’écrire dans Cells(1, y), sans resoumettre la dernière colonne à chaque étape.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonsoir Jérôme,

    y= Range("C1").End(xlToRight).Column 
    Cells(1,y).Select


    Cdlmnt
    Via
    1
    1. Jerome
       
      Bonjour Via,

      Encore une fois un grand merci pour votre aide. En essayant le code, je me rends compte que je me suis mal exprimé.
      Avec ce code, j'arrive sur la dernière colonne de C1 remplie.
      y= Range("C1").End(xlToRight).Column
      Cells(1,y).Select
      ActiveCell.FormulaR1C1 = "Présent base précédente"

      Sauf que la commande d'après est d'inscrire "présent base précédente", mais il me l'écrit sur la dernière colonne remplie et remplace le titre actuel par cette commande.

      y= Range("C1").End(xlToRight).Column
      Cells(1,y).Select
      ActiveCell.FormulaR1C1 = "Présent base précédente"

      Ce que je souhaiterais, c'est de l'écrire juste à côté sur la première colonne qui est vide. Je me suis dis que je pouvais la combiner avec la commande déplacer le curseur sur la droite ? mais peut être aurais tu une meilleure commande ?

      ActiveCell.Offset(0, 1).Select


      Encore merci pour votre aide,

      Amicalement
      0
  2. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonjour,

    Au plus simple il suffit de rajouter 1 dans la 1ere ligne de code ☺
    y= Range("C1").End(xlToRight).Column +1

    Cdlmnt
    Via
    1
    1. Jerome
       
      Re bonjour,

      Trop bien

      Un grand merci ????

      Amicalement
      0
    2. Jerome
       
      Bonjour Via,

      Navré de te solliciter une nouvelle fois, mais j'aurais deux questions pour la suite de ma macro.

      Quand je réalise le code ça fonctionne très bien mais par contre je dois systématiquement ajouter le code en entier :
      y= Range("C1").End(xlToRight).Column
      Cells(1,y).Select
      Car si je n'ajoute pas à chaque fois le y= Range("C1").End(xlToRight).Column avant le code Cells(1,y).Select ça réécrit à chaque fois sur la même colonne en remplaçant à chaque fois la dernière commande. Est ce normal ? C'est pour ma compréhension car ça ne me gêne absolument pas de d'écrire à chaque fois le code complet. Aussi le fait d'avoir rendu mon y en Dim as Byte ne sert à rien ?

      Mon autre question et sur la suite, en effet, je cherche la dernière cellule pour y ajouter une rechercheV sauf que dans ma macro réalisée avec l'enregistreur il précise la cellule alors que grâce au code ci-dessus c'est selon la dernière colonne remplie. Du coup dans la formule avec l'enregistreur j'avais ma formule qui partait de la cellule en dessous ce celle que je venais de créer et la formule enregistrait bien la colonne Q par exemple. Mais désormais si c'est une autre colonne que Q j'ai un message d'erreur 1004 La méthode AutoFill de la classe Range a échoué

      Voici le code de base

      Range("Q1").Select
      ActiveCell.FormulaR1C1 = "Présent liste actuelle"
      Range("Q2").Select
      ActiveCell.FormulaR1C1 = "Oui"
      Range("Q2").Select
      Selection.AutoFill Destination:=Range("Q2:Q11606"


      Mais désormais je suis susceptible de ne plus être dans la colonne Q mais R/S/T/AA etc. Alors du coup pas de problème pour l'envoyer jusqu'en bas (grâce à toi au passage), mais si le code
      y= Range("C1").End(xlToRight).Column
      Cells(1,y).Select
      Me renvoie en colonne AB par exemple, la cellule du dessous doit inscrire la formule IERREUR(RECHERCHEV et l'envoyer jusqu'à la dernière ligne remplie, mais du coup je ne connais pas la colonne puisque c'est une inconnue et qu'elle est liée à la commande d'avant et en l'occurrence j'aurais besoin que le code du dessous ne sélectionne plus Q mais AB. Est ce que c'est possible ?

      Je ne suis vraiment pas très clair, voici les deux exemples de codes

      Code que nous retravaillons et pour lequel la Destination:=Range("?" & derligne) est inconnue

      'Variable pour selectionner la dernière colonne vers la droite
      y = Range("n1").End(xlToRight).Column + 1
      Cells(1, y).Select
      ActiveCell.FormulaR1C1 = "Présent liste actuelle"
      ActiveCell.Offset(1, 0).Select
      ActiveCell.FormulaR1C1 = "Oui"
      'Variable derligne = Envoie la formule jusqu'à la dernière ligne remplie de la colonne D
      derligne = Range("D" & Rows.Count).End(xlUp).Row
      'Envoyer le Oui jusqu'à la dernière ligne
      Selection.AutoFill Destination:=Range("Q2:Q" & derligne)


      Code avec l'enregistreur

      Range("Q1").Select
      ActiveCell.FormulaR1C1 = "Présent liste actuelle"
      Range("Q2").Select
      ActiveCell.FormulaR1C1 = "Oui"
      Range("Q2").Select
      Selection.AutoFill Destination:=Range("Q2:Q11606")
      Range("Q2:Q11606").Select


      Merci pour ton aide,

      Bonne soirée

      Amicalement
      0
  3. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonsoir

    C'est vrai que ce n'est pas clair
    Pourquoi parle tu de rajouter le code à chaque fois ?
    S'il est en début de macro, à chaque fois que tu lances la macro la dernière colonne vide est déterminée par y= Range("C1").End(xlToRight).Column +1
    Ensuite tu sélectionnes cette cellule avec Cells(1,y).Select
    Tu peux écrire dedans : Cells(1,y) = "texte à écrire"
    Si tu veux dans la même macro écrire ensuite dans la cellule vide à droite de cette dernière pas la peine de faire rechercher à nouveau la dernière colonne vide il suffit de prendre la cellule Cells(1,y+1)

    Quand au 2eme point ta dernière ligende code doit être
    Selection.AutoFill Destination:=Range(Cells(1, y), Cells(derligne, y))

    Cdlmnt
    Via

    1
    1. Jerome
       

      Bonjour Via, 

      Oui je m'en suis rendu compte en relisant :-D, mais tu m'as compris. En espérant être plus clair, c'est pour ma compréhension car au delà d'y arriver grâce à toi je souhaite comprendre et m'améliorer :-)

      En fait, je pensais que la code y= Range("C1").End(xlToRight).Column +1 associé au Cells(1,y).Select  m'amènerait à chaque fois sur la nouvelle colonne vide et la sélectionnerait, et ce, peu importe le nombre de fois que je répétais le code dans la macro sauf qu'en faisant le test, il sélectionnait toujours la même cellule et remodifier le nom au lieu de le mettre sur celle d'à coté.

      Exemple,

          y = Range("C1").End(xlToRight).Column + 1
          Cells(1, y).Select       

      'Dans cet exemple, imaginons que ça nous sélectionne la colonne E1 qui est la première vide
          Cells(1, y) = "texte à écrire"
          Cells(1, y).Select       

      'Cette fois ci, s'agissant de la suite il aurait dû sectionner la F1 qui est désormais la première vide saut qu'il me sélectionne E1 et remplace le "texte à écrire" par "texte à écrire 2" avec la commande suivante     
          Cells(1, y) = "texte à écrire 2"

          Cells(1, y).Select       

      'Cette fois ci, s'agissant de la suite il aurait dû sectionner la G1 qui est désormais la première vide saut qu'il me sélectionne E1 et remplace le "texte à écrire 2" par "texte à écrire 3" avec la commande suivante     
          Cells(1, y) = "texte à écrire 3"

      Mais du coup ce n'est pas bon, mais en réalisant ce même code, mais en y ajoutant le code  y= Range("C1").End(xlToRight).Column +1 à chaque fois devant il sélectionnait la bonne cellule

      Exemple

          y = Range("C1").End(xlToRight).Column + 1

          Cells(1, y).Select              

      'Dans cet exemple, imaginons que ça nous sélectionne la colonne E1 qui est la première vide
          Cells(1, y) = "texte à écrire"

          y = Range("C1").End(xlToRight).Column + 1
          Cells(1, y).Select             

      'Dans cet exemple, ça nous sélectionne F1
          Cells(1, y) = "texte à écrire 2"

          y = Range("C1").End(xlToRight).Column + 1 

          Cells(1, y).Select             

      'Dans cet exemple, ça nous sélectionne G1
          Cells(1, y) = "texte à écrire 3"

      Et avec ton retour je peux tout simplement faire ce code qui fonctionne également

          y = Range("C1").End(xlToRight).Column + 1
          Cells(1, y).Select
          Cells(1, y) = "texte à écrire"
          Cells(1, y + 1).Select
          Cells(1, y + 1) = "texte à écrire 2"
          Cells(1, y + 2).Select
          Cells(1, y + 2) = "texte à écrire 3"

      Pour le deuxième point, un grand merci encore une fois :-)

      Par contre quand je l'ai réalisé, ça n'a pas fonctionné. J'ai eu un message d'erreur 1004 : La méthode AutoFill da la classe Range a échoué.

      Saurais tu ce que j'ai mal exécuté ?

      'Variable derligne = Envoie la formule jusqu'à la dernière ligne remplie de la colonne D
          derligne = Range("D" & Rows.Count).End(xlUp).Row
      'Envoyer le Oui jusqu'à la dernière ligne
          Selection.AutoFill Destination:=Range(Cells(1, y), Cells(derligne, y))

      Merci pour ton aide,

      Amicalement

      Jérôme

      0
  4. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Re

    Les références en RC se font par rapport à la cellule où est entrée la formule

    Tu dois te situer à priori dans la colonne R donc N est la 4éme colonne avant (-4) , M est la 5ème avant (-5) et T est la 2ème après (2)

    Mais tu peux utiliser les références habituelles aussi en VBA comme ceci

    ActiveCell.Formula = _
            "=IFERROR(VLOOKUP(Range("N2"),SHEETS("IEP S-1").RANGE("M:T")],4,0),""Non"")"

    Cdlmnt

    Via


    1
    1. Jerome
       

      Bonjour Via,

      Merci beaucoup pour ces précisions. Par contre quand j'utilise les ref suivantes la ligne s'affiche en rouge et je ne vois pas où est le problème ?

      ActiveCell.Formula = _
              "=IFERROR(VLOOKUP(Range("N2"),SHEETS("IEP S-1").RANGE("M:T")],4,0),""Non"")"

      Merci pour ton aide,

      Amicalement

      Jérôme

      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Le problème c'est que j'avais écrit n'importe quoi je me suis mélangé les pédales entre les instructions Sheets et Range à mettre dans une ligne de macro mais qui n’apparaissent pas dans la formule pour une cellule!!

    La bonne écriture est :ActiveCell.Formula = "=IFERROR(VLOOKUP(N2,'IEP S-1'!M:T,4,0),""non"")"

    Cdlmnt

    Via


    1
    1. Jerome
       

      Merciiiiiiiiiii c'est très gentil

      Amicalement

      Jérôme

      0
    2. Jerome
       

      Bonjour Via,

      Je me permets une nouvelle fois de faire appel à ton. J'ai réalisé un TCD dont ma source et mon onglet IEP. Comme tu me l'avais appris pour avoir la dernière ligne j'avais créé un DIM LIEP que j'avais ajouté dans la plage de mon TCD ("IEP!$A$1:$S$" & LIEP, Version:=6).CreatePivotTable TableDestination:= _) sauf que désormais il me faudrait également la même commande en allant vers la droite.

      Voici la commande de l'enregistreur

      Range("A1").Select
      ' inutile il me semble    Application.CutCopyMode = False
          ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
              "IEP!R1C2:R11500C21", Version:=6).CreatePivotTable TableDestination:= _
              "TCD!R1C1", TableName:="Tableau croisé dynamique1", DefaultVersion:=6

      '

      J'ai fait des tentatives qui ont échoué. La variable ne semble pas bloquer, mais est elle correcte ? et surtout ça bloque quand j'ai écrit 

      "IEP!$B:CIEP" & LIEP, Version:=6).CreatePivotTable TableDestination

      '

      'Variable dernière ligne remplie de l'onglet IEP de la colonne B
          DLIEP = Sheets("IEP").Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row

      'variable dernière colonne remplie
          CIEP = Sheets("IEP").Columns(2).Find("*", , , , xlByColumns, xlPrevious).Column

      Range("A1").Select   

      ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _

              "IEP!$B:CIEP" & LIEP, Version:=6).CreatePivotTable TableDestination:= _
              "TCD!R1C1", TableName:="Tableau croisé dynamique1", DefaultVersion:=6

      Merci pour ton aide

      Très bonne soirée,

      Jérôme

      0
  7. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Bonsoir Jérôme

    1) Écris ton code ainsi :

        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
            "IEP!R1C2:R" & DLIEP  & "C" & CIEP, Version:=6).CreatePivotTable TableDestination:= _
            "TCD!R1C1", TableName:="Tableau croisé dynamique1", DefaultVersion:=6

    2) Pour la dernière colonne le code est :

        CIEP = Sheets("IEP").Rows(2).Find("*", , , , xlByColumns, xlPrevious).Column

    Cdmnt

    Via


    1
    1. Jerome
       

      Bonjour Via,

      '

      Super, un grand merciii. En le réalisant j'aurais quelques petites questions. En effet, un peu plus haut dans ma macro je supprime des doublons.

      '

      'Selectionner la colonne N (13eme colonnes) entre B et Q et supprimer les doublons
          Columns("N:N").Select
      'Variable dernière ligne remplie de l'onglet IEP de la colonne B
          DLIEP = Sheets("IEP").Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row
      'Supprimer les doublons jusqu'à la dernière ligne
          ActiveSheet.Range("$B$1:$Q$" & DLIEP).RemoveDuplicates Columns:=13, Header:= _
              xlYes

      '

      Sauf que du coup quand il sélectionne ma plage pour mon TCD il prend la plage jusqu'à la dernière ligne supprimée et donc des lignes vides.

      Exemple : j'ai 11605 lignes au départ et après avoir supprimé les doublons j'en ai 11500. Pourtant dans la plage du TCD, il va chercher les données jusqu'à la ligne 11605 (IEP!$B$1:$U$11605). Saurais tu pourquoi et comment faire en sorte qu'il ne prenne que jusqu'à la 11500 ?

      '

      J'aurais également trois questions de compréhension sur la commande "IEP!R1C2:R" & DLIEP & "C" & CIEP

      R1C2 = quoi ?

      R = Pourquoi R à quoi correspond il ?

      C = Pourquoi "C" à quoi correspond il ?

      '

      Un grand merci pour ton aide

      Amicalement

      Jérôme

      0
      1. Jerome > Jerome
         

        Re bonjour Via,

        J'aurais une autre question, j'ai une page Excel sur laquelle je dois avoir 5 TCD. J e dois les placer à des endroits différents dans la page.

        Le 1er se situe en A1 jusqu'à sa fin

        Cells(1, 1).Select

        'TCD1

        'Variable dernière ligne remplie de l'onglet TCD du 1er TCD de la colonne A

            DLTCD = Sheets("TCD").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row

         Le second est en dessous de 9 lignes

        ' TCD2

            HTCD2 = Cells(DLTCD + 9, 1).Select

        'variable dernière colonne remplie de l'onglet TCD du TCD1

            CTCD = Sheets("TCD").Rows(1).Find("*", , , , xlByColumns, xlPrevious).Column

        Le troisième est à droite du premier (3 colonne de +) donc E

        ‘TCD3

        'Selectionner la troisième cellule vide vers la droite après le TCD1

            HTCD3 = Cells(1, CTCD + 3).Select

        Et le quatrième est censé être 5 ligne en dessous du TCD3 sauf que le code ci dessous ne fonctionne pas. Saurais tu pourquoi ?

        'Variable dernière ligne remplie de l'onglet TCD du TCD3 de la colonne E

            DLTCD3 = Sheets("TCD").Columns(5).Find("*", , , , xlByColumns, xlPrevious).Row

        'Selectionner la cinquième cellule vide en dessous du TCD 3

        ‘TCD4

            HTCD4 = Cells(DLTCD3 + 5, 1).Select

        Merci pour ton aide,

        Amicalement

        Jérôme

        0
  8. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Comme je te disais je ne peux rien dire de plus sans avoir sous la main ton fichier

    Poste ton fichier sur cjoint.com, fais créer un lien que tu copies et reviens coller ici


    1
    1. Jerome
       

      Re,

      Oui je comprends merci pour ton aide.

      Voici le lien : https://www.cjoint.com/c/LGoxgf86VeN

      Bonne soirée

      Amicalement

      Jérôme

      0
  9. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Bonjour Jérôme

    HTCD4 = Cells(DLTCD3 + 5, 1).Select  Sélectionne la 1ere colonne donc erreur car coller sur tableau déjà existant

    Ce serait plutôt HTCD4 = Cells(DLTCD3 + 5,5).Select

    Ensuite les lignes

        Selection.End(xlToRight).Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlToRight)).Select
        Application.CutCopyMode = False
        Selection.Copy
        Range("E1").Select
        Selection.End(xlDown).Select
        Selection.End(xlDown).Select
        Selection.End(xlDown).Select
        Range("E27").Select

    je ne vois pas à quoi elles correspondent et doivent être supprimées je pense

    D'autres erreurs surviennent après dans la macro qui je pense provient d'un enregistrement que tu as arrangé

    A ta place je supprimerai toute la fin de la macro après ce dernier TCD et après s'être assuré que tout fonctionne jusque là, je reprendrai tranquillement à partir de là (en enregistrant les manips nécessaire s'il y a lieu) et pas à pas pour finaliser une macro qui fonctionnera

    Bon courage

    Cdlmnt

    Via


    1
  10. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Re

    C'est bien la forme de la 1ere formule qui est la bonne mais c’est n'importe quoi car la variable ESG sert tantôt pour la ligne , tantôt pour la colonne

        Selection.AutoFill Destination:=Range(Cells(ESG, 5), Cells(derligneSuiviG, ESG))

    Rectifie ta formul ainsi

        Selection.AutoFill Destination:=Range(Cells(ESG, 5), Cells(derligneSuiviG, 5))

    Cdlmnt

    Via


    1
  11. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Bonjour

    Apparemment R29C9 renvoie à la ligne 29 de la colonne 9, je ne sais pas à quoi cela correspond sur ton fichier mais tu peux modifier les références avec des variables à la place de la ligne et de la colonne

    par ex avec  LTCD pour la 1ere ligne de ton TCD et CTCD pour sa colonne   :

    ActiveCell.FormulaR1C1 = "=GETPIVOTDATA(""IEP - Venue/Passage""," & "TCD!R" & LTCD & "C" & CTCD & " )"

    Cdlmnt

    Via


    1
  12. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    CTCD5 = Sheets("TCD").Rows(1).Find("*", , , , xlByColumns, xlPrevious).Column te donne la dernière colonne, toi il te faut la 1ere du TCD5 mais cette colonne est sans doute toujours la même donc tu peux sans doute inscrire le nombre en dur dans la macro

    par ex ActiveCell.FormulaR1C1 = "=GETPIVOTDATA(""IEP - Venue/Passage""," & "TCD!R" & HTCD5 & "C9" & " )" si c'est la colonne 9

    pourquoi ne puis-je pas utiliser HTCD5 à la fois en colonne et en ligne

    parce que la colonne n'est pas la même que la ligne !!  la variable HTCD5 doit donner 29 alors que la colonne c'est 9


    1
  13. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Bonjour

    Après l'instruction Cells(1, y + 2) = "texte à écrire 3" on est positionné en colonne y+2  donc   Selection.AutoFill Destination:=Range(Cells(1, y), Cells(derligne, y)) renvoie une erreur puisque tu indiques dans cette 2eme instruction y comme colonne de départ

    Soit tu veux effectivement remplir la colonne y et il faut d'abord revenir sur cette colonne avec un Select.Cells(1,y) soit tu veux remplir la colonne y +2 et il faut coder l'AutoFill en conséquence Selection.AutoFill Destination:=Range(Cells(1, y)+2, Cells(derligne, y+2))

    Cdlmnt

    Via


    0
    1. Jerome
       

      Bonjour Via,

      Merci +++ pour ton aide. Ok je crois que je comprends (désolé, il faut que je comprenne bien la mécanique VBA, que je n'ai pas encore acquis), mais en gros pour ma commande  Selection.AutoFill Destination:=Range(Cells(1, y), Cells(derligne, y)) il s'agit de la ligne en dessous de y dans ce cas

      Voici le code qui bloquait

      'Variable pour selectionner la dernière colonne vers la droite
          y = Range("n1").End(xlToRight).Column + 1
          Cells(1, y).Select
          ActiveCell.FormulaR1C1 = "Présent liste actuelle"
      'Selectionner la cellule en dessous de la commande ci dessus et y inscrire "Oui"
          ActiveCell.Offset(1, 0).Select
          ActiveCell.FormulaR1C1 = "Oui"
      'Variable derligne = Envoie la formule jusqu'à la dernière ligne remplie de la colonne D
          derligne = Range("D" & Rows.Count).End(xlUp).Row
      'Envoyer le Oui jusqu'à la dernière ligne
          Selection.AutoFill Destination:=Range(Cells(1, y), Cells(derligne, y))

      Et du coup voici le code que je dois composer ?

      'Variable pour selectionner la dernière colonne vers la droite
          y = Range("n1").End(xlToRight).Column + 1
          Cells(1, y).Select
          ActiveCell.FormulaR1C1 = "Présent liste actuelle"
      'Selectionner la cellule en dessous de la commande ci dessus et y inscrire "Oui"
          ActiveCell.Offset(1, 0).Select
          ActiveCell.FormulaR1C1 = "Oui"
      'Variable derligne = Envoie la formule jusqu'à la dernière ligne remplie de la colonne D
          derligne = Range("D" & Rows.Count).End(xlUp).Row
      'Envoyer le Oui jusqu'à la dernière ligne
          Selection.AutoFill Destination:=Range(Cells(2, y), Cells(derligne, y))

      C'est bien ça ? Après un essai ça a l'air de fonctionner

      J'en profite pour te poser une nouvelle question, lors de la réalisation de la formule ci dessous (Avec et Sans les $), je comprends facilement la logique de ma formule en bureautique car les colonnes sont identifiées, mais sur VBA, je ne comprends pas la logique pour déterminer les cellules "RC[-4]" qui correspond à N2 ou encore "C[-5]:C[2]" qui correspond à M:T. Par contre avec les $ je pense avoir compris M=13ème colonne et T la 20ème.

      Sans les $

      =SIERREUR(RECHERCHEV(N2;'IEP S-1'!M:T;4;0);"Non")

      ActiveCell.FormulaR1C1 = _
              "=IFERROR(VLOOKUP(RC[-4],'IEP S-1'!C[-5]:C[2],4,0),""Non"")"

      Avec les $

      =SIERREUR(RECHERCHEV(N2;'IEP S-1'!$M:$T;4;0);"Non")

       ActiveCell.FormulaR1C1 = _
              "=IFERROR(VLOOKUP(RC[-4],'IEP S-1'!C13:C20,4,0),""Non"")"

      Merci +++

      Amicalement

      Jérôme

      0
  14. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Re,

    1) Si tu utilises la même variable DLIEP pour le TCD, comme cette variable contient le n° de la dernière ligne avant suppression des doublons c'est normal que ça prenne toujours l'intégralité des lignes. Après la suppression des doublons et avant le TCD il faut recalculer la dernière ligne non vide avec

      DLIEP = Sheets("IEP").Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row

    2) R1C2 = ROW1 COLUMN2   soit ligne 1 colonne 2 soit encore B1

    3) Pour que ce qui est du placement de tes TCD tes instructions ont à priori l'air correcte, impossible de te dire ce qui ne va pas sans ton fichier complet avec sa macro

    Qu'est ce qui ne fonctionne pas,  ? le placement n'est pas bon ? le calcul de la dernière line non vide ne se fait pas ? ..

    Quelle valeur est indiquée pour DLTCD3 quand tu passes dessus avec la souris dans le code après arrêt ?

    Cdlmnt

    Via


    0
    1. Jerome
       

      Re,

      Merci +++, bon même si tu sais de quoi tu parles je confirme que pour le point 1 ça fonctionne bien :-) merci

      '

      Merci pour l'explication du point 2.

      '

      Pour le point 3

      TCD1 = A1:B30

      TCD2 = A39:B68

      TCD3= E1:F12

      TCD4= En erreur il sélectionne A17

      Qu'est ce qui ne fonctionne pas,  ? le placement n'est pas bon ? C'est ça au lieu de sélectionner E+5 lignes en dessous du TCD3 il sélectionne A17

      le calcul de la dernière line non vide ne se fait pas ? .. Visiblement non plus puisqu'il n'a pas l'air de se diriger sous le TCD3

      Merci pour ton aide,

      Amicalement

      Jérôme

      0
  15. Jerome
     

    Bonjour Via,

    Trop fort et merci pour ton aide. En faite au départ et via l'enregistreur je créais le TCD1 ensuite je copiais/collais le TCD1 pour faire mon TCD2 et j'ajoutais ce que je voulais. Pour le TCD3, idem je copiais/collais le TCD1 et faisais mon TCD3.

    Par contre pour le TCD4, je copiais le TCD3. Sauf que le TCD3 a deux filtres et du coup pour le sélectionner via l'enregistreur j'ai sélectionné la cellule E1 (Nom du filtre1) puis j'ai fait (Shit + ctrl + flèche du bas) une première fois et ça m'a sélectionné le deuxième filtre, j'ai refait (Shit + ctrl + flèche du bas) ce qui m'a emmené en haut de mon TCD3 et je l'ai fait une dernière fois ce qui m'a permis d'arriver en bas. Je l'ai ensuite fait sur la droite (Shit + ctrl + flèche droite) ce qui m'a permis de sélectionner tout le TCD3 et j'ai pu le copier.

    Voici le code avec l'enregistreur

    Range("E1").Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlToRight)).Select
        Application.CutCopyMode = False
        Selection.Copy
        Range("E1").Select
        Selection.End(xlDown).Select
        Selection.End(xlDown).Select
        Selection.End(xlDown).Select
        Range("E27").Select
        ActiveSheet.Paste

    Le problème c'est qu'en VBA, je n'ai pas réussi à sélectionner le TCD3 pour le copier.

    J'ai essayé les commandes suivantes, mais ça n'a pas fonctionné. Saurais tu comment je peux copier mon TCD3 qui a deux filtres ?

    Range("HTCD3").currentregion.Select ==> qui me sélectionne que les deux filtres

    et

    HTCD3 = Cells(1, CTCD + 3).End(xlUp).End(xlToRight).Select qui est erroné

    Encore merci pour ton aide,

    Amicalement

    Jérôme

    0
  16. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Là je ne sais !!

    Mais quand on peut pas prendre le droit on prend le gauche

    A ta place je continuerais dans  ma macro à copier le TCD1 et je le collerais en bonne place avec l 'instruction maintenant rectifiée

    Ensuite en revenant sur le tableau et en enregistrant je ferais toutes les manips nécessaires pour l'adapter selon ce que je veux comme filtre et autre et j'intégrerai ensuite l'enregistrement dans ma macro


    0
  17. Jerome
     

    Aucun souci et franchement un grand merci pour toute ton aide et la rapidité de tes réponses.

    Je vais effectivement toujours repartir de mon TCD1 :-)

    Encore merci

    Amicalement

    Jérôme

    0
  18. Jerome
     

    Bonjour Via,

    Désolé de te solliciter une nouvelle fois, mais j'ai de nouveau besoin de ton aide. Dans mon onglet suivi global, je dois tirer une formule (colonne E) de la dernière cellule remplie à celle d'en dessous. Je voulais trouver la première ligne vide (ou devra être ma "nouvelle" formule)

    '''Variable pour sélectionner la première ligne vide (onglet Suivi global) colonne E

           ESG = Range("E3").End(xlDown).Row +1

    Puis je voulais l'envoyer jusqu'à la dernière cellule remplie de la colonne D (qui en a justement qu'une de plus remplie)

    '''Variable derligneSuiviG = Envoie la formule jusqu'à la dernière ligne remplie de la colonne D

        derligneSuiviG = Range("D" & Rows.Count).End(xlUp).Row

    J'ai ensuite sélectionné la cellule souhaité 

    Cells(ESG, 5).Select

    Et j'ai essayé d'envoyer ma cellule par les propositions ci dessous mais ça n'a pas fonctionné.

        Selection.AutoFill Destination:=Range(Cells(ESG, 5), Cells(derligneSuiviG, ESG))

        Selection.AutoFill Destination:=Range(Cells(derligneSuiviG, 5))

        Selection.AutoFill Destination:=Range(Cells(derligneSuiviG, ESG))

    J'ai également essayé ceci

        ESG = Range("E3").End(xlDown).Row
        Cells(ESG + 1, 5).Select
        Selection.AutoFill Destination:=Range(Cells(ESG, derligneSuiviG))

    Et pareil ça n'a pas fonctionné. Saurais tu ce que j'ai mal exécuté ?

    Merci pour ton aide,

    Amicalement

    Jérôme

    0
  19. Jerome
     

    Bonjour Via,

    Merci beaucoup, j'ai cherché, cherché, pour ne pas te déranger, mais je n'ai finalement pas eu le choix. Ca marche parfaitement. J'ai un peu compris le principe, mais j'ai encore du mal et je finis toujours par bloquer sur un élément.

    Je profite pour te poser une autre question si tu le veux bien ? J'ai une commande qui va chercher les résultats des TCD1/TCD3/TCD5 et les reporte dans mon tableau onglet suivi global.

    L'enregistreur m'a écrit cette commande : ActiveCell.FormulaR1C1 = "=GETPIVOTDATA(""IEP - Venue/Passage"",TCD!R29C9)"

    Ca fonctionne très bien! Ma seule crainte, c'est que les TCD sont mouvants selon les résultats et peuvent être +/- long et s'il devait être plus long que ce qui est calculé et devait commencer qu'à la ligne par exemple 35 il me renverrait une erreur. Penses tu qu'il soit possible de remplacer le TDC!R29C9 par mon HTCD5 qui correspond à la première cellule du TCD5 ?

    Merci pour ton aide,

    Amicalement

    Jérôme

    0
  20. Jerome
     

    Re,

    Oui c'est bien ça, ligne 29 de la colonne 9 qui correspond à mon TCD5. 

    Du coup, la seule variable que j'ai du TCD5 est celle ci

    'Variable Haut TCD5 - Selectionner la deuxième cellule vide à droite du TCD 4
        HTCD5 = Cells(DLTCD3 + 9, 9).Select

    J'ai essayé de mettre cette variable pour les colonnes (Exactement celle du TCD1), mais je ne comprends pas quel élément je dois modifier pour l'adapter au TCD5

    '''variable dernière colonne remplie de l'onglet TCD du TCD5
        CTCD5 = Sheets("TCD").Rows(1).Find("*", , , , xlByColumns, xlPrevious).Column

    et terminer avec cette commande qui n'a pas fonctionné : 

    ActiveCell.FormulaR1C1 = "=GETPIVOTDATA(""IEP - Venue/Passage""," & "TCD!R" & HTCD5 & "C" & CTCD5 & " )"

    Et une deuxième questions, j'ai besoin d'inscrire la date du jour + du texte à coté.

    J'ai fait la formule 

    ActiveCell.FormulaR1C1 = "=TODAY()& "" test"""

    Pour copier/coller en valeur sauf que la date se met en code 44759 même quand je met en format date. Saurais tu comment faire ?

    Merci pour ton aide,

    Amicalement

    Jérôme

    0
  21. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     

    Comme je comprends la cellule en ligne 29 et colonne 9 doit être la 1ere en haut à gauche du TCD

    HTCD5 n'est pas chez toi un numéro de ligne, c’est la sélection d'une cellule

    par contre CTCD5 renvoie bien un n° de colonne mais ce n'est pas la 1ere du TCD5

    IL faut que par formules tu détermines la 1ere ligne et la 1ere colonne de ton TCD5

    HTCD5 = ..... et CTCD5=.....

    Ensuite pour vérifier que les valeurs retournées sont les bonnes, pour test (tu enlèveras cette ligne après) tu mets MsgBox HTCD5 & " " & CTCD5

    Quand tu auras déterminé les bonnes valeurs la formule GETPIVOTDATA... devrait fonctionner


    Cdmnt

    Via


    0
  • 1
  • 2