Transférer données depuis un fichier météo
Bonsoir à tous,
J’essaie de transférer mes données de mon fichier général de météorologie sur mon fichier Janvier en automatique par le biais de VBA.
En partant de relevés généraux, je désir renseigner les données sur des fichiers mensuels, ici, Janvier créés en 2016 par Guy85 qui avait fait un travail fantastique.
Mon problème, est que les fichiers ont beaucoup de lignes et colonnes vide , mais je suis incapable de reproduire et de comprendre dans le détail le fonctionnement. C'est pour cela que je ne supprime aucune ligne et colonne vide.
Pour l'instant, j'y vais calmement et je me contente d'essayer de renseigner les données dans le fichier mensuel par code VBA.
Je suis arrivé à importer les données de températures mais je but très sérieusement sur l'ajout d'une boucle pour remplir tout le mois.
Les boucles, je n'ai jamais été bien copain avec elles, et je me suis formé sur le tas, donc beaucoup de lacunes.
Mon code d'amateur est certainement à simplifier, les professionnels me donnerons une leçon que j'accepterai avec humilité, mais que j'aimerai comprendre le cheminement ensuite, pour ma formation personnelle. Même à 69 ans, ça fait du bien au cerveau
Mon but final, serait de pouvoir , sur le fichier intitulé Janvier de pouvoir y intégrer les 12 mois de l'année et que les graphiques suivent comme sur l'exemple feuil1 et pouvoir choisir l'année, le mois et le jour.
Votre aide pour la boucle me serait très précieuse.Dans le code VBA, il y a une section sauvegarde du code ou vous pouvez voir ou j'ai placé la boucle. du moins mon essai non fonctionnel.
Je joints les 2 fichiers sur lesquels je travail.
Merci à vous
Robert
Le second fichier
Bonsoir à tous,
Malgré mes tentatives, la mémorisation de la première ligne ainsi que la recopie dans le fichier de destination fonctionnent mais je ne vois pas ou est mon erreur pour que la boucle continue tant que c'est Janvier par exemple.
Votre aide me serait très précieuse.
Merci
Sub Boucle()
' Mémorisation du nom du fichier de données
Dim Fic1 As Variant
Fic1 = ActiveWorkbook.Name
' Boite de dialogue pour ouvrir le fichier du mois que nous voulons traiter
Dim fd As Office.FileDialog
Dim strFichier As String
'Dim Fic1 As Variant
Dim Ongl1 As Variant
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.Filters.Clear
.Filters.Add "Fichiers Excel", "*.xlsm?", 1 ' Type de fichier à oubvrir
.Title = "Choisissez un fichier Excel" ' Titre de la boite de dialogue
.AllowMultiSelect = False ' Type de fichiers pour limiter le type de fichier recherché
' Ici, .Xlsm pour ne visualiser que eux
' Mettre à TRUE si multiples types de fichiers en visibilité
.InitialFileName = "E:\Météo\Météo 2025\Conception VBA" ' Chemin de la recherche
If .Show = True Then ' La boite de dialogue s'ouvre pour le choix du fichier avec les éléments définis ci-dessus
strFichier = .SelectedItems(1)
Workbooks.Open (strFichier)
End If
End With
' =========================================================================
' Enregistrement des élèments du fichier à complèter
' Selectionne la feuille à traiter
Sheets("Donnees_Mens").Select
' Recherche de la première ligne non vide
Range("A1").Select
'Va à la première cellule non vide
Selection.End(xlDown).Select
' Mémorisation du nom du fichier de destination ouvert
Dim Fic2 As Variant
Fic2 = ActiveWorkbook.Name
' Mémorise l'onglet à traiter
Dim Ongl2 As Variant
Ongl2 = ActiveSheet.Name
' Mémorisation du Mois à traiter
Dim Mois2 As Variant
Mois2 = ActiveCell.Value
I = 1
While ActiveCell(I, 3).Value <> ""
If ActiveCell.Offset(I, 0) = Mois2 Then
' Mémorise la date à rechercher
Dim Dat2 As Date
ActiveCell.Offset(0, 3).Activate
Dat2 = ActiveCell.Value
' Mémorise les cellules à renseigner
' Mémoriser Ressentis
Dim Ress2 As Variant
ActiveCell.Offset(0, 19).Activate
Ress2 = ActiveCell.Address
' Mémoriser l'heure du ressentis
Dim RessH As Variant
'ActiveCell.Offset(0, 2).Activate
RessH2 = ActiveCell.Offset(0, 2).Activate
RessH2 = ActiveCell.Address
' Revient sur la cellule mémorisée Dat2
ActiveCell.Offset(0, -24).Activate
' Retour sur le fichier de données
Workbooks(Fic1).Activate
'Recherche de la bonne date
Cells.Find(What:=Dat2, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
' ActiveCell.Offset(0, 2).Range("A1").Select
' Déclaraion des variables
Dim Ress1, Mini1, Maxi1 As Variant
Dim RessH1, MiniH1, MaxiH1 As Date
ActiveCell.Offset(0, 0).Activate
Ress1 = ActiveCell.Offset(0, 2).Value
RessH1 = ActiveCell.Offset(0, 3).Value
Mini1 = ActiveCell.Offset(0, 4).Value
MiniH1 = ActiveCell.Offset(0, 5).Value
Maxi1 = ActiveCell.Offset(0, 6).Value
MaxiH1 = ActiveCell.Offset(0, 7).Value
Workbooks(Fic2).Activate
' Dépos des données de températures
ActiveCell.Offset(0, 22) = Ress1
ActiveCell.Offset(0, 24) = RessH1
ActiveCell.Offset(0, 26) = Mini1
ActiveCell.Offset(0, 28) = MiniH1
ActiveCell.Offset(0, 32) = Maxi1
ActiveCell.Offset(0, 34) = MaxiH1
' =========================================================================
Dat2 = Dat2 + 1
I = I + 1
ActiveCell.Offset(I, 0).Activate
End If
Wend
End SubJ'ai l'impression de ne pas avoir copié mon code correctement. J'ai pourtant bien utilisé </>
Je ne vois pas ascenseur pour le visualiser.
Vraiment désolé
Bonjour à tous
J'ai enfin réussi à faire la boucle sans bug.
J'ai faits cela sur un fichier unique et non 2 fichiers comme demandé initialement pour simplifier et essayer que vous compreniez mieux ma demande car ma prose initiale est peut être incompréhensible.
J'appel les pros du VBA pour corriger le mien qui est amateur. Il y a certainement beaucoup de simplifications à apporter, et vous comprendrez certainement mieux ma demande initiale avec les 2 fichiers séparés.
Merci pour votre aide
@+
Robert
Bonjour
Après avoir regardé votre (très joli d'ailleurs!), le code Boucle comme ceci
Option Explicit
Sub Boucle1()
Dim Ongl1 As Worksheet, Ongl2 As Worksheet
Dim pligmois2 As Byte, dligmois2 As Byte, i As Byte
Dim dat2 As Date
Dim plage1 As Range
Dim lig1 As Integer
Application.ScreenUpdating = False
Set Ongl1 = Sheets("MesDonnées")
Set Ongl2 = Sheets("Donnees_Mens")
' Recherche de la première ligne non vide
pligmois2 = Ongl2.Range("A1").End(xlDown).Row
' Recherche de la dernière ligne non vide
dligmois2 = Ongl2.Range("A" & Rows.Count).End(xlUp).Row
'première date ongl2
dat2 = Ongl2.Range("D" & pligmois2)
'plage colonne A en feuille mes données
Set plage1 = Ongl1.Range("A4:A" & Ongl1.Range("A" & Rows.Count).End(xlUp).Row)
On Error Resume Next
lig1 = plage1.Find(Format(dat2, "Long Date"), LookIn:=xlValues, LookAt:=xlWhole).Row
If lig1 = 0 Then MsgBox "Date non trouvée en cellule A" & lig1 & " - Feuille MesDonnées", vbCritical, "Date inconnue": Exit Sub
On Error GoTo 0
For i = pligmois2 To dligmois2 Step 2
With Ongl2
.Cells(i, 23) = Ongl1.Range("C" & lig1)
.Cells(i, 25) = Ongl1.Range("D" & lig1)
.Cells(i, 27) = Ongl1.Range("E" & lig1)
.Cells(i, 29) = Ongl1.Range("F" & lig1)
.Cells(i, 33) = Ongl1.Range("G" & lig1)
.Cells(i, 35) = Ongl1.Range("H" & lig1)
End With
Next i
Application.ScreenUpdating = True
End SubCordialement
Bonjour Dan,
Merci pour votre précieuse aide.
Je suis ébloui par votre code pro par rapport au mien très amateur.
Je vais l'essayer dès ce soir car en journée j'ai des travaux extérieurs à entreprendre.
Je vais faire du pas à pas pour bien comprendre votre code et y ajouter les commentaires comme j'en ai l'habitude.
Pour la continuité de mon fichier, je vais ajouter 12 feuilles, 1 par mois. Pensez_vous qu'il sera possible avant le code actuel d'ajouter du code qui me permettrait de choisir la feuille à traiter ( le mois ) ? c'est la suite que je vais tenter de créer.
En tout cas, un très grand merci pour votre temps passé et votre aide.
Bonne journée
Robert
Bonjour
Je vais faire du pas à pas pour bien comprendre votre code et y ajouter les commentaires comme j'en ai l'habitude.
Pas de soucis. Dites-moi si vous ne comprenez pas.
Pour la continuité de mon fichier, je vais ajouter 12 feuilles, 1 par mois. Pensez_vous qu'il sera possible avant le code actuel d'ajouter du code qui me permettrait de choisir la feuille à traiter ( le mois ) ? c'est la suite que je vais tenter de créer.
Là il faudra que je comprenne, la feuille Donnees_mens va être renommée ou vous allez dupliquer la feuille Donnees_men et la renommer en fonction du mois traité ?
La deuxième option me semble la meilleure par rapport au code.
A voir.
Bonjour
Petit souci avec le code.
Sur l'onglet Donnees_Mens, ça recopie sur toutes les lignes la 1 ére ligne de l'onglet MesDonnees
Je crois avoir compris le code:
.Cells(i, 23) = Ongl1.Range("C" & lig1)
pour moi, signifie données de ongl1 (MesDonnées) la ligne (lig1) colonne C vva vers i (ligne traitée) colonne 23 (W)
J'ai l'impression qu'il manque un changement de ligne, mais je ne vois pas où
Au final, la feuille Donnees_Mens deviendra Janvier
Merci
J'ai modifié et ça a l'air de fonctionner.
End With
lig1 = lig1 + 1
Next i
Application.ScreenUpdating = True
End Sub
Par contre, je bute sérieusement pour attribuer une variable à la selection d'une combobox
ex: je sélectionne Janvier et je voudrai attribuer Janvier à la variable Mois et à la validation par OK, se rendre directement sur la feuille intitulée Janvier.
Mais je pense que je vais ouvrir un autre sujet pour celui là pour ne pas tout mélanger
J'ai modifié et ça a l'air de fonctionner.
Oui exact; bien vu ! je n'avais pas vérifier mais ce que vous avez fait est correct
Sans quoi le code ne recopie que la première ligne partout. Désolé
Par contre, je bute sérieusement pour attribuer une variable à la selection d'une combobox
ex: je sélectionne Janvier et je voudrai attribuer Janvier à la variable Mois et à la validation par OK, se rendre directement sur la feuille intitulée Janvier.
Votre combobox se trouve où ?
Re,
Une autre idée, en c1 vous mettez une liste de validation avec tous les mois et le choix de C1 mets les mois à jour en colonne A par formule en mettant par exemple A21 = C1, A23 = C1, ...
De la pas besoin de passer avec des USF ou objet combo sur votre feuille.
Seule chose qu'il faudrait faire c'est en D21 et suivante faire en sorte que la date soit adapté par rapport à C1
Du coup chaque changement de mois en C1 mettra la colonne A à jour. Le code lui ira chercher les bonnes données dans la feuille Mesdonnées
Après le bouton "Mise à jour Janvier" peut rester identique pour toutes vos mises à jour
Bonjour Dan
Merci pour vos conseils.
Il est exact qu'il faut éviter de trop compliquer les choses.
<<Une autre idée, en c1 vous mettez une liste de validation>> Sur quelle feuille ?
Vu qu'au final, je désir avoir 1 feuille par mois, je ne sais pas si ça fonctionnera .
Je clos le sujet, qui est résolu ( importer les données)
Pour l'instant, je vais essayer de continuer avec les précieuses aides que j'ai trouvé ici.
Bonne journée
Robert
Bonjour
Sur quelle feuille ?
Sur la feuille Donnees_mens
Vu qu'au final, je désir avoir 1 feuille par mois, je ne sais pas si ça fonctionnera
L'idée est la suivante :
- en cellule C1 de la feuille Donnees_mens, vous mettez une liste de validation qui comprend tous les mois
- Le choix dans cette liste, va adapter la colonne A (qui mentionne les mois) et la date en colonne D (via formules)
- une fois votre mois choisi et la macro est exécutée pour avoir toutes les infos depuis la feuille Mesdonnées
- vous cliquez sur un bouton pour sauvegarder la feuille Donnees_mens dans votre fichier et on la renomme selon le mois choisi
En gros votre feuille Donnees_mens est un modèle que vous renommez selon le mois mentionné en C1. On peut aussi sauver le fichier ou la feuille dans fichier. Là c'est à voir selon ce que vous voulez.
In fine, l'approche est plus simple et vous évitez de compliquer avec des USF
Je vous ai expliqué cela dans mon post précédent
Si intérêt je peux vous guider la dessus
Crdlt
Bonjour
Petit souci de variable.
J'ai renommé ma feuille Donnees_Mens en Janvier et j'ai copié cette même feuille en l'appelant Fevrier.
J'appel la feuille Fevrier par le menu déroulant VBA et me positionne en A1
L'orseque je lance la boucle pour mise à jour des données, j'ai un message d'erreur:
Variable objet ou variable de bloc non définie
La variable est bien déclarée << Ongl2 As Worksheet
J'ai remplacé:
Set Ongl2 = Sheets("Donnees_Mens")
par:
Ongl2 = ActiveSheet.Name
Je ne comprends pas ou ça cloche
Merci pour votre aide
@+
Robert
Sub Boucle1()
Dim Ongl1 As Worksheet, Ongl2 As Worksheet
Dim pligmois2 As Byte, dligmois2 As Byte, i As Byte
Dim dat2 As Date
Dim plage1 As Range
Dim lig1 As Integer
Application.ScreenUpdating = False
Set Ongl1 = Sheets("MesDonnées")
Set Ongl2 = Sheets("Donnees_Mens")Bonjour
j'appel la feuille Fevrier par le menu déroulant VBA et me positionne en A1
Menu déroulant VBA ? c'est à dire ?
Toutes vos macros sont via VBA...
Essayez ceci en remplaçant
Set Ongl2 = Sheets("Donnees_Mens")par
Set Ongl2 = Sheets(activesheet.name)Crdlt
Merci beaucoup
Ça marche impeccable
Heureusement que les pros sont là pour nous aider.
Je vais donc pouvoir ajouter mes 12 feuilles, mensuelles avec le choix de la feuille à traiter par le menu déroulant fait par Sahbo12617 qui fonctionne à merveille. Surtout le dernier code ou nous pouvons cacher certaines feuilles.
Ensuite, sur chaque feuille de chaque mois, j'ai un bouton avec lequel j'active la mise à jour.
C'est dommage que mon fichier sera trop lourd car peut être que certaines personnes auraient bien aimé l'utiliser.
Nous verrons cela quand il sera terminé et vu que les beaux jours arrivent, nous allons commencer à nous intéresser au jardin
Bonne soirée
Robert
re
C'est dommage que mon fichier sera trop lourd car peut être que certaines personnes auraient bien aimé l'utiliser.
Raison pour laquelle je vous avait suggéré de ne pas passer par les USF... ( je suppose que c'est ce que vous avez fait)
Après de dupliquer la feuille Donnees_mens si vous vouliez.
Un autre détail : si vous postez ce fichier, veillez à mentionner qu'il ne fonctionne que sous windows et pas sur excel MAC
Surtout le dernier code ou nous pouvons cacher certaines feuilles.
C'est à dire ?
Le lien du sujet menu déroulant en VBA
Private Sub UserForm_Initialize()
' code de Sahbo12617 Excel_Pratique
' liste des noms de feuilles à ne pas afficher
' séparés par une virgule
Dim aEviter As String
' Feuilles que nous ne voulons pas apparaitre dans le menu déroulant
aEviter = "Maxi_Janvier,Pressions,Graph_vent,Choix,MesDonnées,Alphabet,1"
Dim feuillesEvitees() As String, i As Long
feuillesEvitees = Split(aEviter, ",")
' Création de la liste déroulante
Dim sht As Worksheet, peutAjouter As Boolean
With Me.ComboBox1
' ajout de toutes les feuilles
For Each sht In ThisWorkbook.Worksheets
peutAjouter = True
For i = LBound(feuillesEvitees) To UBound(feuillesEvitees)
peutAjouter = peutAjouter And Not (feuillesEvitees(i) = sht.Name)
Next i
If peutAjouter Then .AddItem sht.Name
Next sht
End With
End Sub
re
Hum... Merci d'utiliser les balises de code quand vous postez un cod. Cliquez sur l'icone </>
Le lien du sujet menu déroulant en VBA
Oui je le connais puisque j'y ai répondu et je vous ai donné la solution par la validation (qui est plus simple)
Ce que j'aurais fait c'est prendre le code de Saboh pour l'initialize et le mien pour la feuille à afficher
NB : vous auriez aussi pu placer une combobox sur la feuille (sans passer par USF donc)
Crdlt