XL 2013 copier coller en vba

michokette

XLDnaute Nouveau
Bonjour

J'extrais d'un logiciel de facturation un classeur excel (classeur1.xlsx)
Je fais actuellement un copier coller manuel de ce classeur, dans le classeur stat.xlsx, et ce, pour chaque produits (collecte, ventes contenants...ect)
Je souhaiterai faire cela par une macro (sachant que j'ai une dizaine de tableau du mème style à faire)
Pour information les données à copier du classeur1 ne se trouvent pas forcement à la ligne 9, cela peut varier.
En vous remerciant par avance de vos contributions
 

Pièces jointes

  • Classeur1.xlsx
    12.6 KB · Affichages: 16
  • STAT.xlsx
    95.8 KB · Affichages: 12

job75

XLDnaute Barbatruc
Bonjour michokette,

Téléchargez les 2 fichiers joints dans le même dossier (le bureau).

Modifiez les données du fichier source Classeur1.xlsx (y compris l'année) et testez ces 2 macros :
VB:
Sub MAJ_Mois()
'se lance par les touches Ctrl+M
If MsgBox("Etes-vous sûr qu'il faut mettre à jour les mois ?", vbYesNo + vbQuestion) = vbNo Then Exit Sub
Dim source$, w As Worksheet, c As Range, c1 As Range
source = ThisWorkbook.Path & "\Classeur1.xlsx" 'à adapter
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si le fichier est déjà ouvert
With Workbooks.Open(source).Sheets(1)
    For Each w In ThisWorkbook.Worksheets
        Set c = .Cells.Find(Replace(w.Name, " ", "*") & "*", , xlValues, xlWhole)
        If Not c Is Nothing Then
            Set c1 = w.Cells.Find("Qté N")
            If Not c1 Is Nothing Then c1(1, 2).Resize(, 12) = c(2, 2).Resize(, 12).Value
            Set c1 = w.Cells.Find("C A N")
            If Not c1 Is Nothing Then c1(1, 2).Resize(, 12) = c(3, 2).Resize(, 12).Value
        End If
    Next
    .Parent.Close True
End With
End Sub

Sub Nouvelle_Annee()
If MsgBox("Etes-vous sûr qu'il faut créer une nouvelle année ?", vbYesNo + vbQuestion) = vbNo Then Exit Sub
Dim source$, w As Worksheet, c As Range, c1 As Range, n%, c2 As Range
source = ThisWorkbook.Path & "\Classeur1.xlsx" 'à adapter
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si le fichier est déjà ouvert
With Workbooks.Open(source).Sheets(1)
    Set c = .Cells.Find("FamilleArticle", , xlValues, xlWhole)
    If Not c Is Nothing Then
        For Each w In ThisWorkbook.Worksheets
            Set c1 = w.Cells.Find("FamilleArticle")
            If Not c1 Is Nothing Then
                n = n + 1
                If n = 1 Then If Year(c(1, 3)) = Year(c1(1, 2)) Then MsgBox "Modifiez l'année du fichier source !", 48: Exit Sub
                w.Cells.Find("FamilleArticle", c1)(1, 2).Resize(, 12) = c1(1, 2).Resize(, 12).Value
                c1(1, 2).Resize(, 12) = c(1, 3).Resize(, 12).Value
            End If
            Set c1 = w.Cells.Find("Qté N")
            If Not c1 Is Nothing Then
                Set c2 = w.Cells.Find("Qté N*-*")
                If Not c2 Is Nothing Then c2(1, 2).Resize(, 12) = c1(1, 2).Resize(, 12).Value
                c1(1, 2).Resize(, 12).ClearContents
            End If
            Set c1 = w.Cells.Find("C A N")
            If Not c1 Is Nothing Then
                Set c2 = w.Cells.Find("C A N*-*")
                If Not c2 Is Nothing Then c2(1, 2).Resize(, 12) = c1(1, 2).Resize(, 12).Value
                c1(1, 2).Resize(, 12).ClearContents
            End If
        Next
    End If
    .Parent.Close True
End With
End Sub
PS : dans les feuilles les dates étaient des textes, je les ai converties en vraies dates (nombres).

A+
 

Pièces jointes

  • STAT(1).xlsm
    108.2 KB · Affichages: 6
  • Classeur1.xlsx
    12.3 KB · Affichages: 5

michokette

XLDnaute Nouveau
Bonjour michokette,

Téléchargez les 2 fichiers joints dans le même dossier (le bureau).

Modifiez les données du fichier source Classeur1.xlsx (y compris l'année) et testez ces 2 macros :
VB:
Sub MAJ_Mois()
'se lance par les touches Ctrl+M
If MsgBox("Etes-vous sûr qu'il faut mettre à jour les mois ?", vbYesNo + vbQuestion) = vbNo Then Exit Sub
Dim source$, w As Worksheet, c As Range, c1 As Range
source = ThisWorkbook.Path & "\Classeur1.xlsx" 'à adapter
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si le fichier est déjà ouvert
With Workbooks.Open(source).Sheets(1)
    For Each w In ThisWorkbook.Worksheets
        Set c = .Cells.Find(Replace(w.Name, " ", "*") & "*", , xlValues, xlWhole)
        If Not c Is Nothing Then
            Set c1 = w.Cells.Find("Qté N")
            If Not c1 Is Nothing Then c1(1, 2).Resize(, 12) = c(2, 2).Resize(, 12).Value
            Set c1 = w.Cells.Find("C A N")
            If Not c1 Is Nothing Then c1(1, 2).Resize(, 12) = c(3, 2).Resize(, 12).Value
        End If
    Next
    .Parent.Close True
End With
End Sub

Sub Nouvelle_Annee()
If MsgBox("Etes-vous sûr qu'il faut créer une nouvelle année ?", vbYesNo + vbQuestion) = vbNo Then Exit Sub
Dim source$, w As Worksheet, c As Range, c1 As Range, n%, c2 As Range
source = ThisWorkbook.Path & "\Classeur1.xlsx" 'à adapter
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si le fichier est déjà ouvert
With Workbooks.Open(source).Sheets(1)
    Set c = .Cells.Find("FamilleArticle", , xlValues, xlWhole)
    If Not c Is Nothing Then
        For Each w In ThisWorkbook.Worksheets
            Set c1 = w.Cells.Find("FamilleArticle")
            If Not c1 Is Nothing Then
                n = n + 1
                If n = 1 Then If Year(c(1, 3)) = Year(c1(1, 2)) Then MsgBox "Modifiez l'année du fichier source !", 48: Exit Sub
                w.Cells.Find("FamilleArticle", c1)(1, 2).Resize(, 12) = c1(1, 2).Resize(, 12).Value
                c1(1, 2).Resize(, 12) = c(1, 3).Resize(, 12).Value
            End If
            Set c1 = w.Cells.Find("Qté N")
            If Not c1 Is Nothing Then
                Set c2 = w.Cells.Find("Qté N*-*")
                If Not c2 Is Nothing Then c2(1, 2).Resize(, 12) = c1(1, 2).Resize(, 12).Value
                c1(1, 2).Resize(, 12).ClearContents
            End If
            Set c1 = w.Cells.Find("C A N")
            If Not c1 Is Nothing Then
                Set c2 = w.Cells.Find("C A N*-*")
                If Not c2 Is Nothing Then c2(1, 2).Resize(, 12) = c1(1, 2).Resize(, 12).Value
                c1(1, 2).Resize(, 12).ClearContents
            End If
        Next
    End If
    .Parent.Close True
End With
End Sub
PS : dans les feuilles les dates étaient des textes, je les ai converties en vraies dates (nombres).

A+
Bonjour job75

testé ce matin, la proposition de votre macro.
Qu’une chose à dire : parfait
Merci une fois de plus de votre aide
Bonne journée à vous
Bien cordialement
 

Discussions similaires

Statistiques des forums

Discussions
312 083
Messages
2 085 189
Membres
102 809
dernier inscrit
Sandrine83