Страницы: 1
RSS
Формирование списка НГ подарков детям по Ответственному лицу
 
Доброй ночи, форумчане)
Нужна помощь в написании макроса который подробит сформированный список по отдельным листам в определенном шаблоне.
Описании во вкладке ТЗ.
Очень нужна помощь, помогите)
 
Nusi, покажте желаемый результат для двух руководителей или кого-там
Не бойтесь совершенства. Вам его не достичь.
 
Красным пометила листы которые должны получится.
Спасибо!
 
Nusi, А как понять какой адрес ?
допустим  Ответственное лицо 2-  108811, Москва г, Киевское шоссе и 127276, Москва г, Дубовой Рощи ул....
Не бойтесь совершенства. Вам его не достичь.
 
По графе адрес доставки. Исправила там адреса, были перемешаны.
на каждого ответственного - адрес один.
 
Nusi,
думаю, что в платном разделе Вам помогут быстрее
 
Nusi, сделал так сказать поверхностно форматирование не делал это слишком)
Код
Sub sdd()
Dim i As Long, lr As Long, sh As Worksheet, col As New Collection, wh As Worksheet, n As Long
Set wh = Worksheets("Общий список")
Set sh = Worksheets("ШАБЛОН")
Application.ScreenUpdating = False
lr = wh.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lr
     On Error Resume Next
     col.Add wh.Cells(i, 10), CStr(wh.Cells(i, 10))
Next i
For i = 1 To col.Count
sh.Range("A10:G1000").ClearContents: sh.Range("B4:B7").ClearContents
k = 10
    For n = 2 To lr
        If wh.Cells(n, 10) = col(i) Then
            If sh.Range("B4") = "" Then
                sh.Range("B4") = wh.Cells(n, 8)
                sh.Range("B5") = wh.Cells(n, 9)
                sh.Range("B6") = col(i)
                sh.Range("B7") = wh.Cells(n, 11)
            End If
            
            sh.Cells(k, 2) = "Детский Новогодний подарок"
            sh.Cells(k, 3) = 1
            sh.Cells(k, 4) = "шт."
            sh.Cells(k, 5) = wh.Cells(n, 2)
            sh.Cells(k, 6) = wh.Cells(n, 7)
            
            k = k + 1
        End If
    Next n
    sh.Cells(k + 1, 2) = "Итого:"
    sh.Cells(k + 1, 3) = k - 10
    sh.Cells(k + 1, 4) = "шт."
    sh.Cells(k + 2, 1) = "Генеральный директор"
    sh.Cells(k + 2, 4) = "Иванов И.И."
    With Worksheets("Лист рассылки")
        lr2 = .Cells(Rows.Count, 1).End(xlUp).Row + 1
        x = 1
        .Cells(lr2, 1) = x
        .Cells(lr2, 2) = sh.Range("B4")
        .Cells(lr2, 3) = sh.Range("B5")
        .Cells(lr2, 4) = sh.Cells(k + 1, 3)
        .Cells(lr2, 5) = col(i)
        x = x + 1
    End With
    k = 10
    sh.Copy after:=ActiveSheet
    ActiveSheet.Name = sh.Range("B6")
Next i
Application.ScreenUpdating = True
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Nusi, добрый день!

И вот такой вариант решения, если на одного ответственного приходится несколько городов и адресов. С одним адресом тоже работает
Код
Sub Podarki_NG()
Dim wsShablon As Worksheet, wsAdd As Worksheet, wsSheet As Worksheet
Dim arrData()
Dim dicWs As Object, dicCity As Object, dicAddress As Object, dicKont As Object
Dim x As Integer, i As Integer, rw As Integer, nub As Integer
Set dicWs = CreateObject("Scripting.Dictionary")
Set dicCity = CreateObject("Scripting.Dictionary")
Set dicAddress = CreateObject("Scripting.Dictionary")
Set dicKont = CreateObject("Scripting.Dictionary")
Set wsShablon = ThisWorkbook.Worksheets("ШАБЛОН")
Set wsSheet = ThisWorkbook.Worksheets("Лист рассылки")
nub = 2
Application.ScreenUpdating = False
With wsSheet
    If .Range("A2") <> "" Then .Range("A2", .Range("E" & .Range("A2").End(xlDown).Row)).ClearContents
End With
If ThisWorkbook.Worksheets.Count > 4 Then
    Application.DisplayAlerts = False
    For x = ThisWorkbook.Worksheets.Count To 5 Step -1
        ThisWorkbook.Worksheets(x).Delete
    Next x
    Application.DisplayAlerts = True
End If
arrData = ThisWorkbook.Sheets("Общий список").Range("A1").CurrentRegion.Value
For x = 2 To UBound(arrData, 1)
    If Not dicWs.Exists(arrData(x, 10)) Then dicWs.Add arrData(x, 10), arrData(x, 10)
Next x
For x = 0 To dicWs.Count - 1
    For i = 2 To UBound(arrData, 1)
        If arrData(i, 10) = dicWs.Keys()(x) And Not dicCity.Exists(arrData(i, 8)) Then dicCity.Add arrData(i, 8), arrData(i, 8)
    Next i
    For i = 0 To dicCity.Count - 1
        For r = 2 To UBound(arrData, 1)
            If arrData(r, 10) = dicWs.Keys()(x) And arrData(r, 8) = dicCity.Keys()(i) Then
                If Not dicAddress.Exists(arrData(r, 9)) Then
                    dicAddress.Add arrData(r, 9), arrData(r, 9)
                    If Not dicKont.Exists(arrData(r, 11)) Then dicKont.Add arrData(r, 11), arrData(r, 11)
                End If
            End If
        Next r
        For r = 0 To dicAddress.Count - 1
            Set wsAdd = ThisWorkbook.Worksheets.Add(, ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
            With wsAdd
                .Name = dicWs.Keys()(x) & "-" & nub - 1
                .Tab.Color = vbRed
                wsShablon.Cells.Copy .Range("A1")
                .Range("B4") = dicCity.Keys()(i)
                .Range("B5") = dicAddress.Keys()(r)
                .Range("B6") = dicWs.Keys()(x)
                .Range("B7") = dicKont.Keys()(r)
                rw = 10
                For s = 2 To UBound(arrData, 1)
                    If arrData(s, 8) = dicCity.Keys()(i) And arrData(s, 9) = dicAddress.Keys()(r) And arrData(s, 10) = dicWs.Keys()(x) Then
                        .Range("E" & rw) = arrData(s, 2)
                        .Range("F" & rw) = arrData(s, 7)
                        rw = rw + 1
                    End If
                Next s
                .Range("B" & rw, .Range("B" & rw).End(xlDown)).EntireRow.Delete
            End With
            With wsSheet
                .Range("A" & nub) = nub - 1
                .Range("B" & nub) = dicCity.Keys()(i)
                .Range("C" & nub) = dicAddress.Keys()(r)
                .Range("D" & nub) = wsAdd.Range("C" & rw + 1)
                .Range("E" & nub) = wsAdd.Name
                nub = nub + 1
            End With
        Next r
        dicAddress.RemoveAll
        dicKont.RemoveAll
    Next i
    dicCity.RemoveAll
Next x
Set dicWs = Nothing
Set dicCity = Nothing
Set dicAddress = Nothing
Set dicKont = Nothing
Application.ScreenUpdating = True
End Sub
Изменено: Dmitriy XM - 11.11.2020 12:38:38
 
Mershik, спасибо!! протестила на шаблоне вроде все ок.
пойду тестить на реальном списке.

Не перевелись еще богатыри на нашей земле!
Поклон тебе от нашего отдела :)  
 
Dmitriy XM, огромное спасибо) и Вам поклон от нашего отдела :)
Страницы: 1
Наверх