2012-04-12 1 views
0

J'ai une feuille de calcul que je veux diviser en feuilles séparées pour chaque département. Il y a plus que les départements affichés et je veux que les fichiers .xls soient sauvegardés avec le nom du départementCréation d'un fichier Excel distinct pour chaque résultat de filtre

Le champ du département est la colonne D.

-à-dire que je voudrais un fichier .xls pour chacun avec uniquement les enregistrements pour le département 1, département 2, et ainsi de suite.

Malheureusement, je ne parviens pas à poster une capture d'écran de la feuille de calcul car mon représentant n'est pas encore assez bon.

Quel code VBA utiliserais-je pour cela?

+0

Quelle version de bureau? – Jesse

+0

Excel 2003. (réponse dans la section des commentaires de la réponse de Daniel) –

Répondre

2

Cela devrait faire ce dont vous avez besoin. Si vous exécutez et de fournir une lettre de la colonne, il se basera sur cette colonne, sinon il sera renvoyé par défaut à D que vous avez spécifié:

Sub SplitWorkbook(Optional colLetter As String, Optional SavePath As String) 
If colLetter = "" Then colLetter = "D" 
Dim lastValue As String 
Dim hasHeader As Boolean 
Dim wb As Workbook 
Dim c As Range 
Dim currentRow As Long 
hasHeader = True 'Indicate true or false depending on if sheet has header row. 

If SavePath = "" Then SavePath = ThisWorkbook.Path 
'Sort the workbook. 
ThisWorkbook.Worksheets(1).Sort.SortFields.Add Key:=Range(colLetter & ":" & colLetter), _ 
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
With ThisWorkbook.Worksheets(1).Sort 
    .SetRange Cells 
    If hasHeader Then ' Was a header indicated? 
     .Header = xlYes 
    Else 
     .Header = xlNo 
    End If 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 

For Each c In ThisWorkbook.Sheets(1).Range("D:D") 
    If c.Value = "" Then Exit For 
    If c.Row = 1 And hasHeader Then 
    Else 
     If lastValue <> c.Value Then 
      If Not (wb Is Nothing) Then 
       wb.SaveAs SavePath & "\" & lastValue & ".xls" 
       wb.Close 
      End If 
      lastValue = c.Value 
      currentRow = 1 
      Set wb = Application.Workbooks.Add 
     End If 
     ThisWorkbook.Sheets(1).Rows(c.Row & ":" & c.Row).Copy 
     wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Select 
     wb.Sheets(1).Paste 

    End If 
Next 
If Not (wb Is Nothing) Then 
    wb.SaveAs SavePath & "\" & lastValue & ".xls" 
    wb.Close 
End If 
End Sub 

Cela va générer un classeur séparé dans le même dossier que le livre de travail que vous exécutez ceci depuis ... ou dans le chemin que vous fournissez.

+0

Je ne semble pas être en mesure d'obtenir ce code pour travailler pour raison, @DanielCook serait-il possible pour moi de vous envoyer un exemple du fichier afin que vous puissiez voir ce que je suis contre? –

+0

J'utilise Office 2003 –

+2

A travaillé pour moi dans Excel 2010, changé l'extension de fichier en xlsx pour les deux instances de xls. Mais pour remplir la ligne vide suivante (sinon, il a juste écrasé le premier enregistrement), j'ai changé cette ligne en ajoutant Offset! -> wb.Sheets (1) .Cells (Rows.Count, 1) .End (xlUp) .Offset (1, 0) .Sélectionner –

Questions connexes