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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2009, 14:00   #1
Иванов_ДМ
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 96
По умолчанию Соединить два списка в третий

Пожалуйста, помогите!
Нужно сформировать список (с уникальными названиями клиентов) на отдельном листе, объединив в нем значения двух других списков с не уникальными значениями, находящихся на разных листах (клиенты июля и августа).
Заранее спасибо помогающим!
Вложения
Тип файла: rar Списки.rar (5.2 Кб, 15 просмотров)
Иванов_ДМ вне форума Ответить с цитированием
Старый 19.08.2009, 04:55   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Вы не догадываетесь, почему Вам никто не отвечает?
Из чего формировать уникальный список? Какие данные присоединять к этим значениям? В одной ячейке, или в строке по ячейкам?
Лучше всего, в результирующем листе ("Клиенты") напишите, что должно получаться в итоге.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 19.08.2009, 09:30   #3
Иванов_ДМ
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 96
По умолчанию

SAS888 спасибо, что ответили!
3 список - это все клиенты, сработавшие за два месяца.
Есть клиенты, которые сработали только в 1 месяце, есть, которые - только во 2 месяце. Причем клиенты могли отгружать продукцию в каждом месяце несколько раз, соответственно название клиента не уникально в 1 и 2 списке (повторяется).

В третьем списке должен быть перечень клиентов (клиентская база), в котором клиенты 1 и 2 месяца должны быть приведены совокупно, общим списком и каждый клиент должен быть упомянут только 1 раз, посему быть уникальным, без повторов.
Вложения
Тип файла: rar Списки1.rar (5.1 Кб, 27 просмотров)
Иванов_ДМ вне форума Ответить с цитированием
Старый 19.08.2009, 12:17   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Выполните макрос:
Код:
Sub Main()
    Dim i As Long, j As Long, x As New Collection, a()
    Application.ScreenUpdating = False: On Error Resume Next
    For i = 1 To 2
        With Sheets(i): a = .Range(.[A2], .Cells(Rows.Count, 1).End(xlUp)).Value: End With
        For j = 1 To UBound(a, 1)
            x.Add a(j, 1), CStr(a(j, 1))
    Next: Next: On Error GoTo 0
    With Sheets("Клиенты"): For i = 1 To x.Count: Cells(i + 1, 3) = x(i): Next: End With
End Sub
Затем, если нужно, можно применить сортировку.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 19.08.2009, 12:25   #5
Иванов_ДМ
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 96
По умолчанию

Здорово, спасибо!!!
А к слову, если 2 списка, из которых берутся данные, находятся не на двух отдельных листах, а на 1 листе рядом в столбцах А и B?
Как там надо переделать тогда?
Иванов_ДМ вне форума Ответить с цитированием
Старый 19.08.2009, 12:34   #6
Иванов_ДМ
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 96
По умолчанию

И еще вопросик: В макросе нет четкой ссылки на конкретные листы, из которых берутся данные. Ссылка идет только циклом (1,2). А если у меня в файле будет 20 листов, то макрос может обратиться к другим листам.... Как вынуть данные из листов с конкретным названием, а не листов 1,2?
Иванов_ДМ вне форума Ответить с цитированием
Старый 19.08.2009, 13:42   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
если 2 списка, из которых берутся данные, находятся не на двух отдельных листах, а на 1 листе рядом в столбцах А и B?
Тогда так:
Код:
Sub Main()
    Dim j As Long, x As New Collection, a()
    Application.ScreenUpdating = False: On Error Resume Next
    With Sheets("Имя_Листа_ с_данными")
        a = Intersect(.UsedRange, .[A:B]).Value
    End With
    For j = 1 To UBound(a, 1)
        If a(j, 1) <> "" Then x.Add a(j, 1), CStr(a(j, 1))
    Next: On Error GoTo 0
    With Sheets("Клиенты"): For j = 1 To x.Count: Cells(j + 1, 3) = x(j): Next: End With
End Sub
Код:
Как вынуть данные из листов с конкретным названием
Например, для столбцов "A" на листах "Лист1", "Лист5", "Лист6" и "Лист8":
Код:
Sub Main()
    Dim j As Long, x As New Collection, a()
    Application.ScreenUpdating = False: On Error Resume Next
    For Each i In Array("Лист1", "Лист5", "Лист6", "Лист8")
        With Sheets(i): a = .Range(.[A2], .Cells(Rows.Count, 1).End(xlUp)).Value: End With
        For j = 1 To UBound(a, 1)
            If a(j, 1) <> "" Then x.Add a(j, 1), CStr(a(j, 1))
    Next: Next: On Error GoTo 0
    With Sheets("Клиенты"): For j = 1 To x.Count: Cells(j + 1, 3) = x(j): Next: End With
End Sub
P.S. Работоспособность макросов не проверял. Если что не так - пишите.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 19.08.2009, 14:10   #8
Иванов_ДМ
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 96
По умолчанию

В первом коде (1 лист 2 диапазона "A:B") переносит данные только одной таблицы.
Во втором коде (2 листа по 1 диапазону) ругается на переменную i - требует определить формат.
Иванов_ДМ вне форума Ответить с цитированием
Старый 19.08.2009, 14:31   #9
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
В первом коде (1 лист 2 диапазона "A:B") переносит данные только одной таблицы.
Да. Конечно. Извиняюсь. Добавьте строку для 2-й размерности:
Код:
Sub Main()
    Dim j As Long, x As New Collection, a()
    Application.ScreenUpdating = False: On Error Resume Next
    With Sheets("Имя_Листа_ с_данными")
        a = Intersect(.UsedRange, .[A:B]).Value
    End With
    For j = 1 To UBound(a, 1)
        If a(j, 1) <> "" Then x.Add a(j, 1), CStr(a(j, 1))
        If a(j, 2) <> "" Then x.Add a(j, 2), CStr(a(j, 2))
    Next: On Error GoTo 0
    With Sheets("Клиенты"): For j = 1 To x.Count: Cells(j + 1, 3) = x(j): Next: End With
End Sub
Цитата:
Во втором коде (2 листа по 1 диапазону) ругается на переменную i - требует определить формат.
Если у Вас установлена опция Option Explicit, то определите переменную, как Dim i As Variant
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 19.08.2009, 15:28   #10
Иванов_ДМ
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 96
По умолчанию

Макрос с разными листами заработал!
А вот где на одном листе почему-то данные помещает на тот же лист, откуда берет, а также захватывает заголовки
Вложения
Тип файла: rar Списки1.rar (12.6 Кб, 25 просмотров)
Иванов_ДМ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
соединить два 3d объекта NewXakep Помощь студентам 1 11.07.2009 11:34
дано два файла. получить третий,содержащий поочередно строки исходных двух файлов. HyvAchoK Паскаль, Turbo Pascal, PascalABC.NET 1 18.12.2008 10:51
Как соединить? Artem25 Свободное общение 1 22.09.2008 09:03
Очень нужно соединить два скрипта Yudgin JavaScript, Ajax 11 22.11.2007 13:38