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
- Code puk bloqué - Guide
- Classer par ordre alphabétique excel plusieurs colonnes - 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.
Sub test1() 'déclaration colonne OT501 du Mixte Cru Dim Colonne1 As Range Dim Text As String Text = "OT501MC" Set Colonne1 = Rows(1).Find(What:=Text, LookAt:=xlWhole).Column Sheets("feuil1").Cells(Colonne1, 5).Value = Sheets("feuil2").Cells(1, 3) End Subç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...
Sub test1() Dim cellule As Range Dim colonne As Range Dim texte As String texte = "OT501MC" Set cellule = Worksheets("Feuil1").Rows(1).Find(What:=texte, LookAt:=xlWhole) If Not cellule Is Nothing Then Set colonne = cellule.EntireColumn MsgBox "Le libellé " & texte & " est dans la colonne " & Split(colonne.Address(False, False), ":")(1) Else MsgBox "Le libellé " & texte & " n'a pas été trouvé dans la première ligne" End If End SubEdit :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 :) :
Sub test2() Dim cellule As Range Dim Colonne As Range Dim texte As String texte = "OT501MC" Set cellule = Worksheets("Feuil1").Rows(1).Find(What:=texte, LookAt:=xlPart) Set Colonne = cellule.EntireColumn Sheets("feuil2").Cells(3, 1) = Sheets("feuil1").Cells(2, Colonne.Address).Value End Subça va me simplifier la vie !!
Merci Patrice !