Dim Sh As Worksheet, Sh1 As Worksheet, rng As Range, Key
Set C_i = CreateObject("scripting.dictionary")
Set Sh = ThisWorkbook.Worksheets("Исходные_данные")
Set Sh1 = ThisWorkbook.Worksheets("Данные_на_выходе")
Last = Sh.Cells(Sh.Rows.Count, "A").End(xlUp).Row
dx = Sh.Range("A1:J" & Last)
For n = 2 To UBound(dx)
Key = dx(n, 1) & "_" & dx(n, 3) & "_" & dx(n, 5)
If C_i.Exists(Key) Then
dz = C_i.Item(Key)
dz(1, 4) = dz(1, 4) + dx(n, 4)
dz(1, 8) = dz(1, 8) + dx(n, 8)
C_i.Item(Key) = dz
Else
C_i.Item(Key) = Sh.Range("a" & n).Resize(1, UBound(dx, 2)).Value
End If
Next
Items = C_i.Items
Last = Sh1.Cells(Sh.Rows.Count, "A").End(xlUp).Row
If Last > 1 Then
Sh1.Range("A2:J" & Last).ClearContents
End If
For n = 0 To C_i.Count - 1
dz = Items(n)
Sh1.Range("A" & (n + 2)).Resize(1, UBound(dz, 2)) = dz
Next
Необходимо произвести суммирование значений по полю "Мес. ФЗП, руб." по одинаковым строкам и "количество штатных единиц", остальные данные остаются неизменными. Вывести на отдельный лист уникальные строки (которые не схлопывались) и строки которые схлопнулись вместе в одну с учетом обновленных значений в них.
Остальное получилось самой прикрутить, а вот в этом загвоздка.
Заплатить много не смогу, но чем Бог послал поделюсь- иначе дыба, оплатить могу на номер мобильного.
В качестве бонуса, если вы будете не против поделюсь Вашим решением со ссылкой на Вас с остальными в другом разделе. . Спасибо.
kuklp или кто нибудь подскажите пожалуйста неразумным, а как и где можно подравить код чтобы отбор был не только по столбцу наименование, но И по столбцу магазин например Спасибо.
Приветствую повелителей кода и начинающих дарований!
Ребят подскажите неразумным как можно прикрутить в ключь дополнительные столбцы, чтобы при Сложении одинаковых строк учитывался признак по нескольким столбцам, например рабочий код который берет данные по столбцу "Наименование" на листе один и по нему складывает необходимые значение.
Код
Sub test()
Dim coll As New Collection, src(), dst(), i As Long, m As Long, txt As String
' Создание массива уникальных значений по столбцу "Наименование" на Лист1
With ThisWorkbook.Worksheets("Лист1")
m = .Cells(1, 2).End(xlDown).Row
src = .Range(.Cells(1, 2), .Cells(m, 2)).Value
On Error Resume Next
For i = 2 To UBound(src, 1)
txt = Trim$(src(i, 1))
coll.Add txt, txt
Next
On Error GoTo 0
ReDim dst(1 To coll.Count, 1 To 1)
For i = 1 To coll.Count
dst(i, 1) = coll(i)
Next
End With
' Вставка массива уникальных значений и подсчет сумм формулами =СУММЕСЛИ() на Лист2
With ThisWorkbook.Worksheets("Лист2")
.Cells(2, 2).Resize(coll.Count).Value = dst()
.Cells(2, 4).Resize(coll.Count).FormulaR1C1 = "=SUMIF('Лист1'!R2C2:R" & m & "C2,RC2,'Лист1'!R2C:R" & m & "C)"
.Cells(2, 5).Resize(coll.Count).FormulaR1C1 = "=SUMIF('Лист1'!R2C2:R" & m & "C2,RC2,'Лист1'!R2C:R" & m & "C)"
.Cells(2, 7).Resize(coll.Count).FormulaR1C1 = "=SUMIF('Лист1'!R2C2:R" & m & "C2,RC2,'Лист1'!R2C:R" & m & "C)"
End With
End Sub
Как сделать чтобы условием был не один столбец "Наименование", а предположим по столбцам "Наименование" И "Группа" И "Подгруппа" чтобы одинаковые строки также суммировались- ума не приложу как подкрутить.
Образцы в приложении- заранее благодарки всем неравнодушным.
ребята из безопасности не дали добро на изменение реестра= без него швах, печально....
Для использования сценариев со скриптами для автоматической обработки входящих писем необходимо внести изменения в реестр: Чтобы это исправить, вам нужно установить значение EnableUnsafeClientMailRules в реестре, а затем перезапустить Outlook.
Outlook 2016 HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 16.0 \ Outlook \ Security DWORD: EnableUnsafeClientMailRules Значение: 1
Outlook 2013 HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 15.0 \ Outlook \ Security DWORD: EnableUnsafeClientMailRules Значение: 1
Outlook 2010 HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 14.0 \ Outlook \ Security DWORD: EnableUnsafeClientMailRules Значение: 1
Пользователи Office, использующие правила выполнения сценариев, обнаруживают, что их сценарии в настоящее время отключены (как и « Запуск приложения» ) благодаря обновлению безопасности. Когда обновление установлено, все существующие правила запуска сценариев и запуска приложений будут отключены.
БМВ спасибо. Будем подтягивать мат часть . =это уже прогресс, а как автоматически по теме входящего письма запускать макрос и отправить сфоррмированный макросом файл ответным письмом на почтовый адрес с которого был направлен запрос?
Да у меня если все получиться= весь код который у меня получится приложу- основная помощь в подсказках нужна в этом куске:"По идее необходимо при получении входящего письма макросом excel или в макросом outloock получить почту отправителя, сверить данные отправителя с базой контактов outloock, выгрузить наименование подразделения" и в этом "дальше отправить этот файл ответным письмом на почтовый адрес с которого был направлен запрос"
Цитата
БМВ написал: - что за база? Если контакты, то какие, личные, GlobalAB ...
База хз как правильно называется- та которая нажимаешь на кому и открывается окошко "Глобальный список адресов", там есть раздел "Отдел"- вот ума не приложу как наименование отдела вытаскивать из входящего по почте адресата письма макросом. Возможно просто искать по адресу электронной почты в файле и уже по этому фильтровать большой файл excel(он содержит почты) = я не знаю как лучше и куда правильнее начать копать= т.е. то что фактически реализуемо.
Мне бы образцы решений подглядеть подобных ( может были аналогичные решение где кусочек кода можно подсмотреть и понять откуда и что к чему прикручивать)- или подсказать что из чего, какие это объекты может сама бы чего написала, а дальше я сама прикручу, что попроще.
Чуть попозже выложу свою часть кода как его дошлифую и приведу в божеский вид.
Братцы, сестры и Гуру программирования подскажите пожалуйста как быть и возможно с чего начать: в ходе работы столкнулась с необычной задачей: На почту outloock периодически (очень часто) приходят письма с однотипными запросами (с конкретной темой письма) по которому надо ответить выгрузив кусок таблицы одной и той же большой таблицы по подразделению. По идее необходимо при получении входящего письма макросом excel или в макросом outloock получить почту отправителя, сверить данные отправителя с базой контактов outloock, выгрузить наименование подразделения, далее открыть файл excel ( с этого момента моих знаний наверно хватит) по наименованию подразделению, провести фильтрацию по наименованию подразделения в файле, скопировать кусочек файла excel в новый файл, сохранить новый файл, дальше отправить этот файл ответным письмом на почтовый адрес с которого был направлен запрос (тут моих знаний снова не хватает).
Если все получится= как всегда по итогу выложу полную версию адаптированного рабочего кода, который смогут использовать другие для своих нужд. Заранее спасибо за любую помощь или добрый совет.
Set d = CreateObject("Scripting.Dictionary"): d.comparemode = 1
......................
d.item(t) = .Cells(i, 7) & "|" & .Cells(i, 7)
про такие вещи как :
Скрытый текст
Код
Dim a(), mad As Object, mdd As Object, dvd As Object, kmd As Object
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
On Error GoTo err_
Select Case Target.Address(0, 0)
Case "G6": filldict
[h6:k6].ClearContents
[h6:k6].Validation.Delete
a = mad.Item([g6].Value).keys
[h6].Validation.Add Type:=xlValidateList, Formula1:=Join(a, ",")
Case "H6": filldict
[I6:k6].ClearContents
[I6:k6].Validation.Delete
a = mdd.Item([g6].Value & "|" & [h6].Value).keys
[i6].Validation.Add Type:=xlValidateList, Formula1:=Join(a, ",")
Case "I6": filldict
[J6:k6].ClearContents
[J6:k6].Validation.Delete
a = dvd.Item([g6].Value & "|" & [h6].Value & "|" & [i6].Value).keys
[j6].Validation.Add Type:=xlValidateList, Formula1:=Join(a, ",")
Case "J6": filldict
[k6].ClearContents
[k6].Validation.Delete
a = kmd.Item([g6].Value & "|" & [h6].Value & "|" & [i6].Value & "|" & [j6].Value).keys
If UBound(a) = 0 Then [k6] = a(0) Else [k6].Validation.Add Type:=xlValidateList, Formula1:=Join(a, ",")
End Select
err_:
Application.EnableEvents = True
End Sub
Sub filldict()
Dim i&, t$
Set mad = CreateObject("Scripting.Dictionary")
Set mdd = CreateObject("Scripting.Dictionary")
Set dvd = CreateObject("Scripting.Dictionary")
Set kmd = CreateObject("Scripting.Dictionary")
a = [a3:e18].Value
For i = 1 To UBound(a)
t = a(i, 1)
If Not mad.exists(t) Then mad.Add t, CreateObject("Scripting.Dictionary")
mad.Item(t).Item(a(i, 2)) = 0&
t = a(i, 1) & "|" & a(i, 2)
If Not mdd.exists(t) Then mdd.Add t, CreateObject("Scripting.Dictionary")
mdd.Item(t).Item(a(i, 3)) = 0&
t = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3)
If Not dvd.exists(t) Then dvd.Add t, CreateObject("Scripting.Dictionary")
dvd.Item(t).Item(a(i, 4)) = 0&
t = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4)
If Not kmd.exists(t) Then kmd.Add t, CreateObject("Scripting.Dictionary")
kmd.Item(t).Item(a(i, 5)) = 0&
Next
[g6].Validation.Delete
[g6].Validation.Add Type:=xlValidateList, Formula1:=Join(mad.keys, ",")
End Sub
даже осмыслить страшновато)
просто не понятны еще такие конструкции - понять не могу как формируются, материала Очень много но пока до него не совсем дорос, только блуждаю по мелководью да присматриваюсь. мне бы примеры- чем проще и тупее (совсем для новичков) с описанием - может и сам чего то да сподобился........когда мастодонты описывают макросы с использованием нескольких словарей в сложных макросах у меня честно глаза выползают из орбит и мозг лопается...... если не трудно поясните немного механизм формирования и работы со словарями на простых примерах (на Любых- чем проще тем лучше) пока въехать не могу......
JeyCi написал: просто: из списка собрать словарь dicSheets (в ключи - sh.Names списка),потом цикл For Each sh in Thisworkbook.Sheets.. по листам ! с проверкой в словаре:If Not dicSheets.exists(sh.Name) Then sh.Delete
Подскажите пожалуйста как это будет выглядеть в коде целиком, просто я пока только стараюсь учиться и далеко не все так легко с ходу могу понять что к чему........словари для меня тайная комната.........
Уххх сложно было, нон оно работает ^_^= ловите, может кому сгодиться.
Код
Dim s As Object, a As Variant, z As Integer, d As Boolean, zojberg As Variant
a = WorksheetFunction.Transpose(Worksheets("check").Range(Worksheets("check").Cells(1, 7), Worksheets("check").Cells(iLastRow, 7)))
Application.DisplayAlerts = False
For Each s In Sheets
d = True
For z = LBound(a) To UBound(a)
If s.Name = a(z) Then d = False
Next z
If d Then s.Delete
Next s
Application.DisplayAlerts = True
Доброго всем. Подскажите где тут ошибка (пытаюсь перекрутить ранее подсказанный добрыми ребятами с этого форума под новые нужды) и как ее можно исправить чтобы по заданным наименованиям в столбце 7 начиная с сell(1,7) и до последней ячейки в столбце названия Сравнивались с текущими названиями листов в книге И Удалялись если не совпадают.
Код
iLastRow = Cells(3, 7).End(xlDown).Row ' последняя заполненная ячейка в столбце с именами листов
For i = 1 To iLastRow
If a = Worksheets("check").Cells(i, 7).Value Then
For Each Worksheet In ThisWorkbook.Sheets
If a <> Worksheet.Name Then
Worksheet.Delete
End If
On Error Resume Next
Next
i = i + 1
End If
On Error Resume Next
Next
Юрий хотелось просто не усложнять и не отвлекать, а выложить уже потом целиковую рабочую версию, раз Вам она необходима, то прикладываю. Еще раз спасибо что нашли время.
Доброй ночи мастерам макросов и сложных вычислений. В очередной раз окунувшись с головой в непростую науку постижения и использования макросов бьюсь со следующей задачкой: На основе игр с юзер формой и фильтрами получаю некий массив данных в listbox (это получилось) на основе его необходимо осуществить поиск с суммированием по разношерстным листам, ключи поиска (названия листов) представлены в массиве, вот чешу репку и прикинуть не могу дальше быть.........
Скрытый текст
Код
кусок рабочего кода, но с ним проблем нет=выложу позднее итоговый файл с решением задачки как докручу
Dim iCond(), iFilter1(), iFilter2(), iFilter3(), iFilter4(), iColumn(), iSheet(), iLeft(), iUp(), iCont(), iFile() As String
Dim iEnbl_1(), iEnbl_2(), iEnbl_3(), iEnbl_4_row(), iEnbl_temp(), iEnbl(), NRow, NFile, NReg, iCount_1, iCount_2, iCount_3, iCount_4, a, iRow() As Integer
Dim CheckVar As Boolean
Private Function GetFileName(myAddress As String) As String
GetFileName = Right(myAddress, Len(myAddress) - InStrRev(myAddress, "\"))
End Function
Private Sub UserForm_Initialize()
NRow = ThisWorkbook.Sheets("Sources").Cells(1, 10).End(xlDown).Row
For i = 1 To NRow
lb_rows.AddItem (ThisWorkbook.Sheets("Sources").Cells(i, 10).Value)
Next i
ob_all_1 = True
CheckVar = False
End Sub
Private Sub ob_select_1_Click()
If ob_select_1 = True Then f_1_2.Visible = True
End Sub
Private Sub ob_all_1_Click()
If ob_all_1 = True Then f_1_2.Visible = False
End Sub
Private Sub Selection1()
x = 0
ReDim iEnbl_1(1 To 1)
For i = 1 To NRow
cond = 0
For j = 1 To a
If ThisWorkbook.Sheets("Sources").Cells(i, 11) = iFilter1(j) Then
cond = 1
Exit For
End If
Next j
If cond = 1 Then
x = x + 1
ReDim Preserve iEnbl_1(1 To x)
iEnbl_1(x) = i
End If
Next i
iCount_1 = x
End Sub
Private Sub cb_filter_rows_Click()
CheckVar = True
Call click_filter_row
lb_rows.Clear
For i = 1 To iCount_1
lb_rows.AddItem (ThisWorkbook.Sheets("Sources").Cells(iEnbl_1(i), 10))
Next i
End Sub
Private Sub click_filter_row()
If ob_all_1 = True Then
a = 0
Else
a = 0
ReDim iFilter1(1 To 1)
If cbfin.Value = True Then
a = a + 1
ReDim Preserve iFilter1(1 To a)
iFilter1(a) = "okl"
End If
If cbnat.Value = True Then
a = a + 1
ReDim Preserve iFilter1(1 To a)
iFilter1(a) = "sd"
End If
End If
If a = 0 Or a = 2 Then
ReDim iEnbl_1(1 To NRow)
For i = 1 To NRow
iEnbl_1(i) = i
Next i
iCount_1 = NRow
Else
Call Selection1
For i = 1 To iCount_2
lb_rows.AddItem (ThisWorkbook.Sheets("Sources").Cells(iEnbl_1(i), 10))
Next i
End If
'------------------------------------------------------------------------------------------
'-----------------------------------------------------------------------------------------------------------------
'MsgBox (iCount_2 & ", " & iEnbl(1))
End Sub
Подскажите бобрику люди знающие да ведающие как можно прикрутить или что можно посмотреть или подсмотреть чтобы ручки выправить.
Заранее спасибо большое за уделенное время= всем хорошего настроения.
Михаил Лебедев спасибо огромное = помогло, блуждая в темных коридорах попыток также нашел еще 1 решение - переименовывать в теле цикла текущие листы с помощью ActiveSheet.Name = [DO105].Value & "B" тогда во втором цикле листы получались короткие, также похоже код раньше похоже сбоил если в названиях листа есть пробелы (теперь все ок).
Sanja да сам алгоритм уже создан (даже не один, а несколько циклов по нескольким мастер листам) и работает, проблема именно в том, что при первичном использовании Любого из алгоритмов-циклов= все идеально, однако если любой из них в Любой последовательности запустить вторым, то пропадает подпись у столбца с заданной подписью из ячейки . Основная процедура запускает последовательно 4 цикла....в первом (какой бы он ни был) все идеально...в остальных слетает....как то так.
Sanja в самом начале кратко описал суть = "в теле макроса если задать переменными смену подписи в столбце диаграммы из заданного диапазона/ячейки то при запуске отдельного макроса он его видит и его выполняет, а если цикл запускается после другого цикла то нет".
К сожалению испробование еще переименование листа по циклу ActiveSheet.Name = [DP105].Value тоже не помогло, хотя странно.
Загрузил запрошенный пример. если запустить цикл один раз =все отлично, если запустить его дважды (или аналогичный цикл с другими переменными то подписи ко второму столбцу пропадают и ничего не помогает)
К сожалению вариант тот же...почему-то по какой-то причине если имя листа содержит () например мастерАШЕ (2) или мастерАШЕ (3) то функция просто не работает, а если лист переименовать в любой без () например "мастердва" то все работает.........проблема в том как мне теперь задать имена листов корректно чтобы читала функция внутри цикла....
после дополнительных пары часов -обнаружил, что если наименование текущего листа содержит (), например мастерАШЕ (2) то функция не пашет.....а листы размножаются аж до мастерАШЕ (99).....хмм как бы обойти данную проблемку.......
Работая с размножением диаграмм бьюсь лбом об стенку над одной выявленной странностью:
Код
shtName33 = ActiveSheet.Name 'получаем имя текущего листа
major33 = shtName33 & "!$EA$105" 'получаем строку адреса в код ActiveChart.FullSeriesCollection(2).DataLabels.Select
ActiveChart.SeriesCollection(2).DataLabels.Format.TextFrame2.TextRange. _
InsertChartField msoChartFieldRange, "=" & major33, 0 ', в оригинале выглядит если без переменных то выглядит так "=Лист5!$EA$105",0
Selection.ShowRange = True 'показываем подпись на графике
Selection.ShowValue = False 'убираем старую подпись от данных
в теле макроса если задать переменными смену подписи в столбце диаграммы из заданного диапазона/ячейки то при запуске отдельного макроса он его видит и его выполняет, а если цикл запускается после другого цикла то нет....... ребят может кто подскажет из-за чего вообще и может научит уму-разуму.
C учетом проделанной работы по автопостроению, вот обещанный результат, надеюсь ребятам поможет:
Скрытый текст
Код
SUb AUTOGRAF()
Sheets("ИСТОЧНИК").Activate
adu = Cells(Rows.Count, "F").End(xlUp).Row
ActiveWorkbook.Worksheets("ИСТОЧНИК").Sort.SortFields. _
Clear
ActiveWorkbook.Worksheets("ИСТОЧНИК").Sort.SortFields. _
Add Key:=Range("F2:F" & adu), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("ИСТОЧНИК").Sort
.SetRange Range("F1:H" & adu)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("П_В_ZERO").Sheets("ИСТОЧНИК").Activate
Dim LastRow99 As Long, zi As Long, Block, Uniq As New Collection, Arr(), FreeRow As Long, Sht As Worksheet
Application.DisplayAlerts = False 'Отключили "лишние" запросы ))
Application.ScreenUpdating = False 'Отключили обновление экрана (чтобы не мельтешило)
LastRow99 = Cells(Rows.Count, 6).End(xlUp).Row 'Узнали номер последней заполненной строки на активном листе
Arr = Range(Cells(2, 6), Cells(LastRow99, ).Value 'Забрали диапазон в массив
For zi = 1 To UBound(Arr) 'Цикл по массиву
On Error Resume Next 'Игнорируем ошибку
Uniq.Add Arr(zi, 1), CStr(Arr(zi, 1)) 'Отбираем в коллекцию уникальные значения из первого столбца
Next
For Each Block In Uniq 'ПЕребираем циклом элементы коллекции
FreeRow = 105 'Присвоили переменной номер строки, с которой будем начинать заполнение таблиц на новых листах
Sheets("мастер").Copy After:=Sheets(Sheets.Count) 'Копируем мастер-лист правее последнего листа
ActiveSheet.Name = Block 'Присвоили новому листу имя (текущее в цикле уникальное значение из коллекции)
For zi = 1 To UBound(Arr) 'Цикл по массиву
If Arr(zi, 1) = Block Then 'Если значение элемента первого столбца массива равно значению элемента коллекции, то
Cells(FreeRow, 119) = Arr(zi, 1) 'Заполняем на новом листе табличку
Cells(FreeRow, 120) = Arr(zi, 2)
Cells(FreeRow, 121) = Arr(zi, 3)
FreeRow = FreeRow + 1 'Увеличили на еденичку значение переменной - подготовили номер следующей свободной строки
End If
Next
Dim lLastRow33 As Long
lLastRow33 = Cells(Rows.Count, 120).End(xlUp).Row
Range("DP105:DQ" & lLastRow33).Select
Application.CutCopyMode = False
Selection.Copy
ActiveSheet.ChartObjects(1).Activate
ActiveChart.Paste
ActiveChart.ChartArea.Select
ActiveChart.FullSeriesCollection(1).Select
ActiveChart.Legend.Select
Selection.Delete
ActiveChart.ChartArea.Select
ActiveChart.PlotArea.Select
Selection.ClearFormats
ActiveChart.Axes(xlValue).MajorGridlines.Select
Selection.Delete
ActiveChart.ChartArea.Select
ActiveChart.Axes(xlValue).Select
ActiveChart.FullSeriesCollection(1).Select
ActiveChart.FullSeriesCollection(1).ApplyDataLabels
ActiveChart.Axes(xlValue).Select
Selection.Delete
Next
Application.ScreenUpdating = True 'Включили тревоги
Application.DisplayAlerts = True 'Включили обновление экрана
Workbooks("П_В_ZERO").Calculate
Worksheets.Select
nameTablo = Sheets("Титул").Range("CX130").Value
rakel = Trim(Left(nameTablo, 10) & ".pdf")
MyPath = "C:\сек\архив\"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=MyPath & rakel, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
MsgBox "Данные успешно сохранены в файл и готов!-Спасибо L0la i Planeta excel", vbInformation, "База"
end sub