Добрый день. Столкнулся со следующей задачей Имеется два массива: Массив 1 – типовой набор строк из трех столбцов: Наименование, Ед.Изм., Стоимость Массив 2 – дополнительный, также состоит из трех столбцов (поля идентичны: Наименование, Ед.Изм., Стоимость).
Необходимо: 1.Получить результирующий массив, на основе массива 1, при этом по полю Стоимость просуммировать только те строчки, у которых первые два поля совпадают. [vba]
Код
Private Sub CommandButton1_Click() Dim arrMyArray1() As Variant Dim arrMyArray2() As Variant arrMyArray1 = Range("Массив1").Value arrMyArray2 = Range("Массив2").Value For i = 1 To UBound(arrMyArray2) For j = 1 To UBound(arrMyArray1) If arrMyArray2(i, 1) & arrMyArray2(i, 2) = arrMyArray1(j, 1) & arrMyArray1(j, 2) Then arrMyArray1(j, 3) = arrMyArray1(j, 3) + arrMyArray2(i, 3) End If Next j Next i Me.ListBox2.List = arrMyArray1 End Sub
[/vba]
2. Добавить в результирующий массив строку из массива 2, которая отсутствует в массиве 1. Данная строка может, как присутствовать, так и отсутствовать в массиве 1. Так же их может быть несколько..
Сравнивать данные массивы необходимо по первым двум полям (см.- помечено зеленым)
По первому пункту вроде как разобрался, прошу помощи по второму. Так же принимаются замечания по решению на первый пункт.
Добрый день. Столкнулся со следующей задачей Имеется два массива: Массив 1 – типовой набор строк из трех столбцов: Наименование, Ед.Изм., Стоимость Массив 2 – дополнительный, также состоит из трех столбцов (поля идентичны: Наименование, Ед.Изм., Стоимость).
Необходимо: 1.Получить результирующий массив, на основе массива 1, при этом по полю Стоимость просуммировать только те строчки, у которых первые два поля совпадают. [vba]
Код
Private Sub CommandButton1_Click() Dim arrMyArray1() As Variant Dim arrMyArray2() As Variant arrMyArray1 = Range("Массив1").Value arrMyArray2 = Range("Массив2").Value For i = 1 To UBound(arrMyArray2) For j = 1 To UBound(arrMyArray1) If arrMyArray2(i, 1) & arrMyArray2(i, 2) = arrMyArray1(j, 1) & arrMyArray1(j, 2) Then arrMyArray1(j, 3) = arrMyArray1(j, 3) + arrMyArray2(i, 3) End If Next j Next i Me.ListBox2.List = arrMyArray1 End Sub
[/vba]
2. Добавить в результирующий массив строку из массива 2, которая отсутствует в массиве 1. Данная строка может, как присутствовать, так и отсутствовать в массиве 1. Так же их может быть несколько..
Сравнивать данные массивы необходимо по первым двум полям (см.- помечено зеленым)
По первому пункту вроде как разобрался, прошу помощи по второму. Так же принимаются замечания по решению на первый пункт.and_evg
По-моему классический вариант на словари Как-то типа вот так [vba]
Код
Private Sub CommandButton1_Click() Dim arIt ar1 = Range("Массив1") ar2 = Range("Массив2") Set slov = CreateObject("Scripting.Dictionary") With slov For i = 1 To UBound(ar1) .Add ar1(i, 1) & "|" & ar1(i, 2), ar1(i, 3) Next i For j = 1 To UBound(ar2) k_ = ar2(j, 1) & "|" & ar2(j, 2) .Item(k_) = .Item(k_) + ar2(j, 3) Next j ReDim arIt(1 To .Count, 1 To 3) For g = 1 To .Count sp = Split(.keys()(g - 1), "|") arIt(g, 1) = sp(0) arIt(g, 2) = sp(1) arIt(g, 3) = .Items()(g - 1) Next g End With Me.ListBox2.List = arIt End Sub
[/vba]
По-моему классический вариант на словари Как-то типа вот так [vba]
Код
Private Sub CommandButton1_Click() Dim arIt ar1 = Range("Массив1") ar2 = Range("Массив2") Set slov = CreateObject("Scripting.Dictionary") With slov For i = 1 To UBound(ar1) .Add ar1(i, 1) & "|" & ar1(i, 2), ar1(i, 3) Next i For j = 1 To UBound(ar2) k_ = ar2(j, 1) & "|" & ar2(j, 2) .Item(k_) = .Item(k_) + ar2(j, 3) Next j ReDim arIt(1 To .Count, 1 To 3) For g = 1 To .Count sp = Split(.keys()(g - 1), "|") arIt(g, 1) = sp(0) arIt(g, 2) = sp(1) arIt(g, 3) = .Items()(g - 1) Next g End With Me.ListBox2.List = arIt End Sub