Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2016, 10:48   #1
Anastasia5
Пользователь
 
Регистрация: 20.11.2016
Сообщений: 16
По умолчанию Уменьшение массива с повторяющимися значениями

Добрый день!
Есть табличка с повторяющимися названиями городов в столбцах и некоторыми показателями.
Например, Тула-Кострома-6, Кострома-Тула-1.
Требуется представить таблицу в виде Тула-Кострома-7 (сумма значений).
Таблица соответственно уменьшится в 2 раза.
Во вложении - то, что имею в виду (xlsx ver. Windows 2010).
Буду признательна за совет, как сделать это автоматически. Прошу оставить встроенные формулы в файле.
Вложения
Тип файла: zip Тех.вопрос_уменьшение.zip (6.6 Кб, 4 просмотров)

Последний раз редактировалось Anastasia5; 23.11.2016 в 10:56.
Anastasia5 вне форума Ответить с цитированием
Старый 23.11.2016, 11:31   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Вариант решения. Лист2. Допили по нужде
Вложения
Тип файла: xlsx Техвопрос.xlsx (20.9 Кб, 15 просмотров)
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 23.11.2016, 12:07   #3
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Александр, снимаю шляпу, но макросом ИМХО удобнее
Код:
Sub Anastasia5()
Dim v(), i&, j&, k&, di As Object
  Set di = CreateObject("scripting.dictionary")
  v = Range("A1", Cells(Rows.Count, "C").End(xlUp)).Value
  k = 1
  For i = 2 To UBound(v)
    If Not di.exists(v(i, 1) & v(i, 2)) Then
      If Not di.exists(v(i, 2) & v(i, 1)) Then
        k = k + 1
        For j = 1 To 3
          v(k, j) = v(i, j)
        Next
        j = 0
        di(v(i, 1) & v(i, 2)) = k
      Else
        j = di(v(i, 2) & v(i, 1))
      End If
    Else
      j = di(v(i, 1) & v(i, 2))
    End If
    If j Then v(j, 3) = v(j, 3) + v(i, 3)
  Next
  Range("G1").Resize(k, 3).Value = v
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 23.11.2016, 12:13   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Можно так:
Код:
Private Sub CommandButton1_Click()
    Dim i As Long, s As String, a(), q: Application.ScreenUpdating = False
    a = Range("A2:C" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    Set q = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(a, 1)
        s = a(i, 1) & "|" & a(i, 2)
        If q.Exists(s) Then
            q.Item(s) = q.Item(s) + a(i, 3)
        Else
            s = a(i, 2) & "|" & a(i, 1)
            If q.Exists(s) Then q.Item(s) = q.Item(s) + a(i, 3) Else q.Add s, a(i, 3)
        End If
    Next
    Range("G2:I" & Cells(Rows.Count, "G").End(xlUp).Row + 1).Delete xlUp
    With [G2].Resize(q.Count)
        .Value = Application.Transpose(q.Keys)
        .TextToColumns [G2], DataType:=xlDelimited, Other:=True, OtherChar:="|"
        .Resize(, 3).Borders.LineStyle = xlContinuous
    End With
    [I2].Resize(q.Count).Value = Application.Transpose(q.Items)
End Sub
Пример во вложении. Откройте файл и нажмите кнопку "Сформировать"
Вложения
Тип файла: rar Тех.вопрос_уменьшение.rar (17.8 Кб, 8 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 24.11.2016, 01:01   #5
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

На самом деле лучше не проверять словарь/коллекцию с тем или другим ключом, а формировать однозначный ключ для данной пары строк: меньшая строка & большая строка. Число обращение к словарю/коллекции существенно сокращается:
Код:
Sub Anastasia51()
Dim v(), i&, j&, k&, cl As New Collection, key$
  v = Range("A1", Cells(Rows.Count, "C").End(xlUp)).Value
  k = 1
  On Error Resume Next
  For i = 2 To UBound(v)
    If v(i, 1) < v(i, 2) Then key = v(i, 1) & v(i, 2) Else key = v(i, 2) & v(i, 1)
    j = cl(key)
    If Err Then
      k = k + 1
      For j = 1 To 3: v(k, j) = v(i, j): Next
      cl.Add k, key
      Err.Clear
    Else
      v(j, 3) = v(j, 3) + v(i, 3)
    End If
  Next
  Range("G1").Resize(k, 3).Value = v
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение массива не повторяющимися числами. Armageddets Помощь студентам 6 29.04.2015 23:28
Подсчет количества строк с повторяющимися значениями jugelik Microsoft Office Excel 1 07.07.2011 13:14
Закрашивание строк с повторяющимися значениями SergioSolo Microsoft Office Excel 3 08.02.2011 23:07
Удаление строк с повторяющимися значениями satten Microsoft Office Excel 11 01.12.2009 07:50
работа с повторяющимися значениями в DBGrid-e GhostBZ БД в Delphi 6 01.09.2009 13:44