Lier des colonnes au code VBA
Résolu
stitchbouck
Messages postés
137
Statut
Membre
-
stitchbouck Messages postés 137 Statut Membre -
stitchbouck Messages postés 137 Statut Membre -
Bonjour,
J'ai environ 80 colonnes qui envoient leurs contenus dans différentes feuilles, parfois tel quel, parfois via un calcul ou une condition, et j'aimerai que ces codes soient "liées" à leur colonne de manière à pouvoir bouger une colonne dans ma feuille SOdr (de la colonne 5 à colonne 10 par exemple, parce que j'insère une nouvelle colonne, et/ou j'en déplace d'autres qui lui passent devant... ) et que ce changement se répercute tout seul dans mon code vba.
A la manière d'une feuille : on peut la déplacer, ça ne perturbe pas le code.
Par exemple, sur la première ligne de transfert "SC.Cells(n + 7, 2).Value = SOdR.Cells(n, 6).Value", si ma colonne "6" est déplacée dans ma feuille Sodr en colonne 8, il faudrait que ce code le prenne en compte de lui-même, ou au moins d'une façon automatisée quelconque... (un autre code vba ?). peut être en utilisant l'entête de colonne, ou un nom de colonne ?
Je ne sais pas du tout comment prendre le problème... jusqu'à présent je le fais manuellement : ma colonne 6 doit passer en première colonne, je la déplace sur ma feuille Sodr, puis je vais dans le code et remplace partout où c'est nécessaire ma colonne "6" par la colonne "1"... ainsi que toutes ces copines qui sont alors elles aussi déplacées ! La colonne 1 devient la colonne 2, la 2 devient la 3 etc. C'est long en plus d'être source d'erreurs.
Seule la feuille 'ordre de relevé" (SOdr) peut avoir des colonnes "mobiles" si j'ose dire.
Pour info, la page "SOdr" correspond à l'ordre dans lequel on effectue un relevé sur le terrain, et dont on note les résultats dans cette feuille. C'est un peu comme une carte géographique. Mon produit 5 est le premier à être relevé quand on fait le tour des compteurs ? alors je le mets en colonne 1. Il a été déplacé et c'est le 18ème relevé à présent ? je vais le mettre en colonne 18. De cette manière, un débutant ^peut faire des relevés avec bien moins de risque d'erreur, mais faire ce genre de mise à jour est vraiment très long.
Vous pourrez voir dans le fichier joint en bas que les numéros de colonnes ne se suivent pas toujours, car il y a la colonne "semaine" qui s'interpose toutes les "x" colonnes ("x" étant une valeur variable puisque les colonnes n'ont pas toutes la même largeur) afin d'avoir à chaque début de page imprimée le numéro de semaine en cours. Ce qui me complique la tâche aussi, mais ce n'est pas la plus laborieuse.
Un lien vers le fichier :
https://www.cjoint.com/c/IDbjdd1167D
Merci d'avance pour votre précieuse aide, et en espérant être suffisamment clair !! et si une solution existe, bien sûr...
PS : les codes VBA présents sont un gros meltingpot de vos aides diverses et ô combien utiles (et nombreuses) et de mes adaptations propres.
J'ai environ 80 colonnes qui envoient leurs contenus dans différentes feuilles, parfois tel quel, parfois via un calcul ou une condition, et j'aimerai que ces codes soient "liées" à leur colonne de manière à pouvoir bouger une colonne dans ma feuille SOdr (de la colonne 5 à colonne 10 par exemple, parce que j'insère une nouvelle colonne, et/ou j'en déplace d'autres qui lui passent devant... ) et que ce changement se répercute tout seul dans mon code vba.
A la manière d'une feuille : on peut la déplacer, ça ne perturbe pas le code.
Par exemple, sur la première ligne de transfert "SC.Cells(n + 7, 2).Value = SOdR.Cells(n, 6).Value", si ma colonne "6" est déplacée dans ma feuille Sodr en colonne 8, il faudrait que ce code le prenne en compte de lui-même, ou au moins d'une façon automatisée quelconque... (un autre code vba ?). peut être en utilisant l'entête de colonne, ou un nom de colonne ?
Je ne sais pas du tout comment prendre le problème... jusqu'à présent je le fais manuellement : ma colonne 6 doit passer en première colonne, je la déplace sur ma feuille Sodr, puis je vais dans le code et remplace partout où c'est nécessaire ma colonne "6" par la colonne "1"... ainsi que toutes ces copines qui sont alors elles aussi déplacées ! La colonne 1 devient la colonne 2, la 2 devient la 3 etc. C'est long en plus d'être source d'erreurs.
Seule la feuille 'ordre de relevé" (SOdr) peut avoir des colonnes "mobiles" si j'ose dire.
Pour info, la page "SOdr" correspond à l'ordre dans lequel on effectue un relevé sur le terrain, et dont on note les résultats dans cette feuille. C'est un peu comme une carte géographique. Mon produit 5 est le premier à être relevé quand on fait le tour des compteurs ? alors je le mets en colonne 1. Il a été déplacé et c'est le 18ème relevé à présent ? je vais le mettre en colonne 18. De cette manière, un débutant ^peut faire des relevés avec bien moins de risque d'erreur, mais faire ce genre de mise à jour est vraiment très long.
Vous pourrez voir dans le fichier joint en bas que les numéros de colonnes ne se suivent pas toujours, car il y a la colonne "semaine" qui s'interpose toutes les "x" colonnes ("x" étant une valeur variable puisque les colonnes n'ont pas toutes la même largeur) afin d'avoir à chaque début de page imprimée le numéro de semaine en cours. Ce qui me complique la tâche aussi, mais ce n'est pas la plus laborieuse.
Un lien vers le fichier :
https://www.cjoint.com/c/IDbjdd1167D
Merci d'avance pour votre précieuse aide, et en espérant être suffisamment clair !! et si une solution existe, bien sûr...
PS : les codes VBA présents sont un gros meltingpot de vos aides diverses et ô combien utiles (et nombreuses) et de mes adaptations propres.
Configuration: Windows / Firefox 66.0
A voir également:
- Lier des colonnes au code VBA
- Code ascii - Guide
- Comment faire des colonnes sur word - Guide
- Classer par ordre alphabétique excel plusieurs colonnes - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
2 réponses
Bonjour,
Le plus simple est de définir la colonne par une variable (Range de préférence) et lui attribuer la colonne à l'aide de la méthode Find en cherchant l'intitulé de colonne.
Le plus simple est de définir la colonne par une variable (Range de préférence) et lui attribuer la colonne à l'aide de la méthode Find en cherchant l'intitulé de colonne.
Et voilà !!
Merci Patrice :)
quelques exemples du code après modifs, ça fonctionne du tonnerre !
J'ai remarqué en revanche une anomalie mais qui ne provient pas de cette modif-ci. J'ouvrirai un autre topic si je ne trouve pas de solution, mais ça ne fait que ralentir le code, ça n'est pas bloquant.
en tout cas, ci dessous des exemples qui marchent, merci à toi :)
Il manque peut être des déclarations de feuilles, c'est juste pour montrer à quoi ça ressemble à la fin.
Encore merci !
Merci Patrice :)
quelques exemples du code après modifs, ça fonctionne du tonnerre !
J'ai remarqué en revanche une anomalie mais qui ne provient pas de cette modif-ci. J'ouvrirai un autre topic si je ne trouve pas de solution, mais ça ne fait que ralentir le code, ça n'est pas bloquant.
en tout cas, ci dessous des exemples qui marchent, merci à toi :)
Sub Transfert_données_tableau_complet() ' envoie les données simples (sans calcul) et les données de consommation (avec calcul). Application.ScreenUpdating = False ' Permet de masquer les actions à l'écran ' message d'avertissement début macro. Dim N As Byte, B As Byte, B = 12 N = 6 'Premières lignes à créer Dim SOdR As Worksheet Set SOdR = Sheets("Ordre de relevé") Dim SC As Worksheet Set SC = Sheets("Cuve") Dim cellule As Range Dim Colonne As Range While SOdR.Cells(N, 3) <> "" ' Importation des données ' Cuve Set cellule = SOdR.Rows(5).Find(What:="AS8C1", LookAt:=xlPart) Set Colonne = cellule.EntireColumn SC.Cells(B, 2).Value = SOdR.Cells(N, Colonne.Address).Value Set cellule = SOdR.Rows(5).Find(What:="SO8C1", LookAt:=xlPart) Set Colonne = cellule.EntireColumn SC.Cells(B, 5).Value = SOdR.Cells(N, Colonne.Address).Value ' Passage à la ligne suivante N = N + 1 B = B + 1 Wend 'fin de boucle pour transfert des données simples ' Conso antioxydant, données avec calcul Dim A As Byte A = 6 While SOdR.Cells(A, 1) <> "" Set cellule = SOdR.Rows(5).Find(What:="PCOT501", LookAt:=xlPart) Set Colonne = cellule.EntireColumn If SOdR.Cells(A, Colonne.Address).Value - SOdR.Cells(A + 1, Colonne.Address).Value < 0 Then SCA.Cells(A, 2).Value = 950 - SOdR.Cells(A + 1, Colonne.Address).Value + SOdR.Cells(A, Colonne.Address).Value Else: SCA.Cells(A, 2).Value = SOdR.Cells(A, Colonne.Address).Value - SOdR.Cells(A + 1, Colonne.Address).Value End If If SOdR.Cells(A + 1, Colonne.Address).Value = "" Then SCA.Cells(A, 2).ClearContents End If Wend End Sub
Il manque peut être des déclarations de feuilles, c'est juste pour montrer à quoi ça ressemble à la fin.
Encore merci !
Bon, si je comprends bien, avec le "find" je peux aller chercher la cellule contenant l'en tête, faire remonter le numéro de colonne et utiliser cette remontée dans ma formule de transfert de donnée...
J'ai ouvert un nouveau classeur test, la ligne 1 comprend les en têtes complètes (au moins le texte recherché), les 4 autres lignes des données en lettre et nombre, et 2 feuilles seulement : la feuil1 transfert vers la feuil2.
ça ne donne rien de probant, "variable objet non définie". je continue de réfléchir sur cette piste, mais je veux bien un guide :) je ne suis pas assez compétent, là... clairement pas...
Edit :Text est un mot réservé au VBA, il ne faut pas l'employer pour désigner une variable.
Alors, ça fonctionne, dans le sens où la msgbox annonce bien la colonne, mais je n'arrive pas à l'inclure dans mon calcul.
En soi, la msgbox ne m’intéresse pas, c'est inclure l'info "numéro de colonne" qui m’intéresse, quelque chose comme :
Sheets("feuil1").Cells(Colonne.Address, 2).Value = Sheets("feuil2").Cells(1, 3)
Évidemment ce code ne fonctionne pas ... Le "Split" non plus ne permet pas de résoudre ce calcul.
J'ai donc un code qui fonctionne même en changeant la colonne de place :) :
ça va me simplifier la vie !!
Merci Patrice !