Liaison de colonne en colonne

Bonjour le forum !

C'est mon premier post sur ce forum et je débute également dans tout ce qui est programmation, VBA, macro. J'ai eu de bon retours sur ce forum et j'ai commencé à lire le cours donné sur VBA qui est super bien fait pour comprendre !

Cependant pour un projet j'ai un petit casse tête que je n'arrive pas à résoudre.

Je m'explique :

- Dans un fichier, le premier onglet contient une suite de valeurs associées à un jour de l'année. Sachant que pour différents cas les dates et les valeurs peuvent changer mais leur emplacement reste toujours le même.

- Dans mon deuxième onglet je souhaiterai trouver un moyen de faire le lien avec les valeurs du premier par une liaison du type =Feuil1! pour la colonne A mais le problème est que en colonne B je dois avoir le découpage de la journée de la colonne A en 24h. C'est à dire que la colonne A va contenir la date qui fait référence à la feuille 1 et ensuite la colonne B aura 24 lignes à la suite. J'aurai donc en A2 la date 01/01/2016 puis en B2 01/01/2016 00:00 puis en B3 01/01/2016 01:00 , B4 01/01/2016 02:00 ect ...

Savez vous comment je peux procéder pour que la colonne A feuille 2 soit liée aux valeurs de la feuille 1 et que la colonne B feuille 2 soit liée à la colonne A feuille 2 ...

Je vous ai joins l'exemple, dans ce fichier les colonnes ne sont pas liées comme je le voudrais

14classeur1.xlsx (16.91 Ko)

Merci d'avance pour votre aide et à bientôt !!

J'avoue que je ne comprends pas ton propos ni ton problème !

Si tu listes les dates de l'année sur une feuille , et les même multipliées par 24 sur une autre feuille, le lien naturel entre les deux feuilles sera la date ! Et tu peux définir une règle de calcul pour convertir la position d'une date en Feuil1 en position de la même date en Feuil2... Cela suffit en soi !

Cordialement.

Bonjour Mozilla08 et bienvenue,

Salut MFerrand

Pas certain, moi non plus, d'avoir compris

... Que donneraient:

  • en A2 de la feuille 2:
    =DECALER(Date!$A$2;(LIGNE()-2)/24;0)
  • et en B2 de cette même feuille:
    =A2+(MOD(LIGNE()-2;24)/24)

Salut U.Milité...

J'y ai pensé aussi, mais si les dates se suivent à partir du 1er janvier, c'est inutile...

L'objectif n'est pas clair !

A suivre !

Merci pour vos réponses !

Je vais essayer de faire plus simple dans ce cas.

Mon fichier charge en feuille 1 un fichier externe qui recense la température de l'eau min et max jours par jours sur une période choisi.

Par exemple si je souhaite connaitre la température de l'eau du 01/01/2016 au 01/03/2016 ma plage de données sera de 92 jours. Mais celle-ci peut être de 1 an ou plus. Les données de la feuille 1 commenceront toujours à partir de la cellule A2 mais si finissent en fonction de la durée choisi.

Mon but est d'avoir une évolution de la température non plus jours par jours mais heures par heures en fonction de la journée.

C'est pourquoi dans ma feuille 2 je vais avoir 24 fois la même date et ainsi de suite.

Par exemple, si je choisi 1 an sur la feuille 1 j'aurai 365 lignes et sur la feuille 2 j'aurai 24*365=8760 lignes.

Est ce que mes explications vous ont aidés ?


PS : La plage de temps choisi ne commencera pas toujours par le 01/01. Je peux être amené à chercher une plage de données allant du 05/06/14 au 08/09/2014 par exemple.

Tu veux donc générer les inscriptions sur Feuil2 à partir des dates de Feuil1 ?

Par formules ou VBA ?

Oui exactement ! Peu importe au plus simple je dirai. Sachant que le fichier que je suis en train de créer sera amené à être utilisé par d'autres personnes.

Bon ! Solution formules (déjà abordée par U.Milité) :

En A2 :

=INDIRECT("Date!A"&ENT((LIGNE()-2)/24)+2)

Mettre le format de cellule à : jj/mm/aaaa;; [ajouter 2 points-virgules] pour inhiber l'affichage des 0

Tirer vers le bas...

En B2 :

=SI(A2>0;A2+MOD(LIGNE()-2;24)/24;"")

Tirer vers le bas.

Solution macro :

Sub DateHeures()
    Dim Td, i&, j%
    With Worksheets("Date")
        Td = .Range("A2:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
    End With
    With Worksheets("Date + heure")
        .Range("A1").CurrentRegion.Offset(1).Clear
        For i = 1 To UBound(Td)
            .Cells((i - 1) * 24 + 2, 1).Resize(24, 2).Value = Td(i, 1)
            For j = 0 To 23
                .Cells((i - 1) * 24 + 2 + j, 2) = .Cells((i - 1) * 24 + 2 + j, 2) + j / 24
            Next j
        Next i
        .Range("B2").Resize(24 * UBound(Td)).NumberFormat = "dd:mm:yyyy hh:mm"
        .Activate
    End With
End Sub

Cordialement.

Merci beaucoup pour les deux solutions, c'est vraiment super !!

Dernière petite question, existe t il un moyen d’exécuter ta macro directement quand je charge la plage de donnée ? Sans passer par le bouton.

Ca serait plus pratique si quand j'utilise la macro pour charger ma plage de donnée, la macro qui affiche la date+heure se lance automatiquement derrière


Je viens me modifier la mise en page pour expliquer un peu chaque onglet et la plage de donnée correspondant à la période de temps choisi ne commence plus en A2 mais en A24. J'ai du mal a voir ce que je dois modifier pour adapter ton code (VBA et formule)

Ca serait plus pratique si quand j'utilise la macro pour charger ma plage de donnée, la macro qui affiche la date+heure se lance automatiquement derrière

A la fin de ta macro qui charge ta plage, tu fais lancer la macro...

la plage de donnée correspondant à la période de temps choisi ne commence plus en A2 mais en A24.

Tu remplaces A2 par A24 dans la plage affectée à Td au départ.

Cordialement.

J'ai ajouter la deuxième macro à la fin de la première, tout se charge bien à la suite. Il me reste une erreur, pour la colonne B de la feuille 2 la date reste fixé sur l'année 1900 je ne comprends pas pourquoi.

Voici mon fichier:

16classeur-1-bis.xlsm (272.19 Ko)

Tu avais transformé un 2 en 24 à tort... ce qui empêchait une erreur de se produire !

En effet, ton modèle comportait des dates, ici tes valeurs ne sont pas des dates mais du texte, il convient donc d'abord de les convertir en date.

Sub DateHeures()
    Dim Td, i&, j%
    With Worksheets("Plage de temps")
        Td = .Range("A24:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
    End With
    With Worksheets("Evolution heure par heure")
        .Range("A1").CurrentRegion.Offset(1).Clear
        For i = 1 To UBound(Td)
            .Cells((i - 1) * 24 + 2, 1).Resize(24, 2).Value = DateValue(Td(i, 1))
            For j = 0 To 23
                .Cells((i - 1) * 24 + 2 + j, 2) = .Cells((i - 1) * 24 + 2 + j, 2) + j / 24
            Next j
        Next i
        .Range("B2").Resize(24 * UBound(Td)).NumberFormat = "dd/mm/yyyy hh:mm"
        .Activate
    End With
End Sub

Rectifs et modifs surlignées.

Effectivement j'ai un peu tâtonné en remplaçant les 2 par des 24 pour voir si ça pouvait marcher mais c’était pas la bonne solution

La macro est assez longue à charger, est ce qui si je converti le texte en date directement quand je charge la plage de donnée, (il faudrait un code VBA disant pour la colonne A remplacer le texte en date) celà serait il plus rapide ?

Sinon pas grave la macro est exactement comme je l'imaginais ! Merci pour ton aide


J'ai pensé à ce code

Value Range("A1:H6793") = DateValue.Select

Non ! Ta ligne de code ne correspond à aucune syntaxe. Et la conversion de la plage copiée ligne par ligne aura plutôt pour effet d'allonger le temps de traitement...

Bon ben très bien alors je laisse comme ca ! Merci encore

Désolé c'est encore moi x)

J'ai des problèmes pour la suite de ma programmation.

Après les deux colonnes "date" et "date et heure" je souhaites créer plusieurs colonnes afin au final d'obtenir une sinusoïde qui montre l'évolution de la température en fonction des heures.

Dans la colonne C j'utilise la formule

=RECHERCHEV(A2;'Plage de temps'!$A$24:$E$6793;4;0)

Cependant j'ai une erreur #N/A et je n'arrive pas a savoir pourquoi, surement à cause du format "Date" ou "standard"

Ensuite le problème est que quand je charge un nouveau fichier dans l'onglet" plage de temps", les formules que j'applique sur les autres colonnes s’effacent comme si tout était remis à zéro. Comment faire pour que les formules que je rentre reste après avoir changé de fichier ?

13classeur-1-bis.xlsm (291.04 Ko)

Bonjour,

Pour le message d'erreur renvoyé par la RECHERCHEV : en colonne A de ta feuille "Plage de temps", toutes les dates sont considérées comme du texte (parce que suivies d'un caractère d'espacement )

[Edit:] en fait, ce ne sont même pas de simples espaces après tes dates, mais l'équivalent d'espaces insécables, tels qu'ils existent dans Word ou de CAR(160)

Sais tu comment exploiter ces données sans erreurs de format ? Car tout mes autres onglet vont faire références aux données importées dans l'onglet "plage de temps"

Re,

C'est fatal, je t'avais signalé qu'il ne s'agissait pas de dates... on n'a converti que pour affecter à la feuille 2 !

Tu aurais dû définir la totalité de ton processus avant qu'on démarre, parce que sachant où l'on va arriver on a plus de chances d'y arriver directement... Là ça m'a l'air parti pour une reprise à chaque fois que tu vas ajouter un élément non indiqué dès le départ !

Effectivement je suis désolé de m'en être rendu compte que après. Mais théoriquement si tout pars du fichier importé on peut régler ca en imposant le bon format dès son importation non ?

Sachant que mon code est celui-ci

Sub Ouvrir()
f = Application.GetOpenFilename(, , , , True)
    Workbooks.Open (f(1))
    Range("A1:H6793").Select
    Selection.Copy
    Windows("Classeur 1 bis.xlsm").Activate
    Range("A13").Select
    ActiveSheet.Paste

Call DateHeures

End Sub

Je n'arrive pas bien à comprendre si il faut que les dates soient au format "Date" ou "Standard"

Rechercher des sujets similaires à "liaison colonne"