VBA Excel sélectionner la première colonne vide
Résolu/Fermé- Vba dernière colonne non vide
- Dernière version ccleaner gratuit français - Télécharger - Nettoyage
- Déplacer une colonne excel - Guide
- Formule somme excel colonne - Guide
- Trier colonne excel - Guide
- Colonne word - Guide
29 réponses
4 juil. 2022 à 22:58
y= Range("C1").End(xlToRight).Column Cells(1,y).Select
Cdlmnt
Via
5 juil. 2022 à 22:17
Au plus simple il suffit de rajouter 1 dans la 1ere ligne de code ☺
y= Range("C1").End(xlToRight).Column +1
Cdlmnt
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
6 juil. 2022 à 23:26
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
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question11 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
5 juil. 2022 à 21:17
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