Fusionner des tableaux Excel

Bonjour à tous,

Alors voilà, auriez-vous une idée sur ce que je vais vous demander ?

Toujours sur mon application, on a un PC qui contient toute la base de donnée (excel), ensuite on à 2 tablettes terrain, les applications sont identique, je voudrais savoir comment peut on faire pour que le soir, lorsque les intervenants ont fait leur taf, pouvoir importer dans notre pc bureau ce qu'ils ont fait sans rien écraser mais compléter (fusion) leur donnée. un peu comme un serveur et un client.

On aurait donc InspectionAcrage-TAB-A, InspectionAncrage-TA-B et le pc bureau qui serait InspectionAncrage, un bouton pour faire l'aquisition de leur boulot demandant les fichier à prendre.

J’espère que j'ai bien expliquer ce que je souhaiterais et vous remercie par avance pour me guider dans cette démarche

A bientôt,

Chris

Bonjour à tous,

Je reviens sur mon poste car évidemment, il n'a pas l'air très clair... je vais tacher de faire mieux.

Au bureau, j'ai mon tableau "BDD" qui regroupe toutes les inspections à réaliser

Chaque équipes réalisant le travail sur tablettes, doivent, le soir, mettre leur "BDD" sur une clé (ce qui nous fait 3 BDD a regrouper en une. Car chaque équipe n'as pas fait les même inspection.

Pour cela on fait des copier/coller et on y passe des heures incroyable.

Donc mon but serait d'avoir une "BDD" principale qui s'appelerait "InspectionAncrages", puis les tablettes seraient IA-TAB-A, IA-TAB-B, IA-TAB-C

Ensuite pouvoir avoir une macro sur un bouton qui me permettrait de compléter la BDD bureau avec les fichiers des tablettes (une sorte de mise a jour si vous voyez ce que je veux dire.

J'ai chercher sur le net mais c'est assez confu pour moi.

Je vous remercie par avance

Chris

Hello,

Joins-nous un le fichier source et le fichier de destination (anonymisés) pour qu'on puisse voir ça

Hello

Merci de ta reponse, les fichier sont trop gros a cause des macros, y aurait il une autre solution ?

Merci pour ton aide

Chris

Salut SoumZoum,

Donc j'ai reussi à reduire la taille des fichiers tablette ainsi que le fichier bureau, merci de ton aide ainsi que le forum.

Bonne fin de we à tous

Chris

19ia-tab-b.xlsm (180.02 Ko)
19ia-tab-a.xlsm (229.02 Ko)

Bonjour tout le monde,

Juste un petit up sur ce post pour la fusion

Merci et bonne journée

Chris

Ouhla, j'avais perdu le thread de vue. Je me penche dessus ce soir

Salut SoumZoum ,

Ok, ça marche, merci pour ton aide...

Bonne soirée et bon courage

Chris

Alors alors

Option Explicit

Sub aa()

Dim Wb(2) As Workbook
Dim F(2) As Worksheet
Dim Plage As Range
Dim lC As Integer, lR As Integer, Result As Integer, K As Integer, J As Integer, n As Integer
Dim oRng As Variant
Dim wbi(2) As String

Set F(0) = ActiveSheet

wbi(1) = "C:\Users\Thomas\Downloads\IA-tab_A.xlsm"
wbi(2) = "C:\Users\Thomas\Downloads\IA-tab_B.xlsm"

For n = 1 To 2
Set Wb(n) = Workbooks.Open(wbi(n))
Set F(n) = Wb(n).Sheets("BDD")

lR = Range("A65536").End(xlUp).Row
lC = Range("DZ2").End(xlToLeft).Column

oRng = Range(Cells(1, 1), Cells(lR, lC)).Value
F(0).Activate
Set Plage = Range(Cells(1, 1), Cells(lR, lC))

    For K = 1 To UBound(oRng, 1)
        For J = 10 To UBound(oRng, 2)
            If CStr(Plage(K, J)) <> CStr(oRng(K, J)) Then
                If Plage(K, J) <> "" Then
                    Plage(K, J).Activate
                    Result = MsgBox("La cellule de destination " & Plage(K, J).Address & " n'est pas vide." & vbCrLf & "Cliquez sur ""OK"" pour écraser la cellule de destination" & vbCrLf & "Cliquez sur ""Annuler"" pour ignorer la ligne", vbOKCancel, "Conflit")

                    Select Case Result
                        Case Is = 2
                            MsgBox "La ligne a été ignorée"
                            GoTo Next_K
                        Case Is = 1
                            MsgBox "La ligne va bien être écrasée"
                            GoTo Overwrite
                        End Select
                    Else
Overwrite:            Plage(K, J).Value = oRng(K, J)
                End If
            End If
        Next
Next_K: Next K

Wb(n).Close False
Next n
End Sub

C'est un premier jet.

Quelques questions :

1) une fois l'importation faite, les données sources sont-elles supprimées ? Doivent-elles l'être ?

2) En cas de conflit, tu veux une option par défaut ? Overwrite - ignorer ?

3) Y'a-t-il une infime possibilité que deux techniciens remplissent les mêmes lignes ?

Voila voila. Juste à régler ces petits soucis et j'pense qu'on devrait être pas trop mals.

Penser à faire un back-up avant de tester le code (au cas où)

EDIT : D'accord, en fait c'est simplement un problème de cohérence et de standardisation. 9 et 009, 8 et 008, etc...

C'est une erreur ou deux refs différentes ?

Salut SoumZoum,

Je suis sur le point de tester le code que tu m'as fais, mais je vais répondre a tes questions :

1) une fois l'importation faite, les données sources sont-elles supprimées ? Doivent-elles l'être ?

Non on garde les données source au cas ou... on ne sait jamais

2) En cas de conflit, tu veux une option par défaut ? Overwrite - ignorer ?

Si on a possibilité d'avoir une vue de ce qui est en conflit (genre listbox multicolonne), alors oui je veux bien, ça peut être utile.

3) Y'a-t-il une infime possibilité que deux techniciens remplissent les mêmes lignes ?

Théoriquement non, il partent chacun avec des OI différents, cependant certains défauts peuvent être revisité, ce qui est le cas si on fait des constats. Je cherche d'ailleurs une solution pour qu'on puisse avoir une trace de la revisite.

Voilà, en attendant je vais tester ton code pour la fusion, crois tu que par la suite je puisse passer par un USF avec treeview ou listbox, qui m'affiche le contenu du dossier contenant les fichiers tablettes, puis suivant la sélection, la l'import se fait ?

Merci pour ton aide, je te souhaite une bon we,

Chris

Hello,

Pas de soucis, essaie et reviens vers moi

Yep c'est sûrement possible de faire l'USF, si le code te convient je me pencherais la-dessus.

Pense bien à modifier le chemin des fichiers source (wbi(n) = ) pour qu'ils correspondent à ton environnement.

En ce qui concerne la non-purge des données sources, je pense que tu devrais quand même penser à le faire régulièrement - si tu ne le fais pas déjà. Par exemple, un backup (bi)hebdomadaire (IA-Tab-S[N° semaine]) avec génération d'un nouveau fichier. Ca permettra à tes gars de pouvoir le renseigner plus facilement, en le gardant light, et éventuellement de pouvoir d'un coup d’œil savoir quelle équipe a fait combien d'interventions telle semaine. Mais là, on s'éloigne de VBA, c'est juste une proposition au passage

Enfin, pour les "revisites", rajouter une colonne avec un numéro unique correspondant à la ligne (donc, à l'intervention), une clé primaire en somme. Comme ça, peu importe le nombre d'OI similaires !

Thomas

Salut SoumZoum,

Donc je viens de tester ton code, c'est pas mal du tout, mais :

Si les 2 fichiers s'importe en meme temps, y a un soucis, ex :

Si dans IA-tab_A, la premiere ligne est rempli, et que dans IA-tab_B elle ne l'est pas, alors dans la bdd principale elle s'efface du coup.

Je vois aussi qu'il y a une confirmation a chaque colonne, crois tu qu'on pourrais ce baser à une colonne de référence, la date par exemple ("CA"), et que si celle ci est différente, alors une nouvelle ligne ce créé avec les nouvelles infos. Ou une autre idée est la bienvenue.

Ensuite je viens de lire ton dernier poste, effectivement le backup est une super idée, puis :

Enfin, pour les "revisites", rajouter une colonne avec un numéro unique correspondant à la ligne (donc, à l'intervention), une clé primaire en somme. Comme ça, peu importe le nombre d'OI similaires !

Carrément, a condition que la colonne se trouve vers les "DA", les autres sont requise.

J'ai commencé a faire l'USF pour le choix du fichier a importer, voici le code :

Private Sub UserForm_Initialize()

Dim rep As String
    rep = Environ("USERPROFILE") & "\"
    folderpass = rep & "Desktop\Pour le forum\"
    nf = Dir(folderpass)

Do While nf <> ""
Me.ListBox1.AddItem nf
nf = Dir
Loop
End Sub

Voilà,

En attendant merci beaucoup pour ton investissement,

A bientôt

Chris

Un petit saut en passant ; j'ai bien vu tes remarques, je reviens vers toi en fin de semaine

Salut,

Ok ça marche,

Merci

Chris

Hello,

Je me suis mis sur ton fichier hier, j'ai résolu le premier problème (le fait que le fichier n+1 efface les données récupérées dans le fichier n).

Je vois aussi qu'il y a une confirmation a chaque colonne, crois tu qu'on pourrais ce baser à une colonne de référence, la date par exemple ("CA"), et que si celle ci est différente, alors une nouvelle ligne ce créé avec les nouvelles infos. Ou une autre idée est la bienvenue.

Ca serait bien plus pratique effectivement. A toi de définir la colonne de référence ! Une colonne qui serait forcément remplie lors d'une inter, et forcément vide si l'inter n'a pas été faite. Tu y réfléchis et tu me dis ça

Une chose très importante par contre. Si tu ne veux pas être emmerdé par des dizaines de confirmation d'overwrite à effectuer, il faut que tu standardises ta saisie, soit par des instructions données aux utilisateurs, soit par un contrôle de saisie.

Tu as des dates en dd/mm/yyyy, d'autres en m/d/yyyy ; des chiffres en "000n", d'autres en "n", etc.. et forcément, le prog ne comprend pas qu'il s'agit de la même chose.

Une autre solution serait de vérifier le format à chaque différence, mais ça alourdirait pas mal le code.

Sinon, pourras-tu me renvoyer les fichiers une fois standardisés ? Ou tout du moins, l'USF permettant de choisir le fichier source.

Le backup et les numéros auto, pas de soucis

Et enfin (il en faut bien un ^^), pour l'investissement, "aide et tu seras aidé ; sois aidé et tu aideras"

Thomas

Salut SoumZoum,

Après plusieurs idées et réunion, j'ai une solution qui pourrais surement avantager la chose, je t'explique :

Toujours dans le concept BDD bureau et BDD tablette (IA-tab_A) etc... , je me suis dis, pourquoi faire compliquer quand on peu faire simple ?

Si nous, au bureau, on commence sur une BDD vide, ET, que les tablette ELLE on la BDD renseignée, la fusion serait plus simple, donc mon idée est :

Sur les tablette, ils font le boulot, a la fin, ils exportent leur données de la journées en fonction de la date stockée en colonne "CA" de type JJ/MM/AAAA, les cellules ont un format date, et la date elle, est donnée via un label sur l'USF, donc à chaque validation, la date est enregistrée en "CA", ensuite les fichiers exportés seront nommés "IA-tab-A-[DATE]" ou "IA-tab_B-[DATE]".

Ce qui veux dire, qu'on ne risque pas l'écrasement de donnée, et que si la date est différente, une nouvelle ligne est créée (dans le cas d'un défaut revisité). Je te prépare un fichier anonymisé et reviens vers toi.

En attendant, que penses-tu de cette idée ?

Merci à toi et à bientôt

Chris

Re bonjour

Donc voilà, j'ai préparé les fichiers, quelques détails :

Dans le fichier "InspectionAncrage", dans l'onglet "OUTILS INSPECTIONS", il y a un bouton "Importer inspections", sont code se trouve dans le module 2, c'est le sub import (control as IRibboncontrol). Son USF est faite.

Dans les fichier (IA-tab_A) ou l'autre, dans le même onglet, il y a un bouton "Exporter inspection", son sub est également dans le module 2, c'est le sub export (control as IRibboncontrol)

Sur mon pc, sur le bureau... un dossier nommé "Pour le forum", dedans, un dossier nommé "Import" ou dedans se trouve les fichiers tablette, puis, à la racine du dossier "Pour le forum", le fichier "InspectionAncrage".

Voilà tout, j'espère que je suis assez clair dans tout ce bazzare

Merci à toi

chris

12ia-tab-a.xlsm (230.06 Ko)
9ia-tab-b.xlsm (229.84 Ko)

C'est fou ça, je savais pas qu'on pouvait perso le ruban à ce point On en apprend tous les jours

Et c'était exactement ce dont j'avais besoin

Alors, laisse moi résumer pour être sûr d'avoir bien compris.

Le fichier de destination, votre BDD du bureau, est vide (à l'exception des intitulés de colonnes).

Les fichiers de tes gars, quant à eux, contiennent en début de journée une liste d'interventions à faire (dans la journée ou non). En fin de journée, on retrouve donc à la fois des interventions réalisées et des interventions non-réalisées.

Le critère permettant de savoir si l'intervention a été réalisé est la colonne "CA". Si elle est renseignée, alors l'intervention a été réalisée.

Partant de là, chaque soir, leurs fichiers seront mis à disposition pour importation. Seules les interventions réalisées dont la date -- renseignée en colonne CA -- correspond à la date voulue (celle du jour ? une date saisie dans un USF ?).

Si c'est bien ça, et vu que tu m'as demandé mon avis ^^ Je serais pour une purge des données importées (avec backup bien sûr )

Je n'ai pas compris l'histoire de la date différente pour la revisite :/

Bon, du coup une autre proposition (en espérant que j'ai bien compris !). Ca me frustre un peu, la macro est plutôt gourmande à cause du format à importer. Mais elle fait le job, au moins.

Option Explicit

Sub fusion()

    Dim Wb(2) As Workbook
    Dim F(2) As Worksheet
    Dim lc(1) As Integer, lR(1) As Integer, K As Integer, J As Integer, n As Integer
    Dim wbi(2) As String, rep As String

    rep = Environ("USERPROFILE") & "\"

'wbi(1) = rep & "Desktop\Pour le forum\IA-tab_A.xlsm"
'wbi(2) = rep & "Desktop\Pour le forum\IA-tab_B.xlsm"

    Application.ScreenUpdating = False 'On désactive la MaJ de l'écran ainsi que le calcul auto pour ne pas bouffer les ressources. La copie du format étant déjà assez lourde.
    Application.Calculation = xlCalculationManual

    Set F(0) = ThisWorkbook.Sheets("BDD") 'On affecte la feuille de destination à la variable F(0)

    wbi(1) = rep & "\Downloads\IA-tab_A (1).xlsm" 'On définit les chemins d'accès aux inputs
    wbi(2) = rep & "\Downloads\IA-tab_B (1).xlsm"

    For n = 1 To 2 'On boucle sur les deux inputs
        Set Wb(n) = Workbooks.Open(wbi(n)) 'On ouvre le classeur et on l'affecte à Wb(n)
        Set F(n) = Wb(n).Sheets("BDD") 'On affecte les deux feuilles inputs concernées

            lR(1) = F(n).UsedRange.Rows.Count 'On calcule la dernière ligne non-vide de l'input actif.
                                              'Variable importante car elle va nous permettre de "boucler" sur les lignes de l'output
            lc(1) = F(n).UsedRange.Rows.Count 'On calcule la dernière colonne non-vide de l'input actif

            lR(0) = F(0).UsedRange.Rows.Count 'On calcule la dernière ligne non-vide de la feuille de destination
            lc(0) = F(0).UsedRange.Columns.Count 'On calcule la dernière colonne non-vide de la feuille de destination

        For K = 4 To lR(1) 'On boucle sur les cellules de l'input omelettant les intitulés.
            If CLng(CDate(F(n).Cells(K, 79)) = CLng(CDate(DateSerial(Year(Now), Month(Now), Day(5))))) Then 'Si la cellule en colonne CA de l'input correspond à la date [du 4/8/2015 dans l'exemple] alors
            'NB : Remplacer l'expression DateSerial par Date pour prendre la date du jour comme Ref
                For J = 1 To lc(1) 'On boucle sur les colonnes, de l'input et de l'output

                    F(0).Cells(lR(0) + 1, J) = F(n).Cells(K, J) 'Cellule de destination = Cellule source
                    F(n).Cells(K, J).Copy 'On copie la cellule source
                    F(0).Cells(lR(0) + 1, J).PasteSpecial (xlFormats) 'On colle le format sur la cellule de destination
                Next J ' on passe à la colonne d'input et d'output suivante

                lR(0) = F(0).UsedRange.Rows.Count 'On recalcule le lR pour ne pas copier 1000 cellules sur la pauvre ligne 3 (:

            End If 'Fin de condition (Si date = ...)

        Next K 'On passe à la ligne d'input suivante

        Wb(n).Close False 'On quitte l'input sans sauvegarder
    Next n 'On passe à l'input suivant

    Application.ScreenUpdating = True 'On réactive les fonctions
    Application.Calculation = xlCalculationAutomatic 'On réactive les fonctions

    F(0).Sort.SortFields.Add Key:=Range("CA" & 4 & ":CA" & lR(1)) 'On trie la feuille de destination selon la date en CA

End Sub

Ensuite, je me suis permis une petite optimisation sur 2/3 sub qui me sont passées sous les yeux :

'Callback for CheckBox1 onAction
Sub typescelmasq(control As IRibbonControl, pressed As Boolean)

   Debug.Print "Bouton : " & control.ID
Debug.Print "pressed = " & pressed

'On regarde ce que vaut control.ID ....
If control.ID = "msqcol1" Then
     Debug.Print "bouton msqcol1"

     For J = 48 To 68
        Sheets("BDD").Columns(J).Hidden = pressed
     Next
End If
End Sub
'Callback for CheckBox2 onAction
Sub typechevmasq(control As IRibbonControl, pressed As Boolean)
Debug.Print "Bouton : " & control.ID
Debug.Print "pressed = " & pressed

'On regarde ce que vaux control.ID
If control.ID = "msqcol2" Then
     Debug.Print "bouton msqcol2"

     For J = 44 To 47
        Sheets("BDD").Columns(J).Hidden = pressed
     Next
'Else
    'Debug.Print "Autre bouton"

End If
End Sub
'Callback for CheckBox1 onAction
Sub affichconstat(control As IRibbonControl, pressed As Boolean)

   Debug.Print "Bouton : " & control.ID
Debug.Print "pressed = " & pressed

'On regarde ce que vaut control.ID ....
If control.ID = "msqcol3" Then
     Debug.Print "bouton msqcol1"
     For J = 22 To 68
        Sheets("BDD").Columns(J).Hidden = pressed
     Next
End If
End Sub
Rechercher des sujets similaires à "fusionner tableaux"