Lier des colonnes au code VBA

Résolu/Fermé
stitchbouck Messages postés 117 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 18 avril 2024 - 1 avril 2019 à 11:18
stitchbouck Messages postés 117 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 18 avril 2024 - 8 avril 2019 à 16:52
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.

Configuration: Windows / Firefox 66.0
A voir également:

2 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
1 avril 2019 à 12:18
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.
0
stitchbouck Messages postés 117 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 18 avril 2024 2
Modifié le 8 avril 2019 à 17:27
Merci Patrice.

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...
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
Modifié le 1 avril 2019 à 17:03
Essaies :
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 Sub

Edit :Text est un mot réservé au VBA, il ne faut pas l'employer pour désigner une variable.
0
stitchbouck Messages postés 117 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 18 avril 2024 2
2 avril 2019 à 10:12
ha ok pour "text".
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.
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
2 avril 2019 à 23:54
C'est normal que ce code ne fonctionne pas : la syntaxe c'est Cells(Ligne, Colonne) pas l'inverse.
0
stitchbouck Messages postés 117 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 18 avril 2024 2
Modifié le 8 avril 2019 à 17:27
grrrr je plante sur quelque choses que je sais, pourtant... bref, un grand merci, ça fonctionne. j'adapte tout ça pour le fichier et reviens ici pour dire ce qu'il en est.

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 !
0
stitchbouck Messages postés 117 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 18 avril 2024 2
Modifié le 8 avril 2019 à 17:28
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 :)

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 !
0