Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Copier plusieurs colonnes d'une feuille dans plusieurs feulles

Diane_courie

XLDnaute Nouveau
Bonjour,

J'ai une feuille "Base retravaillée" je dois copier les colonnes A B C D dans une autre feuille puis, A B C E dans une autre puis, A B C F dans une autre et ainsi de suite. Et ce très régulièrement.
Je n'arrive pas a réaliser une macro allant dans ce sens.

Merci d'avance
Diane
 

Pièces jointes

  • Export BI 03-2018 -v envxlsx.xlsx
    22.3 KB · Affichages: 31

job75

XLDnaute Barbatruc
Bonjour Diane_courie, vgendron,
dans ton fichier tu vas te retouver avec 115 feuilles...??
Ben oui sinon rien de drôle :
Code:
Private Sub CommandButton1_Click()
Dim i%, a$, j%
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'---RAZ---
Me.Move Before:=Sheets(1)
For i = Sheets.Count To 2 Step -1
    Sheets(i).Delete
Next
'---création des feuilles---
With Range("A1", UsedRange).EntireColumn
    For i = 4 To .Columns.Count
        a = Split(.Columns(i).Address(0, 0), ":")(0)
        Sheets.Add After:=Sheets(Sheets.Count)
        ActiveSheet.Name = "ABC-" & a
        j = .Cells(2, i).MergeArea.Columns.Count 'pour DM2:DN2 qui sont fusionnées
        Union(.Columns(1).Resize(, 3), .Columns(i).Resize(, j)).Copy ActiveSheet.Range("A1")
        i = i + j - 1
    Next
End With
Me.Activate
End Sub
Les cellules fusionnées doivent se trouver uniquement en ligne 2 (voir DM2: DN2).

Fichier joint.

A+
 

Pièces jointes

  • Export BI 03-2018(1).xlsm
    55.5 KB · Affichages: 41

job75

XLDnaute Barbatruc
Re, salut Lone-wolf, merinos,
Est-il possible de renommer les feuilles générés avec la ligne 2 et 3 de chaque colonne.
Sans trop bousculer ses neurones :
Code:
Private Sub CommandButton1_Click()
Dim i%, j%
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next 'si un nom de feuille est déjà utilisé
'---RAZ---
Me.Move Before:=Sheets(1)
For i = Sheets.Count To 2 Step -1
    Sheets(i).Delete
Next
'---création des feuilles---
With Range("A1", UsedRange).EntireColumn
    For i = 4 To .Columns.Count
        Sheets.Add After:=Sheets(Sheets.Count)
        ActiveSheet.Name = .Cells(2, i) & " " & .Cells(3, i)
        j = .Cells(2, i).MergeArea.Columns.Count 'pour DM2:DN2 qui sont fusionnées
        Union(.Columns(1).Resize(, 3), .Columns(i).Resize(, j)).Copy ActiveSheet.Range("A1")
        ActiveSheet.Columns(4).Resize(, j).AutoFit 'ajustement largeur
        i = i + j - 1
    Next
End With
Me.Activate
End Sub
Fichier (2).

Edit : fichier (2 bis) avec ajout des variables x et dL pour que toutes les feuilles soient nommées.

A+
 

Pièces jointes

  • Export BI 03-2018(2).xlsm
    60.7 KB · Affichages: 20
  • Export BI 03-2018(2 bis).xlsm
    61.1 KB · Affichages: 18
Dernière édition:

job75

XLDnaute Barbatruc
Re,

Vous êtes gourmande Diane, mais c'est faisable, je verrai cela dans la soirée.

Pas besoin de réduire les libellés en ligne 2, la macro peut les adapter (maxi 31 caractères pour un nom d'onglet).

A+
 

job75

XLDnaute Barbatruc
Re,

Légère retouche au fichier (2) pour les largeurs des colonnes.

Avec ce fichier (3) création des 11 fichiers demandés :
Code:
Private Sub CommandButton1_Click()
Dim chemin$, d As Object, i%, x$, nomfich$, dL%, wb As Workbook, F As Worksheet, j%
chemin = ThisWorkbook.Path & "\Mes fichiers\" 'nom du dossier à adapter
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
'---création des classeurs---
MkDir chemin 'création du sous-dossier
Set d = CreateObject("Scripting.Dictionary")
With Range("A1", UsedRange).EntireColumn
    For i = 4 To .Columns.Count
        x = .Cells(2, i)
        nomfich = Split(x)(0) & ".xls"
        dL = Len(x) + Len(.Cells(3, i)) - 30 'nom d'onglet limité à 31 caractères
        If Not d.exists(nomfich) Then
            d(nomfich) = ""
            Workbooks(nomfich).Close
            Workbooks.Add(xlWBATWorksheet).SaveAs chemin & nomfich, 56 'fichier .xls
        End If
        Set wb = Workbooks(nomfich)
        Set F = wb.Sheets.Add(After:=wb.Sheets(wb.Sheets.Count)) 'nouvelle feuille
        F.Name = Left(x, Len(x) - dL) & " " & .Cells(3, i)
        j = .Cells(2, i).MergeArea.Columns.Count 'pour DM2:DN2 qui sont fusionnées
        Union(.Columns(1).Resize(, 3), .Columns(i).Resize(, j)).Copy F.Range("A1")
        F.Columns(4).Resize(, j).AutoFit 'ajustement largeur
        i = i + j - 1
    Next i
End With
'---fermeture des classeurs---
For Each wb In Workbooks
    If d.exists(wb.Name) Then
        wb.Activate
        wb.Sheets(1).Delete
        wb.Sheets(1).Activate
        wb.Close True 'avec enregistrement
    End If
Next wb
End Sub
A+
 

Pièces jointes

  • Export BI 03-2018(3).xlsm
    63.4 KB · Affichages: 20
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…