VBA Скопировать и вставить в новый лист на основе даты подтверждения

Я пытаюсь изменить VBA @Glitch_Doctor, работая со мной. Диапазон «Описание» изменился на вкладке «Новый ПО» и должен суммироваться в текстовой форме на вкладке «ПО». У меня все работает, он копирует текст в соответствующий столбец и строку, но не суммирует то, что находится в диапазоне C21: C44. Цените чью-либо помощь в получении новых данных в соответствии с категорией и датой, которой она в настоящее время не занимается.

Это новые элементы, добавленные в код:

Dim Dsc As Variant Dsc = Sheets("New PO").Range("C21:C44") For Each cell In Description 'To get the row number then total the required information If cell.Text = Count Then Row = cell.Row Dsc = Dsc + Sheets("NEW PO").Range("C21:C44" & Row).Text End If Next cell 

Это полный VBA:

 Sub Copy_Data() Dim Count, Qty As Long Dim CatRng, MonthRng, SDate, CxlDate, PoNumb, Vendor, Description As Range Dim Total As Currency Dim StrTarget As String Dim Dsc As Variant Dim Row, PORow, Col As Integer With Sheets("NEW PO").Range("I21:I44").Copy End With With Sheets("NEW PO").Range("G21:G44") .PasteSpecial xlPasteValues, , False, False End With Range("A1").Select Application.CutCopyMode = False Set CatRng = Sheets("NEW PO").Range("G21:G44") Set MonthRng = Sheets("POs").Range("M122:X122") StrTarget = Sheets("New PO").Range("W12") Set SDate = Sheets("New PO").Range("U12") Set CxlDate = Sheets("New PO").Range("U13") Set PoNumb = Sheets("New PO").Range("N10") Set Vendor = Sheets("New PO").Range("D14") Set Description = Sheets("New PO").Range("C21:C44") Dsc = Sheets("New PO").Range("C21:C44") Count = 0 For Count = 0 To 99 Total = 0 Qty = 0 'So that the values reset each time the cat changes For Each cell In CatRng 'To get the row number then total the required information If cell.Value = Count Then Row = cell.Row Qty = Qty + Sheets("NEW PO").Range("T" & Row).Value Total = Total + Sheets("NEW PO").Range("AA" & Row).Value 'I guessed ext cost only as it has been totaled at the bottom, 'this is easily changed though End If Next cell For Each cell In Description 'To get the row number then total the required information If cell.Text = Count Then Row = cell.Row Dsc = Dsc + Sheets("NEW PO").Range("C21:C44" & Row).Text End If Next cell 'Now put the totals into a PO only if there is a quantity of items If Qty > 0 Then PORow = Sheets("POs").Range("L1048576").End(xlUp).Row + 1 'I'll let you sort the PO number and other fields out but the main 3 are done below With Sheets("POs") .Range("I" & PORow).Value = Qty .Range("L" & PORow).Value = Count .Range("C" & PORow).Value = SDate .Range("D" & PORow).Value = CxlDate .Range("B" & PORow).Value = PoNumb .Range("F" & PORow).Value = Vendor .Range("H" & PORow).Value = Dsc 'My understanding here is that the target month in U12 is in the same format as 'the anticipated Receipt month, I hope this is what you were looking for For Each cell In MonthRng If cell.Value = StrTarget Then Col = cell.Column .Cells(PORow, Col).Value = Total 'Used .cells here as both column and row are now integers '(only way i can ever get it to work) End If Next cell End With End If Next Count End Sub 

Ссылка на рабочий файл: https://www.dropbox.com/s/l2ikw6cr0rqzde8/Inventory%20Plan%20Sample.xlsm?dl=0

Захват экрана с новой вкладкой PO, вкладкой PO, вкладкой PO после макросов. Screen Capture of Tabs

Если вы хотите подсчитать уникальные значения в C21: C44 за ваш предыдущий комментарий, то примеры кода здесь (подсчет уникальных значений в Excel ) должны работать на вас.

Я протестировал этот ответ ( https://stackoverflow.com/a/36083024/7612553 ), и он работает. Я добавил And cell.Value <> "" чтобы он не And cell.Value <> "" пустые ячейки, переданные функции.

 Public Function CountUnique(rng As Range) As Long Dim dict As Scripting.Dictionary Dim cell As Range Set dict = New Scripting.Dictionary For Each cell In rng.Cells If Not dict.Exists(cell.Value) And cell.Value <> "" Then dict.Add cell.Value, 0 End If Next CountUnique = dict.Count End Function 

Затем вы можете заменить CountUnique(Description) « For Each cell In Description с вызовом CountUnique(Description)

Чтобы словарь работал, вам нужно добавить ссылку на Microsoft Scripting Runtime: Tools> References …> check "Microsoft Scripting Runtime"

Я считаю, что это решило вопрос. Преобразовал Dsc в строку и включил ее в массив Catrng. Dsc="" ссылка была Dsc="" для сброса значения каждый раз, когда массив возвращался

 Sub Copy_Data() Dim Count As Long Dim Qty As Long Dim CatRng As Range Dim MonthRng As Range Dim SDate As Range Dim CxlDate As Range Dim PoNumb As Range Dim Vendor As Range Dim Description As Range Dim Total As Currency Dim StrTarget As String Dim Dsc As String Dim Row As Integer Dim PORow As Integer Dim Col As Integer With Sheets("NEW PO").Range("I21:I44").Copy End With With Sheets("NEW PO").Range("G21:G44") .PasteSpecial xlPasteValues, , False, False End With Range("A1").Select Application.CutCopyMode = False Set CatRng = Sheets("NEW PO").Range("G21:G44") Set MonthRng = Sheets("POs").Range("M122:X122") StrTarget = Sheets("New PO").Range("W12") Set SDate = Sheets("New PO").Range("U12") Set CxlDate = Sheets("New PO").Range("U13") Set PoNumb = Sheets("New PO").Range("N10") Set Vendor = Sheets("New PO").Range("D14") Set Description = Sheets("New PO").Range("C21:C44") Count = 0 For Count = 0 To 99 Total = 0 Qty = 0 Dsc = "" 'So that the values reset each time the cat changes For Each cell In CatRng 'To get the row number then total the required information If cell.Value = Count Then Row = cell.Row Qty = Qty + Sheets("NEW PO").Range("T" & Row).Value Total = Total + Sheets("NEW PO").Range("AA" & Row).Value Dsc = Sheets("NEW PO").Range("C" & Row).Value 'I guessed ext cost only as it has been totaled at the bottom, 'this is easily changed though End If Next cell 'Now put the totals into a PO only if there is a quantity of items If Qty > 0 Then PORow = Sheets("POs").Range("L1048576").End(xlUp).Row + 1 'I'll let you sort the PO number and other fields out but the main 3 are done below With Sheets("POs") .Range("I" & PORow).Value = Qty .Range("L" & PORow).Value = Count .Range("C" & PORow).Value = SDate .Range("D" & PORow).Value = CxlDate .Range("B" & PORow).Value = PoNumb .Range("F" & PORow).Value = Vendor .Range("H" & PORow).Value = Dsc 'My understanding here is that the target month in U12 is in the same format as 'the anticipated Receipt month, I hope this is what you were looking for For Each cell In MonthRng If cell.Value = StrTarget Then Col = cell.Column .Cells(PORow, Col).Value = Total 'Used .cells here as both column and row are now integers '(only way i can ever get it to work) End If Next cell End With End If Next Count End Sub 
Interesting Posts

Изменить размер массива в VBA Excel

Excel VBA: для переменного количества строк между двумя идентификаторами, поиск каждого из числа переменных столбцов для строки

Вызов пользовательской встроенной функции VBA при изменении ячейки Excel

Проблема с ошибкой vba 91 при использовании With, Range и .Find

Excel – удалить второе имя и заменить на первую букву

Слияние Word с данными Excel

Сильное определенное время до даты ячейки

Создание CSV-копии листа Excel

Могу ли я изменить шрифт определенной цифры в ячейке с «общим» форматом

Почему Excel не находит мой DSN системы при переходе на Windows 7?

Применение одного и того же макроса в различных диапазонах

Формула для оценки при сохранении excel

Фильтровать значения электронной таблицы Excel из файла

Обнаружение изменения активного листа – OfficeJS

Автоматизация Excel – отключить диалоговое окно входа SQL при обновлении запросов

Давайте будем гением компьютера.