VBA et cellules nommees
Bonjour
J'ai un fichier excel me permettant deux choses a partir des donnees que je rentre sur la feuille "CALCULATION" puis en appuyant sur le bouton :
- envoyer un mail (pas de soucis avec ca, j'ai deja la macro que je ne met pas ici pour simplifier)
- ajouter mes donnees a un tableau qui regroupe toutes les donnees passees.
Pour le moment le code marche a merveille, mais comme rien n'est parfait, j'ai besoin d'une amelioration. En effet, je suis ammene a rajouter/deplacer/supprimer des champs et donc en consequent deplacer/ajouter des colonnes dans la feuille "Datas".
Pour eviter de longues modifications de code au risque de glisser de petites erreurs, j'ai nomme mes colonnes et mes cellules a remplir. J'ai donc modifie cel_src et cel_dst par les noms correspondants.
Cependant, VBA n'accepte apparemment pas le Range(cel_src(i)). Auriez-vous une solution ?
Je joint un fichier excel avec le code originel a ce post.
Merci d'avance
Petite correction de ce que j'ai rentre (j'ai juste mal recopie)
'ce que j'ai rentre et qui ne marche pas :
'cel_src = Split("date customer collection_post_code delivery_post_code price promotion")
'cel_dst = Split("date_data cust_data from_data to_data price_data promo_data")
au lieu de nommer tes colonnes tu devrais utiliser la notion de tableau nommés
je te joins quelques fichiers expliquant la notion
et on on utilise range avec le nom du tableau suivi de l'entête de colonne
tu fais dans l'ordre 400, 500, 600, 650
Bonjour
On peux aussi utiliser le code spécifique aux ListObjects : faudra faire le 700 !
Dans certains cas cela apporte vraiment dans d'autres moins...
- Messages
- 4'064
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Rectifier l'instruction comme suit :
.Range(cel_dst(i)).Rows(.Rows.Count).End(xlUp)(2) = wsCal.Range(cel_src(i))
Remarque:
cel_src et cel_dst sont définis en Variant et non en tableau
Dim cel_src() As String, cel_dst() As String, wsCal As Worksheet, i%
Tu peux faire encore plus simple en donnant des noms de plage (de type feuille) identiques aux 2 feuilles. Ci-joint exemple avec la macro "Définitions" pour créer les noms.
bonjour à tous
question (bête ? ) : puisque la macro fonctionne sur l'onglet 1, alors on pourrait simplement mettre les données en onglet 2, et en onglet 1 mettre un MIR miroir des colonnes voulues (il suffit de mettre des = )
Bonsoir,
Je ne vois pas très bien où tu veux en venir, et pour cause puisque ce n'est pas très défini !
Je ne pense pas que la voie choisie : multiplier les noms soit bénéfique à terme et apporte un élément de gestion dynamique...
En effet, je suis ammene a rajouter/deplacer/supprimer des champs et donc en consequent deplacer/ajouter des colonnes dans la feuille "Datas".
Rien n'étant fait dans ce sens, on ne peut rien voir, mais on peut prévoir que les ajouts, ne figurant pas dans le code, ne seront pas pris en compte...
D'autre part je ne vois pas ce qui pourrait empêcher de s'appuyer sur un noyau structurel stable, même si des éléments seront mouvants. Une structure de base stable ne relève de de la seule décision qu'elle ne bougera pas ! La gestion des éléments mouvants est à voir selon qu'elle peut se rattacher aux éléments stables (s'en déduire) ou à l'inverse exige une opération préalable de repérage à chaque intervention.
Mais en tout état de cause, les éléments absents, sont intégrables s'ils sont prévisibles (donc prévus à l'avance), mais pas s'ils ne le sont pas ! et il n'y a pas lieu alors de s'en préoccuper.
Cordialement.
Bonjour a tous
Merci de vos diverses reponses et desole pour ce petit silence radio. J'ai plusieurs petites questions :
@gullaud : Oui j,ai pense a utiliser des tableaux mais tu ne dis pas comment rajouter des lignes avec VBA. De plus quand je met juste un tableau, il met une donnee par ligne ce qui ne convient pas du tout.
@jmd : etant novice en VBA, je ne sais pas du tout ce que fais ni utiliser la fonction MIR.
@thev :
cel_src et cel_dst sont définis en Variant et non en tableau
Ca marche encore moins en les definissant en tableau puisque ca bloque au niveau du UBOUND.
@MFerrand : effectivement, si je rajoute un champ il sera ajoute manuellemengt au code. Mais le but est donc de ne rajouter que le nom de la cellule et celui de la nouvelle colonne sans tout changer.au code (par exemple si ma nouvelle colonne vient s'intercaler entre deux autres).
Pourquoi tout simplement je ne peux pas appeler une cellule nommee dont le nom est contenu dans un tableau ? Dois-je proceder etapes par etapes ?... Le but est de ne pas avoir quelque chose de trop complique dans mon code pour le modifier rapidement.
Bonjour,
Que te dire ?
Mais le but est donc de ne rajouter que le nom de la cellule et celui de la nouvelle colonne sans tout changer.au code
Ma conception est plutôt de ne jamais rien avoir à changer au code en cas de modifications, donc que les modifications potentielles soient prévues dans le code...
Et si on change de façon imprévue, là on repart à zéro et on recode en conséquence !
Ton souci relatif à des modifications que tu n'aurais pas prévues et que tu voudrais parvenir à prendre tout de même en compte m'est totalement étranger. On touche au code ou on n'y touche pas ! Si on y touche, mieux vaut le faire vraiment, pas avec des rustines plus ou moins mal adaptées.
Cordialement.
ch69 a écrit :Bonjour a tous
@jmd : etant novice en VBA, je ne sais pas du tout ce que fais ni utiliser la fonction MIR.
ce n'est pas une fonction, c'est moi qui nomme les onglets miroirs "MIR"
un onglet miroir contient uniquement des liens vers un onglet plein de données (ce sont des signes = ). Rien de plus simple
pas de VBA
un onglet miroir contient uniquement des liens vers un onglet plein de données (ce sont des signes = ). Rien de plus simple
pas de VBA
Effectivement ce serait plus simple... Mais j'ai du mal a concevoir une formule faisant en sorte que le tableau se complete au fur et a mesure de l'appui sur un bouton.
Fin mot de l'histoire : je suis finalement revenu a un truc plus long mais plus simple (du meme type que mon code non simplifie sur ce sujet : https://forum.excel-pratique.com/excel/simplifiation-de-code-t96566.html
Pour ceux que ca interesse, voici mon code (si il y en a qui veulent s'amuser a le simplifier, je suis preneur
Sub Add_To_List()
Dim cel_src, cel_dst As Range
Dim DernLigne As Long
DernLigne = Worksheets("Datas").Range("A" & Rows.Count).End(xlUp).Row
Set cel_src = Range("date")
With Worksheets("Datas")
Set cel_dst = .Cells(DernLigne, Range("date_data").Column)
End With
cel_dst.Value = cel_src.Value
Set cel_src = Range("customer")
With Worksheets("Datas")
Set cel_dst = .Cells(DernLigne, Range("cust_data").Column)
End With
cel_dst.Value = cel_src.Value
Set cel_src = Range("collection_post_code")
With Worksheets("Datas")
Set cel_dst = .Cells(DernLigne, Range("from_data").Column)
End With
cel_dst.Value = cel_src.Value
Set cel_src = Range("delivery_post_code")
With Worksheets("Datas")
Set cel_dst = .Cells(DernLigne, Range("to_data").Column)
End With
cel_dst.Value = cel_src.Value
Set cel_src = Range("price")
With Worksheets("Datas")
Set cel_dst = .Cells(DernLigne, Range("price_data").Column)
End With
cel_dst.Value = cel_src.Value
Set cel_src = Range("promotion")
With Worksheets("Datas")
Set cel_dst = .Cells(DernLigne, Range("promo_data").Column)
End With
cel_dst.Value = cel_src.Value
End Sub
- Messages
- 308
- Excel
- 2016
- Inscrit
- 15/06/2017
- Emploi
- Bénéficiaire de la sécurité de la vieillesse
Bonjour ch69, bonjour le fil, bonjour le forum,
Si tu y tiens ...
Sub Add_To_List()
Dim DernLigne As Long
With Worksheets("Datas")
DernLigne = .Range("A" & Rows.Count).End(xlUp).Row + 1
.Cells(DernLigne, Range("date_data").Column) = Range("date")
.Cells(DernLigne, Range("cust_data").Column) = Range("customer")
.Cells(DernLigne, Range("from_data").Column) = Range("collection_post_code")
.Cells(DernLigne, Range("to_data").Column) = Range("delivery_post_code")
.Cells(DernLigne, Range("price_data").Column) = Range("price")
.Cells(DernLigne, Range("promo_data").Column) = Range("promotion")
End With
End Sub
A+
Joseph