Copier et mise à jour de données d'un tableau vers un autre tableau

Merci Dan,

Cela fonction très bien.

Je comprends mieux l’intérêt d'écrire 2 codes séparés mais exécutés a la suite du code principal avec le code Call importation_suivi.

Encore un grand merci.

je vais continuer d'avancer dans mon projet.

Cordialement

David

Point 1 : ok parfait.
Point 2 :

2) Macro appartenant au fichier Suivi outillages.
Elle doit importer et mettre à jour les infos des colonnes A à U , X, AJ, AB, AC et AD du fichier "Gestion" dans le fichier "Suivi outillages"

Pour ce point, j'ai une question. Est-ce que lors de la mise à jour du fichier Suivi, le code doit aussi importer les nouvelles lignes depuis le fichier gestion ou simplement mettre à jour ?
Cette question car vous pourriez avoir de nouvelles lignes dans le fichier gestion et qui ne seraient pas dans le fichier suivi

Votre avis

Crdlt

Bonjour,

Oui, le code doit aussi importer les nouvelles lignes depuis le fichier gestion et mettre à jour.

Le code fonctionne bien.

Sub Importation_Donnees()

Dim F_GODP  As String ' Variable pour définir le classeur source
Dim tbSource As ListObject, tbDest As ListObject ' Variable pour définir le tableau source et le tableau de destination

'on bloque l'ecran
Application.ScreenUpdating = False

' Chemin du classeur "Gestion" F_GODP = Fichier Gestion ODP
F_GODP = "C:\Users\apalo\Desktop\ODP\Gestion.xlsm"

' Ouvrir le classeur "Demandes outillages"
Workbooks.Open Filename:=F_GODP

Set tbSource = Workbooks("Gestion.xlsm").Sheets("Charge").ListObjects(1) ' Tableau source du classeur "Gestion" de la feuille "Charge"
Set tbDest = ThisWorkbook.Sheets("Avancement outillages").ListObjects(1) ' Tableau de destination de la feuille "Avancement outillages" du classeur "Suivi outillages"

tbSource.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "Demandes outillages"
tbDest.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "CHARGE"

Dim i As Integer, lig As Integer
Dim j As Byte

    For i = 1 To tbSource.ListRows.Count

        On Error Resume Next
        lig = WorksheetFunction.Match(tbSource.DataBodyRange(i, 1).Value, tbDest.ListColumns(1).DataBodyRange.Value, 0)
        If lig > 0 Then 'cas mise a jour de donnees si existantes en feuille Avancement outillages

            With tbDest.DataBodyRange
                For j = 3 To 22 'remise a jour des colonnes C a V
                    .Item(lig, j) = tbSource.DataBodyRange(i, j).Value ' Mise à jour des données des colonnes C a V
                    .Item(lig, 23) = tbSource.DataBodyRange(i, 24).Value 'Date butoire
                    .Item(lig, 24) = tbSource.DataBodyRange(i, 38).Value 'Suivid'avancement
                    .Item(lig, 25) = tbSource.DataBodyRange(i, 28).Value 'Prio ODP
                    .Item(lig, 26) = tbSource.DataBodyRange(i, 29).Value 'Statut
                    .Item(lig, 27) = tbSource.DataBodyRange(i, 30).Value 'Ressource
                Next j
            End With

        Else: 'cas ajout ligne de donnees si non existantes en feuille Charge
            With tbDest
                If .ListRows.Count = 0 Then
                    .ListRows.Add: lig = 1
                Else: .ListRows.Add: lig = .ListRows.Count
                End If
                With .DataBodyRange
                    For j = 1 To 22 'ajout nouvelles donnees des colonnes A a V
                        .Item(lig, j) = tbSource.DataBodyRange(i, j).Value 'ajoute des donnees colonnes A a V
                        .Item(lig, 23) = tbSource.DataBodyRange(i, 24).Value 'Date butoire
                        .Item(lig, 24) = tbSource.DataBodyRange(i, 38).Value 'Suivid'avancement
                        .Item(lig, 25) = tbSource.DataBodyRange(i, 28).Value 'Prio ODP
                        .Item(lig, 26) = tbSource.DataBodyRange(i, 29).Value 'Statut
                        .Item(lig, 27) = tbSource.DataBodyRange(i, 30).Value 'Ressource
                    Next j
                End With
            End With
        End If
        On Error GoTo 0
        lig = 0
    Next i

'Fermer le fichier "Gestion" sans l'enregistrer
Workbooks("Gestion.xlsm").Close savechanges:=False
End Sub

J'ai une question:

Est-ce que l’exécution des différents codes ne risque pas d'être long quand j'aurai un fichier de plus de 1000 lignes ?

est-ce qu'il y a un moyen de le rendre plus rapide ?

Bonjour,

Dans le fichier des demandes, j'ai créé une macro permettant d'insérer une nouvelle ligne.

Le problème, elle est est longue à l'exécution.

Voici le code que j'ai écrit.

Avez-vous une idée du problème?

Sub nouvelles_demandes()

Dim ligne As Integer 'Déclaration de la variable "ligne"

Call Annulation_des_filtres 'Exécution du code "Sub Annulation_des_Filtres()

With Sheets("Demandes outillages").ListObjects("TBD_OUT")
If pos = 0 Then
    .ListRows.Add
    ligne = .ListRows.Count + 1
    Else
    ligne = pos
    End If
    .Range.Cells(.ListRows.Count + 1, 1) = Array("=R[-1]C+1")
    .Range.Cells(.ListRows.Count + 1, 2) = Date
    .Range.Cells(.ListRows.Count + 1, 13) = 0
    .Range.Cells(.ListRows.Count + 1, 16) = "Non"
    .Range.Cells(.ListRows.Count + 1, 17) = "Non"
    .Range.Cells(.ListRows.Count + 1, 12) = Date + 90

End With
pos = 0
' Se placer sur la dernière cellule vide du tableau dans la colonne E
Range("C" & Rows.Count).End(xlUp).Offset(0, 0).Select

End Sub

Sub Annulation_des_filtres()

Set tbndo = ThisWorkbook.Sheets("Demandes outillages").ListObjects(1)
tbndo.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "de la feuille Demandes outillages"

End Sub
 

Bonsoir

Oui, le code doit aussi importer les nouvelles lignes depuis le fichier gestion et mettre à jour.

Le code fonctionne bien

Ce code doit aller dans le fichier Demande outillages ?

Cela fonctionne bien mais vous faites une erreur. Mettez ces lignes entre le NEXT J et le END WITH et pas dans la boucle

.Item(lig, 23) = tbSource.DataBodyRange(i, 24).Value 'Date butoire
.Item(lig, 24) = tbSource.DataBodyRange(i, 38).Value 'Suivid'avancement
.Item(lig, 25) = tbSource.DataBodyRange(i, 28).Value 'Prio ODP
.Item(lig, 26) = tbSource.DataBodyRange(i, 29).Value 'Statut
.Item(lig, 27) = tbSource.DataBodyRange(i, 30).Value 'Ressource

Même chose plus bas dans le ELSE

Il n'y a pas de variable j dans ces lignes, du coup vous exécuter 20 fois la même chose inutilement et sans apporter un changement.


Est-ce que l’exécution des différents codes ne risque pas d'être long quand j'aurai un fichier de plus de 1000 lignes ?
est-ce qu'il y a un moyen de le rendre plus rapide ?

Vous n'aurez pas de soucis. Déjà vous n'avez de formules et vos tableaux sont au format structuré. Et de plus pas de liens entre fichier
D'autre part de ce que j'ai pu constater avec les années, j'ai parfois constaté qu'excel ralentissait lors que l'on dépassait 2500 lignes. A voir si aujourd'hui les nouvelles versions posent toujours le même souci.


Dans le fichier des demandes, j'ai créé une macro permettant d'insérer une nouvelle ligne.

Ce n'est pas vraiment comme cela. Je regarderai mais cela concerne quel fichier?


Il reste l'importation dans le fichier suivi non ?

J'ai fais évoluer les différents fichiers.

Voici les codes du fichier "Demandes outillages"

1er code.

il permet de créer d'une nouvelle demande. Il fonction mais pas sur qu'il soit bien structuré.

Sub nouvelles_demandes()

Dim ligne As Integer 'Déclaration de la variable "ligne"

Call Annulation_des_filtres 'Exécution du code "Sub Annulation_des_Filtres()

With Sheets("Demandes outillages").ListObjects("TBD_OUT")
If pos = 0 Then
    .ListRows.Add
    ligne = .ListRows.Count + 1
    Else
    ligne = pos
    End If
    .Range.Cells(.ListRows.Count + 1, 1) = Array("=R[-1]C+1")
    .Range.Cells(.ListRows.Count + 1, 2) = Date
    .Range.Cells(.ListRows.Count + 1, 13) = 0
    .Range.Cells(.ListRows.Count + 1, 16) = "Non"
    .Range.Cells(.ListRows.Count + 1, 17) = "Non"
    .Range.Cells(.ListRows.Count + 1, 12) = Date + 90

End With
pos = 0
' Se placer sur la dernière cellule vide du tableau dans la colonne E
Range("C" & Rows.Count).End(xlUp).Offset(0, 0).Select

End Sub

-------------------------------------------------

Sub Annulation_des_filtres()

Set tbndo = ThisWorkbook.Sheets("Demandes outillages").ListObjects(1)
tbndo.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "de la feuille Demandes outillages"

End Sub

2éme code toujours dans le fichier "Demandes outillages".

Il permet d'importer les données depuis le fichier "Gestion". (Il actualise les données dès l'ouverture du fichier).

Sub Auto_open()
Dim F_ODP As String
Dim tbSource As ListObject, tbDest As ListObject
Dim fichier As String

'on bloque l'ecran
Application.ScreenUpdating = False

fichier = "Gestion.xlsm"
F_ODP = "C:\Users\apalo\Desktop\ODP\" & fichier ' Chemin du classeur "Suivi outillage"

' Ouvrir le classeur "Suivi outillages"
Workbooks.Open Filename:=F_ODP

Set tbDest = ThisWorkbook.Sheets("Demandes outillages").ListObjects(1)
Set tbSource = Workbooks(fichier).Sheets("Charge").ListObjects(1)

tbSource.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "Demandes outillages"
tbDest.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "CHARGE"

Dim i As Integer, lig As Integer

For i = 1 To tbSource.ListRows.Count

    On Error Resume Next 'gestion erreur sur variable lig
    lig = WorksheetFunction.Match(tbSource.DataBodyRange(i, 1).Value, tbDest.ListColumns(1).DataBodyRange.Value, 0)

    If lig > 0 Then 'cas mise a jour de donnees si numero identification est dans le fichier suivi outillage
    With tbDest.DataBodyRange
            .Item(lig, 20) = tbSource.DataBodyRange(i, 39).Value 'Ressource 
            .Item(lig, 21) = tbSource.DataBodyRange(i, 27).Value 'IDG outillages
            .Item(lig, 22) = tbSource.DataBodyRange(i, 28).Value 'Fournisseur
            .Item(lig, 23) = tbSource.DataBodyRange(i, 29).Value 'Prix d'achat
            .Item(lig, 24) = tbSource.DataBodyRange(i, 36).Value 'Etat d'avancement
            .Item(lig, 25) = tbSource.DataBodyRange(i, 38).Value 'Statut
        End With
    End If
    On Error GoTo 0
    lig = 0 'remettre variable à 0
Next i
'Fermer le fichier "Gestion" sans enregistrer
Workbooks(fichier).Close savechanges:=True
End Sub

------------------------------------------------------------------------------------------------------------

Voici les codes du fichier "Gestion"

1er code.

il permet d'importer les données du fichier " Demandes outillages" et quelques données du fichier "suivi outillages"

Sub Importation_Demandes()

Dim F_DO  As String
Dim tbSource As ListObject, tbDest As ListObject

'on bloque l'ecran
Application.ScreenUpdating = False

' Chemin du classeur "Demande outillage"
F_DO = "C:\Users\apalo\Desktop\ODP\Demandes outillages.xlsm"

' Ouvrir le classeur "Demandes outillages"
Workbooks.Open Filename:=F_DO

Set tbSource = Workbooks("Demandes outillages.xlsm").Sheets("Demandes outillages").ListObjects(1)
Set tbDest = ThisWorkbook.Sheets("Charge").ListObjects(1)

tbSource.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "Demandes outillages"
tbDest.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "CHARGE"

Dim i As Integer, lig As Integer
Dim j As Byte

    For i = 1 To tbSource.ListRows.Count

        On Error Resume Next
        lig = WorksheetFunction.Match(tbSource.DataBodyRange(i, 1).Value, tbDest.ListColumns(1).DataBodyRange.Value, 0)
        If lig > 0 Then 'cas mise a jour de donnees si existantes en feuille Charge

            With tbDest.DataBodyRange
                For j = 3 To 18 'remise a jour des colonnes C a R
                    .Item(lig, j) = tbSource.DataBodyRange(i, j).Value
                Next j
            End With

        Else: 'cas ajout ligne de donnees si non existantes en feuille Charge
            With tbDest
                If .ListRows.Count = 0 Then
                    .ListRows.Add: lig = 1
                Else: .ListRows.Add: lig = .ListRows.Count
                End If
                With .DataBodyRange
                    For j = 1 To 18 'ajout nouvelles donnees des colonnes A a R
                        .Item(lig, j) = tbSource.DataBodyRange(i, j).Value 'ajoute des donnees colonnes A a R
                    Next j
                End With
            End With
        End If
        On Error GoTo 0
        lig = 0
    Next i

'Fermer le fichier "Demandes outillages" sans l'enregistrer
Workbooks("Demandes outillages.xlsm").Close savechanges:=False

Call importation_suivi

End Sub

---------------------------------------------------------

Sub importation_suivi()
Dim F_SO As String
Dim tbSource As ListObject, tbDest As ListObject
Dim fichier As String

'on bloque l'ecran
Application.ScreenUpdating = False

fichier = "Suivi outillages.xlsm"
F_SO = "C:\Users\apalo\Desktop\ODP\" & fichier ' Chemin du classeur "Suivi outillage"
'F_SO = ThisWorkbook.Path & "\" & fichier

' Ouvrir le classeur "Suivi outillages"
Workbooks.Open Filename:=F_SO

Set tbDest = ThisWorkbook.Sheets("CHARGE").ListObjects(1)
Set tbSource = Workbooks(fichier).Sheets("Avancement outillages").ListObjects(1)

tbSource.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "Suivi outillages"
tbDest.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "CHARGE"

Dim i As Integer, lig As Integer

For i = 1 To tbSource.ListRows.Count

    On Error Resume Next 'gestion erreur sur variable lig
    lig = WorksheetFunction.Match(tbSource.DataBodyRange(i, 1).Value, tbDest.ListColumns(1).DataBodyRange.Value, 0)

    If lig > 0 Then 'cas mise a jour de donnees si numero identification est dans le fichier suivi outillage
    With tbDest.DataBodyRange
            .Item(lig, 26) = tbSource.DataBodyRange(i, 28).Value 'Validation de saisie des données
            .Item(lig, 27) = tbSource.DataBodyRange(i, 30).Value 'IDG outillages
            .Item(lig, 36) = tbSource.DataBodyRange(i, 31).Value 'Etat d'avancement
            .Item(lig, 28) = tbSource.DataBodyRange(i, 32).Value 'Fournisseur
            .Item(lig, 29) = tbSource.DataBodyRange(i, 33).Value 'Prix d'achat
            .Item(lig, 30) = tbSource.DataBodyRange(i, 34).Value 'NI
            .Item(lig, 31) = tbSource.DataBodyRange(i, 35).Value 'Date prévue
            .Item(lig, 32) = tbSource.DataBodyRange(i, 29).Value 'Commentaire
        End With
    End If
    On Error GoTo 0
    lig = 0 'remettre variable à 0
Next i
'Fermer le fichier "suivi outillages" et enregistrer
Workbooks(fichier).Close savechanges:=True
End Sub

2ème code.

il annule les filtres lors de la consultation ou autres travail de données à l'aide d'un bouton.

Il fonctionne mais pas sur qu'il soit bien réalisé.

Sub Annulation_des_filtres()

Set tbcharge = ThisWorkbook.Sheets("Charge").ListObjects(1)
tbcharge.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "de la feuille charge"

End Sub

-----------------------------------------------------------------------------------------------------

Voici le code du fichier "Suivi outillages"

il permet d'importer les données du fichier "Gestion"

Sub Importation_Donnees()

Dim F_GODP  As String ' Variable pour définir le classeur source
Dim tbSource As ListObject, tbDest As ListObject ' Variable pour définir le tableau source et le tableau de destination

'on bloque l'ecran
Application.ScreenUpdating = False

' Chemin du classeur "Gestion" F_GODP = Fichier Gestion ODP
F_GODP = "C:\Users\apalo\Desktop\ODP\Gestion.xlsm"

' Ouvrir le classeur "Gestion"
Workbooks.Open Filename:=F_GODP

Set tbSource = Workbooks("Gestion.xlsm").Sheets("Charge").ListObjects(1) ' Tableau source du classeur "Gestion" de la feuille "Charge"
Set tbDest = ThisWorkbook.Sheets("Avancement outillages").ListObjects(1) ' Tableau de destination de la feuille "Avancement outillages" du classeur "Suivi outillages"

tbSource.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "Gestion"
tbDest.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "Avancement outillages"

Dim i As Integer, lig As Integer
Dim j As Byte

    For i = 1 To tbSource.ListRows.Count

        On Error Resume Next
        lig = WorksheetFunction.Match(tbSource.DataBodyRange(i, 1).Value, tbDest.ListColumns(1).DataBodyRange.Value, 0)
        If lig > 0 Then 'cas mise a jour de donnees si existantes en feuille Avancement outillages

            With tbDest.DataBodyRange
                For j = 3 To 22 'remise a jour des colonnes C a V
                    .Item(lig, j) = tbSource.DataBodyRange(i, j).Value ' Mise à jour des données des colonnes C a V
                    .Item(lig, 23) = tbSource.DataBodyRange(i, 24).Value 'Date butoire
                    .Item(lig, 24) = tbSource.DataBodyRange(i, 40).Value 'Suivid'avancement
                    .Item(lig, 25) = tbSource.DataBodyRange(i, 33).Value 'Prio ODP
                    .Item(lig, 26) = tbSource.DataBodyRange(i, 38).Value 'Statut
                    .Item(lig, 27) = tbSource.DataBodyRange(i, 39).Value 'Ressource
                Next j
            End With

        Else: 'cas ajout ligne de donnees si non existantes en feuille Charge
            With tbDest
                If .ListRows.Count = 0 Then
                    .ListRows.Add: lig = 1
                Else: .ListRows.Add: lig = .ListRows.Count
                End If
                With .DataBodyRange
                    For j = 1 To 22 'ajout nouvelles donnees des colonnes A a V
                        .Item(lig, j) = tbSource.DataBodyRange(i, j).Value 'ajoute des donnees colonnes A a V
                        .Item(lig, 23) = tbSource.DataBodyRange(i, 24).Value 'Date butoire
                        .Item(lig, 24) = tbSource.DataBodyRange(i, 40).Value 'Suivid'avancement
                        .Item(lig, 25) = tbSource.DataBodyRange(i, 33).Value 'Prio ODP
                        .Item(lig, 26) = tbSource.DataBodyRange(i, 38).Value 'Statut
                        .Item(lig, 27) = tbSource.DataBodyRange(i, 39).Value 'Ressource
                    Next j
                End With
            End With
        End If
        On Error GoTo 0
        lig = 0
    Next i

'Fermer le fichier "Gestion" sans l'enregistrer
Workbooks("Gestion.xlsm").Close savechanges:=False
End Sub

Bonjour

Voici les codes du fichier "Demandes outillages"
1er code.

Comme écrit hier j'ai regardé. Faites plutôt comme ceci

Sub nouvelles_demandes()
Dim ligne As Integer 'Déclaration de la variable "ligne"
Dim tb As ListObject

Call Annulation_des_filtres 'Exécution du code "Sub Annulation_des_Filtres()

Set tb = Sheets("Demandes outillages").ListObjects("TBD_OUT")
With tb
    If .ListRows.Count = 0 Then
        .ListRows.Add: ligne = 1
    Else: .ListRows.Add: ligne = .ListRows.Count

    End If
    With .DataBodyRange
        .Item(ligne, 1) = WorksheetFunction.Max(tb.ListColumns(1).Range) + 1
        .Item(ligne, 2) = Date
        .Item(ligne, 12) = Date + 90 'ou --> .Item(ligne, 2) + 90
        .Item(ligne, 13) = "Non"
        .Item(ligne, 16) = "Non"
    End With
End With
End Sub

2éme code toujours dans le fichier "Demandes outillages".
Il permet d'importer les données depuis le fichier "Gestion". (Il actualise les données dès l'ouverture du fichier).

Non pour la macro Auto_open. Là ce sont les antiquités d'excel (Excel 2000, 97....)
Aujourd'hui les méthodes employées sont différentes
Faites comme ceci :

- Remplacez Sub Auto-open() par un autre nom. Exemple : Import_donnees (donc Sub Import_donnees())
- ensuite allez dans l'éditeur VBA
- A gauche dans VBA project --> double click sur THISWORKBOOK et mettez ce code

Private Sub Workbook_Open()
Call import_donnees
End Sub

Voici les codes du fichier "Gestion"

1er code : ok
2ème code : ok


Voici le code du fichier "Suivi outillages"

Ce n'est pas bon.
Je vous ai expliqué hier ce qu'il fallait changer et les raisons --> https://forum.excel-pratique.com/s/goto/1163792

Bonsoir DAN,

Je viens de corriger les codes mais, j'ai été contraint de remettre Sub Auto_open() dans le fichier des demandes d'outillages.

Le code fonctionne bien mais depuis le fichier gestion, lorsque je lance la macro importation des demandes, Excel se ferme instantanément.

la macro fonction bien avec Sub Auto_open(). j'ai la version Excel 2016.

J'ai également une autre question concernant la protection de la feuille.

Comment autoriser l'utilisation des filtres auto une fois la protection réactivée ?

Sub nouvelles_demandes()

'enlever la protection de la feuille
    ActiveSheet.Unprotect "mp"

Dim ligne As Integer 'Déclaration de la variable "ligne"
Dim tb As ListObject

Call Annulation_des_filtres 'Exécution du code "Sub Annulation_des_Filtres()

Set tb = Sheets("Demandes outillages").ListObjects("TBD_OUT")
With tb
    If .ListRows.Count = 0 Then
        .ListRows.Add: ligne = 1
    Else: .ListRows.Add: ligne = .ListRows.Count

    End If
    With .DataBodyRange
        .Item(ligne, 1) = WorksheetFunction.Max(tb.ListColumns(1).Range) + 1
        .Item(ligne, 2) = Date
        .Item(ligne, 12) = Date + 90 'ou --> .Item(ligne, 2) + 90
        .Item(ligne, 16) = "Non"
        .Item(ligne, 17) = "Non"
    End With
End With

' Se placer sur la dernière cellule vide du tableau dans la colonne C
Range("C" & Rows.Count).End(xlUp).Offset(0, 0).Select

'Remettre la protection de la feuille
    ActiveSheet.Protect "mp"

End Sub

Je voulais encore vous remercier pour toute l'aide que vous m'avez apportée.

Bonne soirée.

David


je viens également de me rendre compte que depuis la mise en place de la protection, cela déactive également l’option de calcul automatique ???

Avez-vous une idée ?

Je viens de corriger les codes mais, j'ai été contraint de remettre Sub Auto_open() dans le fichier des demandes d'outillages.

la macro fonction bien avec Sub Auto_open(). j'ai la version Excel 2016.

Non cela n'a rien avoir avec votre version. Je vous ai dit que l'auto_Open ce sont les antiquités d'excel (excel 97, excel 2000). Donc oubliez cette façon.
Où avez-vous mis ce que je vous ai donné ? Dans le fichier Demandes outillages je suppose ?
Si oui, lorsque vous ouvrez Le fichier demande outillages le code sera exécuté.
Et vous avez bien remplacé Auto_open par un autre nom comme indiqué dans mon post. Si oui quel nom avez-vous donné que je fasse un test


Comment autoriser l'utilisation des filtres auto une fois la protection réactivée ?

Lorsque vous protégez la feuille une fenêtre s'ouvre avec des cases que vous devez cocher. Avez-vous la case "Filtre automatique" cochée ?


je viens également de me rendre compte que depuis la mise en place de la protection, cela déactive également l’option de calcul automatique ???

Bah en principe non mais je vous avoue avoir parfois des soucis avec cette option de calcul automatique. Notamment dans les codes quand vous mettez l'option sur manuel puis qu'à la fermeture vous omettez de remettre en automatique ou que vous ouvrez un fichier dans lequel l'option est sur manuel.
Une fois sur manuel, ce sont tous vos fichiers qui sont impactés.

Le mieux : recochez la case puis enregistrer le fichier et fermez le
A la réouverture le calcul sera nouveau sur automatique

Oui j’ai bien respecté vos consignes et les codes sont bien dans le fichier demandes outillages.

Cela fonctionne très bien.

Le problème est quand je lance la macro du fichier gestion pour récupérer les demandes outillages.

Le code ouvre le fichier demandes outillages et la, Excel ce ferme.

Voilà pourquoi j’ai remis le Auto_open qui est à bannir.

Le problème est quand je lance la macro du fichier gestion pour récupérer les demandes outillages.
Le code ouvre le fichier demandes outillages et la, Excel ce ferme.

Ok. Cela vient du fait que dans demande-outillage vous exécutez un code dans lequel on veut ouvrir le fichier gestion alors que celui-ci est déjà ouvert

Bon essayez ceci :

- refaites ce que je vous ai expliqué hier dans ce lien https://forum.excel-pratique.com/s/goto/1163850 au sujet du code Auto_open (donc renommer le code et placer le code dans thisworkbook)
- ensuite dans le fichier demandes outillages, allez dans votre code renommé et remplacez les lignes ci-dessous

On Error Resume Next
fichier = "Gestion.xlsm"
F_ODP = "C:\Users\apalo\Desktop\ODP\" & fichier ' Chemin du classeur "Suivi outillage"

' Ouvrir le classeur "Suivi outillages"
Workbooks.Open Filename:=F_ODP
On Error GoTo 0

Attention que dans le fichier demandes-outillages, vous fermez le fichier gestion à la fin. Donc à la fin de l'exécution du code cela va fermer le fichier Gestion ce que vous ne voulez peut être pas.

NB : je pense qu'une solution serait de simplement cliquez sur le bouton que vous avez mis sur la feuille Demandes outillages du fichier "demandes outillages" pour refaire la mise à jour plutot que faire une mise à jour automatique à l'ouverture. Cela crèe des conflits.

je viens de faire les modifications, mais cela de fonctionne toujours pas.

On Error Resume Next
fichier = "Gestion.xlsm"
F_ODP = "C:\Users\apalo\Desktop\ODP\" & fichier ' Chemin du classeur "Suivi outillage"

' Ouvrir le classeur "Suivi outillages"
Workbooks.Open Filename:=F_ODP
On Error GoTo 0

je n'arrive pas à comprendre pourquoi tout fonction si le début du code est Sub Auto_open, et que si je renomme le code Sub Auto-open() par Sub Import_donnees() tout en je insérant le code dans thisworkbook, cela ne fonctionne plus.

-------------------

Attention que dans le fichier demandes-outillages, vous fermez le fichier gestion à la fin. Donc à la fin de l'exécution du code cela va fermer le fichier Gestion ce que vous ne voulez peut être pas.

Effectivement, je ne souhaite pas que le fichier Gestion se ferme lors de l'exécution du code.

-------------------

NB : je pense qu'une solution serait de simplement cliquez sur le bouton que vous avez mis sur la feuille Demandes outillages du fichier "demandes outillages" pour refaire la mise à jour plutot que faire une mise à jour automatique à l'ouverture. Cela crèe des conflits.

Cela serait la solution, mais pas pensable à cause de la négligence des utilisateurs.

------------------

Concernant l'autorisation d'utiliser les filtres malgré la protection de la feuille, j'ai rajouter le code suivant qui fonctionne.

'Remettre la protection de la feuille
ActiveSheet.Protect "mp"

Dim mafeuille As String
mafeuille = "Demandes outillages"
Sheets(mafeuille).Protect Password:="mp", AllowFiltering:=True, userinterfaceonly:=True

re

je n'arrive pas à comprendre pourquoi tout fonction si le début du code est Sub Auto_open, et que si je renomme le code Sub Auto-open() par Sub Import_donnees() tout en je insérant le code dans thisworkbook, cela ne fonctionne plus.

je pense que c'est en effet dû au fait que lorsque vous utilisez le code dans Thisworkbook, il est exécuté en premier à l'ouverture du fichier.
Cela crée un conflit avec le code Auto-open lorsque vous ouvrez le fichier demande outillage depuis le fichier gestion

Essayez plutôt ceci :

1. Dans le fichier demande outillages, supprimez les deux lignes que je vous ai données --> On error resume next et on error goto 0.
Une fois le code placé dans Thisworkbook et code auto open remplacé par Sub Import_donnees(), enregistrez votre fichier "demande-outillages" et fermez le

2. Ouvrez votre fichier Gestion et dans le code Sub Importation_Demandes(), allez à la ligne --> 'ouvrir le classeur demande outillages
Avant le workbook.open, mettez ceci

Application.EnableEvents = False

Après le workbook.open, mettez ceci

Application.EnableEvents = True

De cette sorte, lorsque vous ouvrirez le fichier demande outillage depuis le fichier Gestion, le code Workbook.open ne sera pas exécuté.
PAr contre si vous ouvrez le fichier demande-outillages, il le sera

Refaites un essai


Concernant l'autorisation d'utiliser les filtres malgré la protection de la feuille, j'ai rajouter le code suivant qui fonctionne.

Cela revient au même que ce que je vous disais avant au sujet des cases à cocher. Donc ok sur ce point.
Mais évitez de créer des variables si cela ne sert pas. Votre code comme ceci plutôt.

'Remettre la protection de la feuille
Sheets("Demandes outillages").Protect Password:="mp", AllowFiltering:=True, userinterfaceonly:=True

Bonjour,

Je testerai en rentrant ce soir.

Par-contre, mon inquiétude sur la latence d’exécution de la macro est avérée.

J’ai testé avec toutes mes données soit 800 ligne dans le tableau et qui vas continuer à augmenter.

La mise à jour de l’importation a pris 5 à 10min.

Comment faire pour accélérer l’exécution ?

Comment peut-on ignorer la mise à jour si des lignes sont annulées ou soldés ?

Par-contre, mon inquiétude sur la latence d’exécution de la macro est avérée.
J’ai testé avec toutes mes données soit 800 ligne dans le tableau et qui vas continuer à augmenter.
La mise à jour de l’importation a pris 5 à 10min.

C'est un peu logique oui.
Je suppose que vous parlez du fichier gestion
Si oui, il faudrait savoir si les fichiers demande outillages et suivi ont éventuellement une colonne qui mentionne si une mise à jour a été effectuée.
Exemple : actuellement si vous avez une seule ligne modifiée, le code va balayer les 800 lignes alors qu'une seule suffirait si on pouvait avoir l'information de la ligne modifiée

Possible cela ?

Comment peut-on ignorer la mise à jour si des lignes sont annulées ou soldés ?

On voit cela comment dans le fichier ?

C'est un peu logique oui.

Je suppose que vous parlez du fichier gestion

Si oui, il faudrait savoir si les fichiers demande outillages et suivi ont éventuellement une colonne qui mentionne si une mise à jour a été effectuée.

Exemple : actuellement si vous avez une seule ligne modifiée, le code va balayer les 800 lignes alors qu'une seule suffirait si on pouvait avoir l'information de la ligne modifiée

Possible cela ?

Le temps exécution est long sur les 3 fichiers mais plus particulièrement sur celui GESTION.

Comment peut-on ignorer la mise à jour si des lignes sont annulées ou soldés ?

On voit cela comment dans le fichier ?

les 3 fichiers on la colonne statut avec les critère (Non attaqué ; En cours; En stand-by; Annulé et Soldé).

L'idée serait que si la ligne est soldé ou annulé ne pas réaliser une mise à jour.

Sinon s'il faut que je rajoute une colonne dans le fichier gestion d'autoriser ou pas la mise à jour, Est-ce possible ?

les 3 fichiers on la colonne statut avec les critère (Non attaqué ; En cours; En stand-by; Annulé et Soldé).
L'idée serait que si la ligne est soldé ou annulé ne pas réaliser une mise à jour.

OK mais il faut savoir qui met l'info Annulé ou Soldé.

Exemple lors de l'exécution du code Importation données dans le fichier Gestion : Si annulé ou Soldé en colonne Statut dans le fichier gestion, on n'importe rien
Cela suppose que c'est toujours le gestionnaire du fichier Gestion qui met l'info annulé ou Soldé
Du coup, on aurait jamais de annulé ou Soldé dans le fichier demande outillages

C'est le fichier GESTION qui pilote les données (Non attaqué ; En cours; En stand-by; Annulé et Soldé)

Essayez plutôt ceci :

1. Dans le fichier demande outillages, supprimez les deux lignes que je vous ai données --> On error resume next et on error goto 0.

Une fois le code placé dans Thisworkbook et code auto open remplacé par Sub Import_donnees(), enregistrez votre fichier "demande-outillages" et fermez le

2. Ouvrez votre fichier Gestion et dans le code Sub Importation_Demandes(), allez à la ligne --> 'ouvrir le classeur demande outillages

Avant le workbook.open, mettez ceci

Application.EnableEvents = False

Après le workbook.open, mettez ceci

Application.EnableEvents = True

De cette sorte, lorsque vous ouvrirez le fichier demande outillage depuis le fichier Gestion, le code Workbook.open ne sera pas exécuté.

PAr contre si vous ouvrez le fichier demande-outillages, il le sera

Refaites un essai

Je viens de tester les codes, ils fonctionnent.

Rechercher des sujets similaires à "copier mise jour donnees tableau"