Automatiser envoie de données

5classeur-1.xlsm (168.83 Ko)
2classeur-2.xlsx (37.27 Ko)

Bonjour,

j'ai un classeur Excel qui renferme plusieurs colonnes de données (une feuille par jour): classeur 1

je veux extraire dans un rapport quelques données de ce classeur si au jour j le colonne T du classeur 1 source renferme des cellules non vides

ces dernières seront envoyées vers un classeur 2

voici la correspondance entre classeur 1 et classeur 2

classeur 1 source -------->classeur 2 rapport (cible)

la date du jour j (nom de feuille)--------> colonne B

colonne B --------> colonne C

colonne C -------->colonne D

D -------->E

T -------->H

W--------> J

et ce en balayant toutes les feuilles du classeur source (les jours d'une année)

ci joint un model de mes classeurs

merci de m'aider pour automatiser un travail manuel qui demandera bcp de temps

merci beaucoup

bien cordialement

Salut Safach,

si je comprends bien, chaque jour (à l'ouverture du fichier ou en sortie ?), il faut parcourir toutes les feuilles jusqu'à la date du jour (y compris, je suppose) pour extraire quelques cellules de chaque ligne dont la colonne [T:T] n'est pas vide pour ensuite les coller (en ayant effacé les données existantes du fichier 2 -ce qui serait logique- ou en les mettant à la suite ?) dans le fichier 2 !?

365 feuilles là où 2-3 suffiraient !? Woaw ! Bonjour les yeux...
C'est imposé ?


A+

Bonjour,

merci de votre retour!

oui vous avez compris le scénario que je souhaite automatiser pour ne pas être obligée de le faire manuellement

à l'ouverture du fichier oui, peut être, et ça doit écraser logiquement à chaque fois les données envoyés précédemment

pour avoir enfin un rapport exhaustif sans doublons

est ce faisable sil vous plait

merci de votre aide

bien cordialement

Salut Safach,

voivi ton fichier, à tester sur une copie de tes fichiers, bien sûr.
La macro.démarre à l'ouverture du fichier.

Private Sub Workbook_Open()
'
Dim tTab, tExtract(), iIdx%, sSheet$
'
Application.ScreenUpdating = False
'
For x = Sheets.Count To 3 Step -1
    If CDate(Sheets(x).Name) < Date Then
        With Sheets(x)
            sSheet = Sheets(x).Name
            tTab = .Range("A9:W" & .Range("A" & Rows.Count).End(xlUp).Row).Value
            For y = 1 To UBound(tTab, 1)
                If tTab(y, 20) = "" Then _
                    iIdx = iIdx + 1: _
                    ReDim Preserve tExtract(9, iIdx): _
                    tExtract(0, iIdx - 1) = CDate(sSheet): _
                    tExtract(1, iIdx - 1) = tTab(y, 2): _
                    tExtract(2, iIdx - 1) = tTab(y, 3): _
                    tExtract(3, iIdx - 1) = tTab(y, 4): _
                    tExtract(7, iIdx - 1) = tTab(y, 20): _
                    tExtract(9, iIdx - 1) = tTab(y, 23)
            Next
        End With
    End If
Next
'
On Error Resume Next
If Not Workbooks("Safach-2") Is Nothing Then Set sWBk = Workbooks.Open(ThisWorkbook.Path & "\" & "Safach-2.xlsx")
If Not sWBk Is Nothing Then
    With sWBk.Sheets(1)
        .Range("B7:K" & .Range("B" & Rows.Count).End(xlUp).Row + 1).Value = ""
        .Range("B7").Resize(iIdx, 10).Value = WorksheetFunction.Transpose(tExtract)
    End With
End If
On Error GoTo 0
'
End Sub

Petit plus pour la route :
- pour créer une nouvelle feuille, ton USF2 te propose d'office la date de la 3e feuille + 1 jour et vérifie que la valeur encodée est bien une date ;
- le format de la date est immédiatement le bon (dd-mm-yyyy) : plus besoin de vérifier...

Private Sub UserForm_Activate()
'
ladate = DateAdd("d", 1, CDate(Sheets(3).Name))
'
End Sub

J'ai nommé tes fichiers "Safach-1" et "Safach-2" : à toit à modifier cela après les tests.

5safach-1.xlsm (194.63 Ko)
3safach-2.xlsx (37.77 Ko)


A+

Bonjour,

merci de votre aide!

en fait j'ai testé les fichiers en saisissant une seule donnée à envoyer mais ça me retourne plusieurs dates sans aucunes autres données

est ce que vous avez fixé la condition d'envoi de données que si les cellules du colonnes T sont non vides ? càd ils existent des pièces NC

puis en remplissant cette condition on va extraire les données des lignes concernées à la date considérée

jusqu'à balayage du classeur

comment rectifier cela

merci encore de votre effort

bien cordialement

Salut Safach,

déso, erreur dans cette ligne

If tTab(y, 20) = "" Then _

Plutôt ceci...

If tTab(y, 20) <> "" Then _


A+

Rebonjour,

alors j'ai testé le fichier et ça ne donne pas les données exactes

si la condition était : si les cellules de T9 jusqu'à T22 sont non vides alors enregistrer la date du nom de la feuille dans B ainsi de suite les autres données de chaque ligne remplissant cette condition

et non pas la totalité du colonne T

aussi j'ai remarqué que le nombre du colonne T est envoyé au colonne I pas H du classeur 2

voir cet exemple de simulation à la feuille 06-08-2021 et le résultat que donne la macro au fichier 2

merci de m'aider

bien cordialement

1safach-1.xlsm (196.40 Ko)
0safach-2.xlsx (37.78 Ko)

Salut Safach,

à part ainsi, je ne vois pas trop quoi faire...
Ici, j'ai inclus la date du jour..

If CDate(Sheets(x).Name) <= Date Then

... si tu préfères l'exclure :

If CDate(Sheets(x).Name) < Date Then
2safach-1.xlsm (193.41 Ko)


A+

Bonjour,

merci beaucoup ça fonctionne maintenant mais je souhaite effectuer ces 3 opérations

ajouter à la condition de la cellule T non vide quelle soit différente de zéro et ne contenant pas du texte (pour n'extraire que les nombres saisis)

arrêter de visualiser les fenêtres qui s'affichent à l'ouverture du fichier source

et finalement affecter cette macro à un double clic d'une cellule, par exemple A7 de la feuille "MODELE" au lieu de lancer la macro à l'ouverture du fichier source

merci beaucoup Curulis de votre aide et effort !

bien cordialement

Salut Safach,

- pour démarrer la macro, double-clic, soit :
* en ligne 8 de chaque feuille (les en-têtes) ;
* sur la cellule "PIECE NC" de chaque feuille.

'If Not Intersect(Target, Sh.Rows(8)) Is Nothing Then
If Trim(UCase(Target)) = "PIECES NC" Then

À toi de choisir ce que tu préfères...
- prise en compte de [T:T] selon tes critères

                    If IsNumeric(tTab(y, 20)) Then _
                        If CInt(tTab(y, 20)) <> 0 Then _

- pas bien compris ta 3e demande, aussi je sauve "Safach-2" et le ferme = pas d'affichage de "Safach-2

sWBk.Close savechanges:=True
4safach-1.xlsm (195.81 Ko)


A+

je vous remercie infiniment de votre aide!

bonne journée

Rechercher des sujets similaires à "automatiser envoie donnees"