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 Sub

J'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 Sub

Cordialement

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

https://forum.excel-pratique.com/excel/attribuer-une-variable-a-un-nom-de-feuille-selectionnee-sur-u...

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

Rechercher des sujets similaires à "transferer donnees fichier meteo"