iedere locatie een aparte excel file

Status
Niet open voor verdere reacties.

Whanky

Gebruiker
Lid geworden
25 okt 2011
Berichten
8
Hallo allemaal,

Ik heb een vraagje. Ik ben helemaal vreemd in het macro gebeuren maar wil hier graag in ontvreemd worden ! :thumb:

Het uiteindelijke doel is het volgende :

Ik heb 1 excel file met een lijst van veel computers uit verschillende locaties.
De bedoeling is nu dat ik voor iedere locatie een apparte excel file maak,
met alleen de computers uit die bepaalde locatie.

Momenteel doe ik dit manueel door een copy en een paste in een nieuwe file en deze dan op te slaan. Dit duurt ongeveer een halve dag...

Ik verwacht niet dat iemand me een totaaloplossing geeft maar kan iemand mij op weg zetten ? Ik heb geen idee hoe hieraan te beginnen ...:o
 
We zijn een Nederlands forum denk daaraan bij het bedenken van een titel. Topictitel aangepast.
 
Dat is een beetje afhankelijk wat er beschikbaar is om te sorteren. als het eenvoudig is om te identificeren wat naar welke file moet hoeft het niet zo moeilijk te zijn
 
Een kleine voorbeeld tabel :

T_Eqp_ID Make Model Country LocationID1
58 HP Evo D500 Spain Gijon
157 HP Evo N1020v Italy Bologna
168 Compaq DSDT Spain Ermua
176 HP DX854AV Spain Ermua
180 Compaq DSDT Spain Ermua
212 HP Compaq dc5700 Sweden Vittaryd (Ljungby)
221 HP Compaq dc5700 Spain Ermua
242 HP Evo D500 Spain Ermua
259 HP Evo D500 Spain Gijon
267 HP PM215AV Spain Ermua
286 HP Evo D500 Spain Ermua
291 HP DC578AV Sweden Vittaryd (Ljungby)
293 HP Compaq 6000 Pro Italy Bologna
315 HP Evo D500 Spain Gijon

We zouden dus eerst moeten filteren op LocationID1, en dan voor ieder van de locaties een apparte excel file maken.
 
Oplossing 1: voor elke locatie een tab aanmaken en de betreffende lijnen daarnaartoe copieren. daarna elke tab saven.

Je kunt ook de excel file benaderen als database. 1 query en je hebt alle data die je wilt, altijd, op elk moment.
 
Ik heb een beetje rondgekeken, volgens mij moet ik het helemaal niet sorteren.

Heb een beetje rondgezocht en hier en daar het een en ander uitgepikt en zo zelf even begonnen met een macro.
Kijk eens even wat je van volgende code vind en of ik hiermee verder kan.

Code:
Sub SplitSheet()

    Dim var As Characters
    Dim cell As Range
    Dim NewRange As Range
    Dim MyCount As Long

'selecteer de eerste locatie

    var = ActiveSheet.Range("K2").Select

'een lus die blijft lopen totdat er geen cells meer gevonden worden met dezelfde inhoud als var

    MyCount = 1
    
    For Each cell In Range("A2:L1279")
        If cell.Value = var Then
            If MyCount = 1 Then Set NewRange = cell
            Set NewRange = Application.Union(NewRange, cell)
            MyCount = MyCount + 1
        End If
    Next cell
        
' knip de selectie

    NewRange.Cut
    
'creer een nieuwe workbook en save hem op de desktop met als naam de locatie die in var zit

    Workbooks.Add
    ActiveSheet.Paste
    ActiveWorkbook.SaveAs Filename:="C:\Documents and Settings\maarclee\Desktop\'var'.xls"
    
End Sub

Natuurlijk als deze code zou werken zou ik een sheet hebben met een lijst van dezelfde locatie namen, en niet met een lijst van alle gegevens ?
 
Sorry, maar dit is wel een erg inefficiënte macro. En als je toch gaat knippen in je originele file, waarom dan niet alle locaties deleten die je niet wil? ben je sneller en ook destructief bezig :P

Wat is het doel, uiteindelijk alle locaties splitsen in aparte file, of een macro waarbij je snel 1 site kunt kiezen en van die specifieke site een file maken?
 
het is dan ook de eerste macro die ik ooit 'geschreven' heb :o

Het doel is om uiteindelijk voor iedere locatie een apparte excel file te hebben.
 
Ik zeg niet dat het niet werkt, ik denk alleen dat het mogelijk moet zijn 10 keer sneller te doen ;) de locaties staan in kolom "K"?
 
Code:
Sub splitsen()

Application.ScreenUpdating = False

For Each cell In Range([k2], Range("k60000").End(xlUp).Address)
    found = False
    For i = 1 To Sheets.Count
        If cell.Value = Sheets(i).Name Then
            found = True
        End If
    Next i
    If Not found Then
        Sheets.Add after:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = cell.Value
    End If
    cell.EntireRow.Copy
    'Sheets(cell.Value).Range("a60000").End(xlUp).Offset(1).Paste
    ActiveSheet.Paste Destination:=Sheets(cell.Value).Range("a60000").End(xlUp).Offset(1)
    
Next cell

Application.ScreenUpdating = True

End Sub

probeer dit eens. Als dit correct werkt kan ik een loop toevoegen die elke sheet ook apart saved
 
Maak een nieuw werkblad aan en noem dit Samenvatting
Ga terug naar je tabelblad en draai onderstaande macro.
Code:
Sub filter()
Application.ScreenUpdating = False
Range("E1", Range("E65536").End(xlUp)).AdvancedFilter _
    Action:=xlFilterCopy, CopyToRange:=[I1], Unique:=True
For Each cell In Range(Range("I2"), Range("I65536").End(xlUp).Address)
    With Sheets("Samenvatting")
        .Range("I1") = "LocationID1"
        .Range("I2") = cell.Value
        Range("A1:E15").AdvancedFilter Action:=xlFilterCopy, _
            CriteriaRange:=.Range("I1:I2"), CopyToRange:=.Range("A1:E1"), Unique:=False
        .Range("I1:I2").ClearContents
        .Copy
        With ActiveWorkbook
            .SaveAs "C:\Documents and Settings\maarclee\Desktop\" & cell.Value & ".xls"
            .Close
        End With
        .Range("A1").CurrentRegion.ClearContents
    End With
Next
Range("I1", Range("I65536").End(xlUp)).ClearContents
Application.ScreenUpdating = True
End Sub
 
OK, ik krijg bij het uitvoeren van deze macro voor beiden de error X 400
maar heb de indruk dat dit aan mijn PC ligt ipv aan de macro's ?
 
doet de macro wel iets of loop je meteen vast?

Heb je een of meerdere "hidden" tabs in je sheet? Draai je de macro wel vanaf de hoofdsheet?
 
bij het uitvoeren van jouw macro s er een nieuwe tab die bijkomt, maar deze is leeg.

Er zit maar 1 tab in de originele file en hierachter zit de code.
 
Laatst bewerkt:
soms sta je versteld hoe snel je een halve dag kan inhalen... :P

Stop dit in een module en run de macro "turboexport"
zorg wel dat je de locatie van "SAVE_PATH" goed instelt.

Code:
Option Explicit

Public Sub TurboExport()
'met de vriendelijke groeten van Mark

Const ZOEK_KOLOM As String = "K"        'Bepaalt de zoekkolom
Const LAATSTE_KOLOM As String = "L"      'de laaste kolom met data

Dim workbookCounter As Long     'houd bij hoeveel werkmappen zijn geexporteerd

Dim ExportBereik As Range
Dim Begin As Range
Dim Einde As Range
Dim Locatie As String   'de naam van de locatie

    'bereik sorteren zodat locaties onder elkaar komen
    Range("K1").CurrentRegion.Sort Key1:=Range(ZOEK_KOLOM & "1"), _
                                   Order1:=xlAscending, _
                                   Header:=xlYes
    'de zoekkolom is ZOEK_KOLOM
    Set Begin = Range(ZOEK_KOLOM & "2")

    Application.ScreenUpdating = False

    On Error GoTo Abort:

    Do While Begin <> vbNullString

        Locatie = Begin.Value                   'de naam van de locatie
        workbookCounter = workbookCounter + 1   'want de naam is niet leeg

        Application.StatusBar = "opslaan " & Locatie

        'zoek de laatste cel met de locatie
        Set Einde = VindLaatsteCel(Locatie, Columns(ZOEK_KOLOM), Begin)
        'de te kopiëren data bepalen:
        Set ExportBereik = Range("A" & Begin.Row, LAATSTE_KOLOM & Einde.Row)

        'sla de data op
        MaakLocatieMap Locatie, ExportBereik

        'de volgende locatie
        Set Begin = Einde.Offset(1)

    Loop

Abort:
    'bij fouten instellingen herstellen en rommel opruimen
    Application.ScreenUpdating = True
    Application.StatusBar = Empty

    If Err.Number <> 0 Then
        MsgBox "Procedure afgebroken, " & vbNewLine & _
                "De volgende fout is opgetreden:" & vbNewLine & _
                Err.Description
    Else
        MsgBox "Klaar! " & workbookCounter & " bestand(en) aangemaakt."
    End If

    Set ExportBereik = Nothing
    Set Begin = Nothing
    Set Einde = Nothing

End Sub

Private Function VindLaatsteCel(ByVal zoekwaarde As String, _
                                ByVal ZoekBereik As Range, _
                                Optional ByVal Begin As Range) As Range
'werkt alleen goed op gesorteerd bereik
    Set VindLaatsteCel = ZoekBereik.Find(What:=zoekwaarde, _
                                         After:=Begin, _
                                         LookIn:=xlValues, _
                                         lookat:=xlWhole, _
                                         MatchCase:=False, _
                                         SearchDirection:=xlPrevious)
End Function

Private Sub MaakLocatieMap(ByVal naam As String, _
                           ByVal data As Range)
'sla bestand op de de gewenste map.
Const SAVE_PATH As String = "C:\Temp\"  'vul hier de naam van de map in
                                        'vergeet de backslash aan het einde niet

Dim bestand As Excel.Workbook           'het workbook object dat opgeslagen wordt
Dim bestandsnaam As String              'de bestandsnaam voor het opslaan

    Set bestand = Workbooks.Add()
    'kopieer de data naar de nieuwe werkmap
    data.Copy Destination:=bestand.Sheets(1).Range("a1")
    
    bestandsnaam = "C:\temp\" & naam
    
    bestand.SaveAs bestandsnaam
    bestand.Close False
        
    'bestandvariabele opruimen
    Set bestand = Nothing
          
End Sub

Met vriendelijke groeten!
 
Laatst bewerkt:
MarkXL, je macro werkt perfect !

Wampier en Warme Bakkertje, ik laat jullie weten waarom jullie macro's bij mij niet willen werken van zodra ik erachter kom. Ik ben momenteel nog aan het zoeken.

Alvast alle 3 bedankt !
 
Waarom mijn macro niet werkte ben ik al uit nl al mijn bereiken waren fout(topic niet grondig gelezen :o).
Probeer het eens met onderstaande.
Code:
Sub filter()
Application.ScreenUpdating = False
Range("K1", Range("K65536").End(xlUp)).AdvancedFilter _
    Action:=xlFilterCopy, CopyToRange:=[N1], Unique:=True
For Each cell In Range(Range("N2"), Range("N65536").End(xlUp).Address)
    With Sheets("Samenvatting")
        .Range("N1") = "LocationID1"
        .Range("N2") = cell.Value
        Range("A1:L1279").AdvancedFilter Action:=xlFilterCopy, _
            CriteriaRange:=.Range("N1:N2"), CopyToRange:=.Range("A1:L1"), Unique:=False
        .Range("N1:N2").ClearContents
        .Copy
        With ActiveWorkbook
            .SaveAs "C:\Documents and Settings\maarclee\Desktop\" & cell.Value & ".xls"
            .Close
        End With
        .Range("A1").CurrentRegion.ClearContents
    End With
Next
Range("N1", Range("N65536").End(xlUp)).ClearContents
Application.ScreenUpdating = True
End Sub
 
soms sta je versteld hoe snel je een halve dag kan inhalen... :P

Stop dit in een module en run de macro "turboexport"
zorg wel dat je de locatie van "SAVE_PATH" goed instelt.



Met vriendelijke groeten!

Beste Mark xl,

Ik heb gebruik gemaakt van jou code, en na aanpassing van de aangewezen kolommen en het "SAVE_PATH" werkt deze goed.

Ik zou nu ook graag de koppen van de kolommen mee kopieren, maar die worden niet meegenomen.

Is hier een oplossing voor?

Met vriendelijke groet,
 
Hoi ovries,

Ik heb wat aanpassingen gedaan, ik hoop dat het zo werkt...!

Code:
Option Explicit

Public Sub TurboExport()
'met de vriendelijke groeten van Mark

Const ZOEK_KOLOM As String = "K"        'Bepaalt de zoekkolom
Const LAATSTE_KOLOM As String = "L"      'de laaste kolom met data

Dim workbookCounter As Long     'houd bij hoeveel werkmappen zijn geexporteerd

[COLOR="red"]Dim exportHeaders As Range [/COLOR]     'de kolomkoppen
Dim exportBereik As Range       'het te exporteren bereik
Dim Begin As Range
Dim Einde As Range
Dim Locatie As String   'de naam van de locatie

    'bereik sorteren zodat locaties onder elkaar komen
    Range(ZOEK_KOLOM & "1").CurrentRegion.Sort Key1:=Range(ZOEK_KOLOM & "1"), _
                                   Order1:=xlAscending, _
                                   Header:=xlYes

    'de zoekkolom is ZOEK_KOLOM
    [COLOR="red"]Set exportHeaders = Range(ZOEK_KOLOM & "1").CurrentRegion.Resize(1)[/COLOR]
    Set Begin = Range(ZOEK_KOLOM & "2")

    Application.ScreenUpdating = False

    On Error GoTo Abort:

    Do While Begin <> vbNullString

        Locatie = Begin.Value                   'de naam van de locatie
        workbookCounter = workbookCounter + 1   'want de naam is niet leeg

        Application.StatusBar = "opslaan " & Locatie

        'zoek de laatste cel met de locatie
        Set Einde = VindLaatsteCel(Locatie, Columns(ZOEK_KOLOM), Begin)
        'de te kopiëren data bepalen:
        Set exportBereik = Range("A" & Begin.Row, LAATSTE_KOLOM & Einde.Row)

        'sla de data op
        MaakLocatieMap Locatie, exportBereik[COLOR="red"], exportHeaders[/COLOR]

        'de volgende locatie
        Set Begin = Einde.Offset(1)

    Loop

Abort:
    'bij fouten instellingen herstellen en rommel opruimen
    Application.ScreenUpdating = True
    Application.StatusBar = Empty

    If Err.Number <> 0 Then
        MsgBox "Procedure afgebroken, " & vbNewLine & _
                "De volgende fout is opgetreden:" & vbNewLine & _
                Err.Description
    Else
        MsgBox "Klaar! " & workbookCounter & " bestand(en) aangemaakt."
    End If

    Set exportBereik = Nothing
    [COLOR="red"]Set exportHeaders = Nothing[/COLOR]
    Set Begin = Nothing
    Set Einde = Nothing

End Sub

Private Function VindLaatsteCel(ByVal zoekwaarde As String, _
                                ByVal ZoekBereik As Range, _
                                Optional ByVal Begin As Range) As Range
'werkt alleen goed op gesorteerd bereik
    Set VindLaatsteCel = ZoekBereik.Find(What:=zoekwaarde, _
                                         After:=Begin, _
                                         LookIn:=xlValues, _
                                         lookat:=xlWhole, _
                                         MatchCase:=False, _
                                         SearchDirection:=xlPrevious)
End Function

Private Sub MaakLocatieMap(ByVal naam As String, _
                           ByVal data As Range, _
                           [COLOR="red"]ByVal headers As Range[/COLOR])
'sla bestand op de de gewenste map.
Const SAVE_PATH As String = "C:\Temp\"  'vul hier de naam van de map in
                                        'vergeet de backslash aan het einde niet

Dim bestand As Excel.Workbook           'het workbook object dat opgeslagen wordt
Dim bestandsnaam As String              'de bestandsnaam voor het opslaan

    Set bestand = Workbooks.Add()
    'kopieer de data naar de nieuwe werkmap
    
    [COLOR="red"]headers.Copy Destination:=bestand.Sheets(1).Range("a1")[/COLOR]
    data.Copy Destination:=bestand.Sheets(1).Range("a2")
    
    bestandsnaam = "C:\temp\" & naam
    
    bestand.SaveAs bestandsnaam
    bestand.Close False
        
    'bestandvariabele opruimen
    Set bestand = Nothing
          
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan