Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Excel - Dzielenie jednego skoroszytu na oddzielne pliki

steelek56 30 Jul 2014 11:13 8517 1
  • #1
    steelek56
    Level 12  
    Witam.

    Znów mam problem z Excelem. Mianowicie w firmie gdzie pracuje człowiek człowiekowi wilkiem przy wysyłaniu zbiorczego planu dostaw przewoźnicy się burzą że jeden ma lepiej drugi gorzej. Że ktoś jest bardziej faworyzowany inny mniej. Wpadłem na pomysł żeby skombinować makro, które dzieli plan dostaw na oddzielne pliki, takie, w których przewoźnik otrzymuje tylko informacje o trasach i załadunkach dla swoich aut. Wtedy skończą się płacze że ktoś ma lepiej, bo przestaną sobie wzajemnie kilometry liczyć.

    Jako, że w makrach to ogólnie najlepszy nie jestem z pomocą wujka google wykombinowałem dwa makra (plik xlsm w załączniku).

    Pierwsze, które dzieli plan na oddzielne arkusze na podstawie danych zawartych w kolumnie D (ta z kolei ma odniesienie do arkusza z bazą aut przydzielonych dla danych przewoźników):

    Sub DzielNaArkusze()
    Dim lr As Long
    Dim ws As Worksheet
    Dim vcol, i As Integer
    Dim icol As Long
    Dim myarr As Variant
    Dim title As String
    Dim titlerow As Integer
    vcol = 4
    Set ws = Sheets("Plan")
    lr = ws.Cells(ws.Rows.Count, vcol).End(xlUp).Row
    title = "A1:D1"
    titlerow = ws.Range(title).Cells(1).Row
    icol = ws.Columns.Count
    ws.Cells(1, icol) = "Unique"
    For i = 2 To lr
    On Error Resume Next
    If ws.Cells(i, vcol) <> "" And Application.WorksheetFunction.Match(ws.Cells(i, vcol), ws.Columns(icol), 0) = 0 Then
    ws.Cells(ws.Rows.Count, icol).End(xlUp).Offset(1) = ws.Cells(i, vcol)
    End If
    Next
    myarr = Application.WorksheetFunction.Transpose(ws.Columns(icol).SpecialCells(xlCellTypeConstants))
    ws.Columns(icol).Clear
    For i = 2 To UBound(myarr)
    ws.Range(title).AutoFilter field:=vcol, Criteria1:=myarr(i) & ""
    If Not Evaluate("=ISREF('" & myarr(i) & "'!A1)") Then
    Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = myarr(i) & ""
    Else
    Sheets(myarr(i) & "").Move after:=Worksheets(Worksheets.Count)
    End If
    ws.Range("A" & titlerow & ":A" & lr).EntireRow.Copy Sheets(myarr(i) & "").Range("A1")
    Sheets(myarr(i) & "").Columns.AutoFit
    Next
    ws.AutoFilterMode = False
    ws.Activate
    End Sub
    


    Drugi, który każdy z arkuszy zapisuje jako oddzielny plik:

    Sub ArkuszeNaPliki()
    MyPath = ThisWorkbook.Path
    For Each sht In ThisWorkbook.Sheets
    sht.Copy
    ActiveSheet.Cells.Copy
    ActiveSheet.Cells.PasteSpecial Paste:=xlPasteValues
    ActiveSheet.Cells.PasteSpecial Paste:=xlPasteFormats
    ActiveWorkbook.SaveAs _
    Filename:=MyPath & "\" & sht.Name & D1 & ".xls"
    ActiveWorkbook.Close savechanges:=False
    Next sht
    End Sub
    


    Działa jako tako chociaż mam z tym kilka problemów których nie mogę rozwiązać:

    Pierwszy to w filename probowałem dopisać żeby nazwa pliku składała się z nazwy arkusza (w tym wypadku nazwy przewoźnika), daty z komórki D1 (formuła Dziś()+1, bo plan przy wysyłaniu dotyczy kolejnego dnia) oraz zapisanego w formacie .xls.

    Pliki sie zapisuja co prawda bez daty, ale przy otwarciu pliku otrzymuje komunikat że plik który probuje otworzyć ma inny format niż określony przez rozszerzenie pliku.

    Drugi to fakt, że plan transportowy składa się z kilku różnych zakładek. Po jednej dla każdego z magazynów. Ci sami przewoźnicy mają auta przypisane do różnych magazynów. Więc idealnym wyjsciem byłoby tworzyć plik z trasami każdego z przewoźników z każdym magazynem oddzielnie w arkuszach. Chodziaż to takie wydziwianie jest bo plan na dobra sprawę trzeba by wpisać tą formułe z kolumny D w każdy arkusz. Więc ogólnie zamysł jest taki, żeby każdy magazyn dzielić oddzielnie i tworzyć np po 4 pliki po jednym dla każdego magazynu, które będą wysyłane do przewoźników. Wtedy zmienić makro tak żeby nazwa pliku zapisywała się jako przewoźnik - data - magazyn1.xls itd. Potem tylko poszukać w thunderbirdzie odpowiedniego dodatku który rozsyła spam (:D) każdy plik na podstawie nazwy do wskazanej grupy adresów.
  • #2
    JRV
    VBA, Excel specialist
    Filename:=MyPath & "\" & sht.Name & Range("D1").Text & ".xlsx"