Liaison de colonne en colonne
Il ne s'agit pas de format !
Le format, tu peux mettre celui que tu veux... Le critère essentiel est le type de données. Le type de données Date est un type de données reconnu par Excel comme tel : dès lors qu'une date est reconnue comme date, Excel la stocke sous forme numérique et lui applique un format de date par défaut si la cellule est encore au format standard.
Si la date n'est pas reconnue, c'est du texte...
Pour avoir une date, il faut convertir en date...
Mais je me pose la question de l'utilité d'une telle conversion pour simplement aller garnir quelques milliers de lignes de formules alors que tes températures pouvaient fort bien être récupérées simultanément et insérées dans la colonne idoine dans le même mouvement et sans formules !
Si tous tes ajouts successifs sont du même type, c'est un problème de conception à la base... Il faut aller au bout de la conception, sans préjuger des méthodes de réalisation pour pouvoir alors choisir celles qui s'adapteront le mieux et le plus économiquement au processus mis en oeuvre.
Effectivement si la macro qui transforme mes dates en "datesheures" pouvait aller chercher la température min et max associé à chaque date et tout importer d'un coup ca serai plus simple. Après j'utiliserai une formule pour calculer la variation de température au cours de la journée de ce type
=-(Tmax-Tmin)/2*COS(PI()/12*Variable-PI()/3)+(Tmax+Tmin)/2Comment je peux procéder pour aller rechercher les valeurs de la bonnes façon ?
Bonjour,
Il faut savoir où tu places ta colonne température, et s'il y en a d'autres dans le même cas, et il faudra que la macro soit lancée après insertion de ces données...
Cordialement.
Les colonnes seront placés comme le fichier ci joint
Pour lancer la macro, après avoir chargé le fichier puis changé les dates du format date au format date+heure je pourrais écrire
Call (Nouvelle macro)Avec dans cette nouvelle macro un code VBA qui me permet d'associer la température à la date correspondante.
Dans la feuille 2 j'aurai donc 24 fois la même température pour chaque date.
Aussi dans la colonne F de la feuille 2 je vais mettre ma formule qui calcul la température pour chaque heure de la journée en fonction de la température min et max.
A ton avis il faut mieux l'intégrer aussi dans la macro ? Ou je peux la rentrer comme une formule classique avec le signe = ?
Peux tu m'aider à programmer ce code VBA ?
Qu'est-ce qui doit aller dans la colonne "Variable" ?
La colonne variable est un nombre correspondant aux heures de la colonne à sa gauche. Par exemple pour 01/01/2016 00:00 la colonne variable affichera 0, pour 01/01/2016 16:00 la colonne variable affichera 16 ect...
Sois plus précis ! C'est l'heure ou ce n'est pas l'heure ! Sous quelle forme ? Et juste pour être utilisée dans ta formule ? Ou pour autre chose...
J'aimerais bien savoir où on va... !
Bonjour !
C'est bien l'heure mais en format de nombre. Car dans ma formule qui calcul la température heure par heure, l'heure est multiplié par un coefficient et donc c'est cette heure qui varie de 0 à 23.
Je t'ai joint le fichier qui me sert de modèle pour que tu puisses voir ce que j'essaye de créer. Ce fichier n'est pas automatisé dans le sens ou si on prend une plage de temps différentes il faudra alors tout recopier et coller manuellement. C'est pourquoi j'essaye d'obtenir la même chose mais avec des macro afin que quelque soit le plage de temps chargé le fichier s'adapte au reste.
Concernant la colonne variable du fichier ci joint il est affecté 24 pour 00:00, 25 pour 1:00, 26 pour 2:00 et 27 pour 3:00, je n'ai pas très bien compris cette logique mais ca n'a pas d'influence, comme la sinusoïde se base sur un cercle trigo de module 24 on à 25=1 ; 26=2 ect
On va essayer de clarifier un peu plus !
Voilà une procédure...
Sub DateHeuresTemp()
Dim Td, Tmin, Tmax, Tt, i&, j%
With Worksheets("Plage de temps")
Td = .Range("A24:F" & .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)
Tmin = Td(i, 5): Tmax = Td(i, 6)
Tt = Temp(Tmin, Tmax)
With .Cells((i - 1) * 24 + 2, 1).Resize(24, 2)
.Value = DateValue(Td(i, 1))
'.Offset(, 3).Resize(, 1).Value = Tmin
'.Offset(, 4).Resize(, 1).Value = Tmax
.Offset(, 5).Resize(, 1).Value = Tt
End With
For j = 0 To 23
.Cells((i - 1) * 24 + 2 + j, 2) = .Cells((i - 1) * 24 + 2 + j, 2) + j / 24
'.Cells((i - 1) * 24 + 2 + j, 3) = j
Next j
Next i
With .Range("B2").Resize(24 * UBound(Td))
.NumberFormat = "dd/mm/yyyy hh:mm"
.Offset(, 4).NumberFormat = "0.0"
End With
.Activate
End With
End SubElle est quasi identique à la précédente, mais : elle récupère le tableau de dates en y incluant les températures min et max (de A à F),
et elle opère la totalité des calculs.
En l'état elle sert sur la feuille Evolution, les colonnes A, B et F (Température).
Tu noteras 3 lignes de code invalidées (précédées d'une apostrophe et apparaissant en vert) : il suffit d'ôter l'apostrophe pour les rendre valides. Dans l'ordre la première sert la colonne D (Tmin), la deuxième la colonne E (Tmax) et la troisième la colonne C (heures).
Comme on peut fournir la température directement en F, servir ces colonnes est sans doute superflu... mais rien n'empêche de le faire. Cela représente simplement (si l'on peut extrapoler les écarts de temps sur l'échantillon) environ 40% de temps d'exécution en plus.
Le calcul de la température est fait par une fonction (appelée par la procédure ci-dessus), qui renvoie un tableau des températures calculées pour la journée.
Function Temp(Tmin, Tmax)
Dim T(23, 0), i%, S, D, P
S = (Tmax + Tmin) / 2: D = (Tmax - Tmin) / 2
P = WorksheetFunction.Pi() / 3
For i = 0 To 23
T(i, 0) = S - D * Cos(P / 4 * i - P)
Next i
Temp = T
End FunctionD'autre part,
Enfin, si un nettoyage préalable est à faire, il est à incorporer dans la proc. Ouvrir et sous une forme moins surréaliste que ton code enregistré (que j'ai effacé !)
Pour terminer, l'épuration étant faite, toutes les procédures doivent trouver place dans le même module (rien ne justifie la multiplication des modules !)
Cordialement.
Alors là je ne sais pas quoi dire !! Merci pour tout le boulot !
Tu as su réussir à retranscrire en code ce que je m'imaginais faire manuellement ! je t'avoue que je ne comprend pas exactement chaque ligne de code mais j'imagine qu'il faut plusieurs années d'expérience et de pratique pour être à l'aise avec ca ! C'est fou la puissance de ce logiciel
Tout s’emboîte bien, je peux choisir d'afficher les températures ou non, la température heure par heure ce calcul automatiquement c'est vraiment génial !!
Concernant la procédure d'ouverture du fichier j'ai effectivement mis le "A1:H6793" pour être souple en fonction de la plage de temps choisis (6 mois, 1 ans, 3 mois ect..) mais si il existe une solution qui charge une plage variable c'est tant mieux !
Pour le nettoyage matérialisé par le bouton reset il faut un code permettant de remettre à zéro les deux onglets avant d'en charger un nouveau. J'imagine que mon code doit te piquer les yeux je l'ai fait simplement en lançant un enregistrement de macro
Enfin sur le fichier que tu m'as transmis il existe deux modules, dois je les conserver en l'état et à la fin du module 1 écrire call module 3 () dois puis-je coller le module 3 directement à la suite du module 1 ?
Bonjour,
Pas eu le temps d'y revenir hier...
Sub Ouvrir()
Dim f, n&, ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Plage de temps")
ws.Range("A23:H23").Resize(ws.UsedRange.Rows.Count).Clear
f = Application.GetOpenFilename(MultiSelect:=True)
If f = False Then Exit Sub
With Workbooks.Open(f(1))
With .Worksheets(1)
n = .Range("A" & .Rows.Count).End(xlUp).Row
ws.Range("A23").Resize(n, 8).Value = .Range("A1:H" & n).Value
End With
.Close False
End With
If MsgBox("Voulez-vous poursuivre par l'évolution heure par heure ?", vbYesNo + vbQuestion, _
"Continuer...") = vbYes Then DateHeuresTemp
End SubRévision plus complète de ta proc. Ouvrir, incluant le nettoyage de la feuille cible (pour l'évolution heure par heure, l'effacement du contenu antérieur était déjà dans l'autre macro, il interviendra donc... Il conviendra de vérifier qu'il ne déborde pas de ce qui doit être effacé.)
Sur cette proc. Ouvrir, vérifier que les références lignes, colonnes, noms de feuilles... correspondent bien...
Je ne sais pas si tout sera en place pour poursuivre, j'ai donc mis sous condition de confirmation par l'utilisateur la poursuite sur l'évolution heure par heure. Et rattaché la proc. DateHeuresTemp à ta seconde flèche (à la place du Reset) pour qu'elle puisse être lancée indépendamment.
Cordialement.
Bonne journée.
Pas de soucis je trouve ca super que tu puisses m'aider comme ca ! Je ne suis pas pressé !
Je rencontre une erreur quand j'utilise le bouton ouvrir. le message d'erreur me dit "erreur exécution 13 Incompatibilité de type" et quand je clic sur débogage le VBA me renvoie à la partie de code surligné. J'ai vérifié la procédure ouvrir et tout me semble correct, bon nom de feuille,lignes et colonnes.
Function Temp(Tmin, Tmax)
Dim T(23, 0), i%, S, D, P
S = (Tmax + Tmin) / 2: D = (Tmax - Tmin) / 2
P = WorksheetFunction.Pi() / 3
For i = 0 To 23
T(i, 0) = S - D * Cos(P / 4 * i - P)
Next i
Temp = T
End Function
Sub Ouvrir()
Dim f, n&, ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Plage de temps")
ws.Range("A23:H23").Resize(ws.UsedRange.Rows.Count).Clear
f = Application.GetOpenFilename(MultiSelect:=True)
If f = False Then Exit Sub
With Workbooks.Open(f(1))
With .Worksheets(1)
n = .Range("A" & .Rows.Count).End(xlUp).Row
ws.Range("A23").Resize(n, 8).Value = .Range("A1:H" & n).Value
End With
.Close False
End With
If MsgBox("Voulez-vous poursuivre par l'évolution heure par heure ?", vbYesNo + vbQuestion, _
"Continuer...") = vbYes Then DateHeuresTemp
End Sub
Sub DateHeuresTemp()
Dim Td, Tmin, Tmax, Tt, i&, j%
With Worksheets("Plage de temps")
Td = .Range("A24:F" & .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)
Tmin = Td(i, 5): Tmax = Td(i, 6)
Tt = Temp(Tmin, Tmax)
With .Cells((i - 1) * 24 + 2, 1).Resize(24, 2)
.Value = DateValue(Td(i, 1))
'.Offset(, 3).Resize(, 1).Value = Tmin
'.Offset(, 4).Resize(, 1).Value = Tmax
.Offset(, 5).Resize(, 1).Value = Tt
End With
For j = 0 To 23
.Cells((i - 1) * 24 + 2 + j, 2) = .Cells((i - 1) * 24 + 2 + j, 2) + j / 24
'.Cells((i - 1) * 24 + 2 + j, 3) = j
Next j
Next i
With .Range("B2").Resize(24 * UBound(Td))
.NumberFormat = "dd/mm/yyyy hh:mm"
.Offset(, 4).NumberFormat = "0.0"
End With
.Activate
End With
End SubC'est vrai !
Comme cela ça ira mieux :
f = Application.GetOpenFilename(MultiSelect:=True)
On Error GoTo suite
If f = False Then Exit Sub
suite:
On Error GoTo 0
With Workbooks.Open(f(1))Il est toujours mieux de prévoir le cas où l'on clique sur Annuler, ce qui renvoie False...
Cordialement.
C'est parfait ! Tout fonctionne correctement !! Merci encore pour ton aide ! Je vais garder le fichier précieusement j'ai appris pas mal de chose grâce à toi !
Bonne journée !
Bonjour MFerrand !
Je reviens vers toi car j'ai des nouvelles concernant le fichier excel. Au fur et à mesure des discussions avec mon responsable il est nécessaire de créer d'autres onglet pour effectuer différents calcul et le problème est qu'on ne peut faire référence à la feuille importé car toute les valeurs sont au format standard du coup mes calculs affichent #VALEUR
Pour les prochains calculs à effectuer il n'est pas nécessaire de les programmer en VBA mais il est nécessaire de faire référence aux valeurs importé de l'onglet plage de temps.
Il faudrait donc que quand je charge la feuille excel, le format des colonnes change. La colonne A soit au format Date et que la colonne C à F soit au format nombre.
Peux tu m'indiquer la modification à effectuer dans le code VBA ? Une fois ce problème résolu il n'y aura plus de soucis pour la suite
Bonjour,
Tu es dans ton truc et tu te comprends sans aucun doute, mais pour moi, il convient de préciser tout et quoi est quoi dans le détail !
En outre, une erreur #VALEUR! ne peut provenir d'un simple problème de format de cellule, le format de cellule n'a aucune incidence sur les calculs. Si un problème de format se pose, il s'agit du format de données, c'est à dire que les données ne sont pas du type voulu, ce qui provoque erreur. La question n'est pas alors de changement de format, mais de conversion de type de données...
Pour voir ça, il faut que je sache quoi voir et où, etc. !
Cordialement.
Effectivement je suis aller un peu trop vite, je vais donc procéder à un rappel.
Mon but initiale était de créer une macro qui me permet d'importer une feuille excel sur un nouveau fichier excel et d'ensuite exploiter ces données. Le fichier se compose d'une plage de temps auquel est indiquer des valeurs en fonction de la date.
Ma première demande concernait le fait de passer d'une plage de temps jour par jour à une plage de temps heure par heure. Ce qui ajoute 24 lignes, symbolisant les 24h à chaque jour. Pour ensuite créer une courbe d'évolution de la température en fonction de l'heure du jour.
Grâce à ton aide tout ceci à parfaitement été crée et voici le code obtenu :
Function Temp(Tmin, Tmax)
Dim T(23, 0), i%, S, D, P
S = (Tmax + Tmin) / 2: D = (Tmax - Tmin) / 2
P = WorksheetFunction.Pi() / 3
For i = 0 To 23
T(i, 0) = S - D * Cos(P / 4 * i - P)
Next i
Temp = T
End Function
Sub Ouvrir()
Dim f, n&, ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Extraction des DJ")
ws.Range("A9:H9").Resize(ws.UsedRange.Rows.Count).Clear
f = Application.GetOpenFilename(MultiSelect:=True)
On Error GoTo suite
If f = False Then Exit Sub
suite:
On Error GoTo 0
With Workbooks.Open(f(1))
With .Worksheets(1)
n = .Range("A" & .Rows.Count).End(xlUp).Row
ws.Range("A9").Resize(n, 8).Value = .Range("A1:H" & n).Value
End With
.Close False
End With
If MsgBox("Voulez-vous poursuivre par l'évolution de la température heure par heure ?", vbYesNo + vbQuestion, _
"Continuer...") = vbYes Then DateHeuresTemp
End Sub
Sub DateHeuresTemp()
Dim Td, Tmin, Tmax, Tt, i&, j%
With Worksheets("Extraction des DJ")
Td = .Range("A20:F" & .Range("A" & .Rows.Count).End(xlUp).Row)
End With
With Worksheets("Sinusoïde")
.Range("A1").CurrentRegion.Offset(1).Clear
For i = 1 To UBound(Td)
Tmin = Td(i, 5): Tmax = Td(i, 6)
Tt = Temp(Tmin, Tmax)
With .Cells((i - 1) * 24 + 2, 1).Resize(24, 2)
.Value = DateValue(Td(i, 1))
.Offset(, 3).Resize(, 1).Value = Tmin
.Offset(, 4).Resize(, 1).Value = Tmax
.Offset(, 5).Resize(, 1).Value = Tt
End With
For j = 0 To 23
.Cells((i - 1) * 24 + 2 + j, 2) = .Cells((i - 1) * 24 + 2 + j, 2) + j / 24
.Cells((i - 1) * 24 + 2 + j, 3) = j
Next j
Next i
With .Range("B2").Resize(24 * UBound(Td))
.NumberFormat = "dd/mm/yyyy hh:mm"
.Offset(, 4).NumberFormat = "0.0"
End With
.Activate
End With
End SubCependant il m'a été demandé d'exploiter d'avantage. Pour ce faire j'ai besoin de pouvoir me référer au fichié importé car mes calculs dépendent de ces valeurs.
Par exemple dans un premier temps je dois effectuer la somme des valeurs mois par mois en fonction de la plage de temps choisi.
J'ai trouvé un sujet similaire à ma question sur le forum et je l'ai adapté à mon fichier mais le problème étant que le fichier importé ne semble pas avoir qu'un format de valeurs standars. Or ma formule se base sur les date du fichier importé.
C'est pourquoi je voulais savoir si il était possible de programmer une ligne dans le code VBA qui me permet de charger le fichier pour convertir les données initiales en format "date" pour la colonne A et "Nombre" pour la colonne C à F.
Voici le fichier sur lequel je travail
Pour convertir tes dates :
Sub ConvertDate()
Dim n&, i&
With Worksheets("Extraction des DJ")
n = .Cells(.Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
For i = 20 To n
.Cells(i, 1) = DateValue(.Cells(i, 1))
Next i
End With
End SubCordialement.
Bonjour MFerrand,
Désole pour mon retour tardif je rentre d'un long weekend. Merci pour ton code !
J'aurai juste une question sur comment l'intégrer au code existant ?
Voici le code existant :
Function Temp(Tmin, Tmax)
Dim T(23, 0), i%, S, D, P
S = (Tmax + Tmin) / 2: D = (Tmax - Tmin) / 2
P = WorksheetFunction.Pi() / 3
For i = 0 To 23
T(i, 0) = S - D * Cos(P / 4 * i - P)
Next i
Temp = T
End Function
Sub Ouvrir()
Dim f, n&, ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Extraction des DJ")
ws.Range("A9:H9").Resize(ws.UsedRange.Rows.Count).Clear
f = Application.GetOpenFilename(MultiSelect:=True)
On Error GoTo suite
If f = False Then Exit Sub
suite:
On Error GoTo 0
With Workbooks.Open(f(1))
With .Worksheets(1)
n = .Range("A" & .Rows.Count).End(xlUp).Row
ws.Range("A9").Resize(n, 8).Value = .Range("A1:H" & n).Value
End With
.Close False
End With
If MsgBox("Voulez-vous poursuivre par l'évolution de la température heure par heure ?", vbYesNo + vbQuestion, _
"Continuer...") = vbYes Then DateHeuresTemp
End Sub
Sub DateHeuresTemp()
Dim Td, Tmin, Tmax, Tt, i&, j%
With Worksheets("Extraction des DJ")
Td = .Range("A20:F" & .Range("A" & .Rows.Count).End(xlUp).Row)
End With
With Worksheets("Sinusoïde")
.Range("A1").CurrentRegion.Offset(1).Clear
For i = 1 To UBound(Td)
Tmin = Td(i, 5): Tmax = Td(i, 6)
Tt = Temp(Tmin, Tmax)
With .Cells((i - 1) * 24 + 2, 1).Resize(24, 2)
.Value = DateValue(Td(i, 1))
.Offset(, 3).Resize(, 1).Value = Tmin
.Offset(, 4).Resize(, 1).Value = Tmax
.Offset(, 5).Resize(, 1).Value = Tt
End With
For j = 0 To 23
.Cells((i - 1) * 24 + 2 + j, 2) = .Cells((i - 1) * 24 + 2 + j, 2) + j / 24
.Cells((i - 1) * 24 + 2 + j, 3) = j
Next j
Next i
With .Range("B2").Resize(24 * UBound(Td))
.NumberFormat = "dd/mm/yyyy hh:mm"
.Offset(, 4).NumberFormat = "0.0"
End With
.Activate
End With
End Sub
Sub ConvertDate()
Dim n&, i&
With Worksheets("Extraction des DJ")
n = .Cells(.Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
For i = 20 To n
.Cells(i, 1) = DateValue(.Cells(i, 1))
Next i
End With
End SubAvec en vert le dernier code ajouté. Mais lorsque je charge le fichier avec le bouton "ouvrir" la conversion des dates ne se fait pas. Il faut que j'aille dans Développeur/Visual basique/Macro 1 et que je clic sur le bouton play pour que la modification se fasse. Peut tu me dire comment procéder ?
Merci d'avance !
C'est à lancer à part... Tu peux le raccorder à un bouton.
Mais je recommanderais de ne lancer cette conversion qu'après avoir réalisé la feuille heure par heure.
Cordialement.