Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Сложение массивов - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Сложение массивов (Макросы/Sub)
Сложение массивов
and_evg Дата: Вторник, 10.10.2017, 14:45 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
Добрый день.
Столкнулся со следующей задачей
Имеется два массива:
Массив 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. Так же их может быть несколько..

Сравнивать данные массивы необходимо по первым двум полям (см.- помечено зеленым)

По первому пункту вроде как разобрался, прошу помощи по второму. Так же принимаются замечания по решению на первый пункт.
К сообщению приложен файл: 5627696.xls (66.5 Kb)


Сообщение отредактировал and_evg - Вторник, 10.10.2017, 14:53
 
Ответить
СообщениеДобрый день.
Столкнулся со следующей задачей
Имеется два массива:
Массив 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
Дата добавления - 10.10.2017 в 14:45
_Boroda_ Дата: Вторник, 10.10.2017, 16:03 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
По-моему классический вариант на словари
Как-то типа вот так
[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]
К сообщению приложен файл: 5627696_1.xls (55.0 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеПо-моему классический вариант на словари
Как-то типа вот так
[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]

Автор - _Boroda_
Дата добавления - 10.10.2017 в 16:03
and_evg Дата: Среда, 11.10.2017, 08:26 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
_Boroda_, Спасибо! Как всегда лаконично и точно!
 
Ответить
Сообщение_Boroda_, Спасибо! Как всегда лаконично и точно!

Автор - and_evg
Дата добавления - 11.10.2017 в 08:26
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Сложение массивов (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!