VBA Excel sélectionner la première colonne vide

Résolu/Fermé
Jerome - 4 juil. 2022 à 22:51
 Jerome - 19 juil. 2022 à 12:15
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

via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
4 juil. 2022 à 22:58
Bonsoir Jérôme,

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


Cdlmnt
Via
1
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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
5 juil. 2022 à 22:17
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
Re bonjour,

Trop bien

Un grand merci ????

Amicalement
0
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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
6 juil. 2022 à 23:26
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

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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
10 juil. 2022 à 21:32

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

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

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

Posez votre question
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
11 juil. 2022 à 20:43

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

Merciiiiiiiiiii c'est très gentil

Amicalement

Jérôme

0

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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
12 juil. 2022 à 22:56

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

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
Jerome > Jerome
14 juil. 2022 à 16:50

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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
14 juil. 2022 à 21:27

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

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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
15 juil. 2022 à 15:01

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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
16 juil. 2022 à 16:59

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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
17 juil. 2022 à 14:22

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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
17 juil. 2022 à 16:55

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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
10 juil. 2022 à 18:02

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

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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
14 juil. 2022 à 18:26

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

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

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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
15 juil. 2022 à 17:31

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

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

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

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

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
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
17 juil. 2022 à 15:27

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