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

Вход

Регистрация

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

 

= Мир MS Excel/Перенос строк, которых нет в списке - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Перенос строк, которых нет в списке
DieMust Дата: Четверг, 01.12.2011, 18:45 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Во втором листе список, его нужно сравнить с первым столбцом в первом листе и того, что в первом листе нет перенести в третий лист. Для наглядности: в файле на третьем листе то, что должно получиться. Желательно сделать макросом, по возможности комментируя код. Файл создал для примера, а так есть разные файлы с разными форматами, хотелось бы самому разобраться в вопросе, чтобы изменять код.
Excel 2007.
И можете посоветовать материал для изучения, чтобы в общих чертах разбираться с макросо-, формулописанием?
Спасибо.

Модератор - удалил лишний файл. Зачем плодить сущности?
К сообщению приложен файл: 1245152.xlsx (11.3 Kb)
 
Ответить
СообщениеВо втором листе список, его нужно сравнить с первым столбцом в первом листе и того, что в первом листе нет перенести в третий лист. Для наглядности: в файле на третьем листе то, что должно получиться. Желательно сделать макросом, по возможности комментируя код. Файл создал для примера, а так есть разные файлы с разными форматами, хотелось бы самому разобраться в вопросе, чтобы изменять код.
Excel 2007.
И можете посоветовать материал для изучения, чтобы в общих чертах разбираться с макросо-, формулописанием?
Спасибо.

Модератор - удалил лишний файл. Зачем плодить сущности?

Автор - DieMust
Дата добавления - 01.12.2011 в 18:45
Serge_007 Дата: Четверг, 01.12.2011, 20:54 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (DieMust)
можете посоветовать материал для изучения, чтобы в общих чертах разбираться с макросо-

http://www.excelworld.ru/index/bibl/0-5


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (DieMust)
можете посоветовать материал для изучения, чтобы в общих чертах разбираться с макросо-

http://www.excelworld.ru/index/bibl/0-5

Автор - Serge_007
Дата добавления - 01.12.2011 в 20:54
Hugo Дата: Четверг, 01.12.2011, 21:42 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Добрый день.
Для начала посмотрите файл, код из которого можно использовать для Вашей задачи.
Там совсем немного нужно переделать.
Если хочется почитать про использование словарей - Dictionary - это совсем не сложно!

А вот вариант этого кода для Вашей задачи - всего лишь поменял имена листов, добавил в одном месте Not и в одном месте поменял присваиваемое в цикле массиву значение.

Code
Option Explicit

'Макросом -
'1.два диапазона в два массива
'2.создание массива для результатов
'3.один перебор 300 значений массива в словарь
'4.100 000 проверок массива на наличие в словаре и заполнение данными массива результата
'5.выгрузка результатов (тут нет предварительной очистки диапазона)

Sub compare()
          Dim a(), b(), iLastrow As Long, i As Long, ii As Long

          '1.
          With Лист1    'используется кодовое имя
              iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
              a = Range(.[c1], .Range("A" & iLastrow)).Value
          End With

          With Лист2    'используется кодовое имя
              iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
              b = Range(.[A1], .Range("A" & iLastrow)).Value
          End With

          '2.
          ReDim c(1 To UBound(a), 1 To 3)

          With CreateObject("Scripting.Dictionary")
                
              '3.
              For i = 1 To UBound(b)
                  .Item(b(i, 1)) = i
              Next

              '4.
              For i = 1 To UBound(a)
                  If Not .exists(a(i, 1)) Then
                      ii = ii + 1
                      c(ii, 1) = a(i, 1)
                      c(ii, 2) = a(i, 2)
                      c(ii, 3) = a(i, 3)
                  End If
              Next
          End With

          '5.
          With Лист3    'используется кодовое имя
              .[A1].Resize(ii, 3) = c
              .Activate
          End With

End Sub

Как применить код на вашем файле - домашнее задание smile
P.S. Как недавно выяснил - кодовые имена листов могут иногда сами меняться в зависимости от того, на какой версии Экселя открывается файл.
Если вдруг у кого-то имена листов в файле не совпадут с тем, что написано в коде - это тот случай sad
Решение - поменять их назад вручную. Или в коде, или в файле.
Но кодовое имя - это не то, что написано на корешке листа, а то, что видно в редакторе VBA. Меняется вручную в свойствах листа в графе (Name) или кодом.

P.S. Я думаю, что Вам всё же нужно было не ПЕРЕНОСИТЬ, а КОПИРОВАТЬ.
Если переносить - тогда ещё один массив нужно создавать...
К сообщению приложен файл: CompareArrays.v.zip (15.4 Kb)


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеДобрый день.
Для начала посмотрите файл, код из которого можно использовать для Вашей задачи.
Там совсем немного нужно переделать.
Если хочется почитать про использование словарей - Dictionary - это совсем не сложно!

А вот вариант этого кода для Вашей задачи - всего лишь поменял имена листов, добавил в одном месте Not и в одном месте поменял присваиваемое в цикле массиву значение.

Code
Option Explicit

'Макросом -
'1.два диапазона в два массива
'2.создание массива для результатов
'3.один перебор 300 значений массива в словарь
'4.100 000 проверок массива на наличие в словаре и заполнение данными массива результата
'5.выгрузка результатов (тут нет предварительной очистки диапазона)

Sub compare()
          Dim a(), b(), iLastrow As Long, i As Long, ii As Long

          '1.
          With Лист1    'используется кодовое имя
              iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
              a = Range(.[c1], .Range("A" & iLastrow)).Value
          End With

          With Лист2    'используется кодовое имя
              iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
              b = Range(.[A1], .Range("A" & iLastrow)).Value
          End With

          '2.
          ReDim c(1 To UBound(a), 1 To 3)

          With CreateObject("Scripting.Dictionary")
                
              '3.
              For i = 1 To UBound(b)
                  .Item(b(i, 1)) = i
              Next

              '4.
              For i = 1 To UBound(a)
                  If Not .exists(a(i, 1)) Then
                      ii = ii + 1
                      c(ii, 1) = a(i, 1)
                      c(ii, 2) = a(i, 2)
                      c(ii, 3) = a(i, 3)
                  End If
              Next
          End With

          '5.
          With Лист3    'используется кодовое имя
              .[A1].Resize(ii, 3) = c
              .Activate
          End With

End Sub

Как применить код на вашем файле - домашнее задание smile
P.S. Как недавно выяснил - кодовые имена листов могут иногда сами меняться в зависимости от того, на какой версии Экселя открывается файл.
Если вдруг у кого-то имена листов в файле не совпадут с тем, что написано в коде - это тот случай sad
Решение - поменять их назад вручную. Или в коде, или в файле.
Но кодовое имя - это не то, что написано на корешке листа, а то, что видно в редакторе VBA. Меняется вручную в свойствах листа в графе (Name) или кодом.

P.S. Я думаю, что Вам всё же нужно было не ПЕРЕНОСИТЬ, а КОПИРОВАТЬ.
Если переносить - тогда ещё один массив нужно создавать...

Автор - Hugo
Дата добавления - 01.12.2011 в 21:42
DieMust Дата: Среда, 07.12.2011, 01:42 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

А что делать, если в первом листе более 3х значений? Во второй части я вставил "1 to 6", чтобы столбцов в массиве было 6, но появилась ошибка, которая гласит, что массив А выходит за рамки, но не могу понять где в описании массива А изменить параметр... и как автоматизировать последний столбец? Чтобы был iLastRow и iLastColumn?
Хотя первый вопрос выяснил, внес нужные изменения.. Проблема была в том, что почему-то изменения не сразу вступали в силу..


Сообщение отредактировал DieMust - Среда, 07.12.2011, 01:49
 
Ответить
СообщениеА что делать, если в первом листе более 3х значений? Во второй части я вставил "1 to 6", чтобы столбцов в массиве было 6, но появилась ошибка, которая гласит, что массив А выходит за рамки, но не могу понять где в описании массива А изменить параметр... и как автоматизировать последний столбец? Чтобы был iLastRow и iLastColumn?
Хотя первый вопрос выяснил, внес нужные изменения.. Проблема была в том, что почему-то изменения не сразу вступали в силу..

Автор - DieMust
Дата добавления - 07.12.2011 в 01:42
Hugo Дата: Среда, 07.12.2011, 02:10 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Кроме 1 to 6 ещё и массив a нужно брать с бОльшего диапазона:
Code
a = Range(.[c1], .Range("A" & iLastrow)).Value

Тут берётся от C1 до конца A (можно иначе написАть -я так написАл smile )
Причём конец A можно определить ранее по любому столбцу (iLastrow )
Ну и тут тогда продлжить:
Code
c(ii, 1) = a(i, 1)      
c(ii, 2) = a(i, 2)      
c(ii, 3) = a(i, 3)

Специально не сокращал код циклом, чтоб можно было столбцы как угодно тасовать, если нужно (или пропускать лишние).

Про iLastColumn понял - сделать можно, но поздно уже сегодня...


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеКроме 1 to 6 ещё и массив a нужно брать с бОльшего диапазона:
Code
a = Range(.[c1], .Range("A" & iLastrow)).Value

Тут берётся от C1 до конца A (можно иначе написАть -я так написАл smile )
Причём конец A можно определить ранее по любому столбцу (iLastrow )
Ну и тут тогда продлжить:
Code
c(ii, 1) = a(i, 1)      
c(ii, 2) = a(i, 2)      
c(ii, 3) = a(i, 3)

Специально не сокращал код циклом, чтоб можно было столбцы как угодно тасовать, если нужно (или пропускать лишние).

Про iLastColumn понял - сделать можно, но поздно уже сегодня...

Автор - Hugo
Дата добавления - 07.12.2011 в 02:10
nilem Дата: Среда, 07.12.2011, 10:45 | Сообщение № 6
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Для разнообразия smile
Code
Sub ertert()
Dim str$, x, y(), i&, j&, k&
str = Join(WorksheetFunction.Transpose(Sheets("Лист2").Columns(1).SpecialCells(2)), ",")

x = Sheets("Лист1").Range("A1").CurrentRegion.Value
ReDim y(1 To UBound(x, 1), 1 To UBound(x, 2))
For i = 1 To UBound(x)
     If InStr(str, x(i, 1)) = 0 Then
         k = k + 1
         For j = 1 To UBound(x, 2)
             y(k, j) = x(i, j)
         Next j
     End If
Next i

Sheets("Лист3").Range("A1").Resize(k, UBound(x, 2)).Value = y()
End Sub


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеДля разнообразия smile
Code
Sub ertert()
Dim str$, x, y(), i&, j&, k&
str = Join(WorksheetFunction.Transpose(Sheets("Лист2").Columns(1).SpecialCells(2)), ",")

x = Sheets("Лист1").Range("A1").CurrentRegion.Value
ReDim y(1 To UBound(x, 1), 1 To UBound(x, 2))
For i = 1 To UBound(x)
     If InStr(str, x(i, 1)) = 0 Then
         k = k + 1
         For j = 1 To UBound(x, 2)
             y(k, j) = x(i, j)
         Next j
     End If
Next i

Sheets("Лист3").Range("A1").Resize(k, UBound(x, 2)).Value = y()
End Sub

Автор - nilem
Дата добавления - 07.12.2011 в 10:45
  • Страница 1 из 1
  • 1
Поиск:

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