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

Вход

Регистрация

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

 

= Мир MS Excel/Копирование данных из столбцов по условиям с поиском - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Копирование данных из столбцов по условиям с поиском (Макросы/Sub)
Копирование данных из столбцов по условиям с поиском
Leojse Дата: Пятница, 08.08.2014, 21:55 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 1 ±
Замечаний: 0% ±

2010/2013
Добрый вечер, уважаемые гуру форума!
Совсем недавно начал серьезно изучать vba, так как рутинной работы прибавляется изо дня в день всё больше и больше.... Но без Вашей помощи еще никак не могу обойтись. Есть Книга1 и Книга2. Эти книги формируются путем выгрузки данных из разных программ. Также есть Сводная книга, в которую я копирую данные. В сводной книге в столбец "Книга1" соответственно улице и дому копирую номера квартир, в столбец "Книга2" также копирую номера квартир соответственно улице и дому, но если есть условие (на пример есть условие по Пушкина 48-12), то эту квартиру (точнее номер квартиры "12") уже не копирую.
Есть еще одно условие - названия улиц, а так же номера домов могут идти в разнобой, т.е. в одном месяце сначала идет улица Пушкина, потом, на пример, Некрасова. В следующем месяце улица Некрасова может идти первой, а улица Пушкина - позже. Так же "плясать" могут и номера домов.... В одном месяце 46-ой дом Пушкина может идти первым, а в следующем месяце - 56-ой дом, затем 46-ой и т.д.
Единственное, что не меняется в этом кошмаре, так это Сводная книга - там улицы и номера домов, расположение столбцов не меняется.
Подскажите, пожалуйста, возможно ли как-то автоматизировать процесс копирования из Книг1-2 в Сводную таблицу?
Заранее большое спасибо!
P.S. Структура Книг1-2 всегда одинакова.
К сообщению приложен файл: 7949010.rar (21.6 Kb)


Сообщение отредактировал Leojse - Пятница, 08.08.2014, 21:59
 
Ответить
СообщениеДобрый вечер, уважаемые гуру форума!
Совсем недавно начал серьезно изучать vba, так как рутинной работы прибавляется изо дня в день всё больше и больше.... Но без Вашей помощи еще никак не могу обойтись. Есть Книга1 и Книга2. Эти книги формируются путем выгрузки данных из разных программ. Также есть Сводная книга, в которую я копирую данные. В сводной книге в столбец "Книга1" соответственно улице и дому копирую номера квартир, в столбец "Книга2" также копирую номера квартир соответственно улице и дому, но если есть условие (на пример есть условие по Пушкина 48-12), то эту квартиру (точнее номер квартиры "12") уже не копирую.
Есть еще одно условие - названия улиц, а так же номера домов могут идти в разнобой, т.е. в одном месяце сначала идет улица Пушкина, потом, на пример, Некрасова. В следующем месяце улица Некрасова может идти первой, а улица Пушкина - позже. Так же "плясать" могут и номера домов.... В одном месяце 46-ой дом Пушкина может идти первым, а в следующем месяце - 56-ой дом, затем 46-ой и т.д.
Единственное, что не меняется в этом кошмаре, так это Сводная книга - там улицы и номера домов, расположение столбцов не меняется.
Подскажите, пожалуйста, возможно ли как-то автоматизировать процесс копирования из Книг1-2 в Сводную таблицу?
Заранее большое спасибо!
P.S. Структура Книг1-2 всегда одинакова.

Автор - Leojse
Дата добавления - 08.08.2014 в 21:55
nilem Дата: Пятница, 08.08.2014, 22:44 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Здравствуйте
а если в сводной книге уже есть номер квартиры для соответствующих улицы и дома, то такую квартиру уже не копируем из Книга1 или Книга2?


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеЗдравствуйте
а если в сводной книге уже есть номер квартиры для соответствующих улицы и дома, то такую квартиру уже не копируем из Книга1 или Книга2?

Автор - nilem
Дата добавления - 08.08.2014 в 22:44
Leojse Дата: Пятница, 08.08.2014, 22:50 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 1 ±
Замечаний: 0% ±

2010/2013
nilem, здравствуйте!
Дело в том, что после копирования Книг1-2 в Сводную, я отпечатываю отчет и очищаю Сводную. Перед новым копированием Сводная книга всегда чистая.
 
Ответить
Сообщениеnilem, здравствуйте!
Дело в том, что после копирования Книг1-2 в Сводную, я отпечатываю отчет и очищаю Сводную. Перед новым копированием Сводная книга всегда чистая.

Автор - Leojse
Дата добавления - 08.08.2014 в 22:50
nilem Дата: Пятница, 08.08.2014, 23:07 | Сообщение № 4
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
тогда, видимо, "на словаре и массивах" :)
попозже нарисуем, ладно?


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениетогда, видимо, "на словаре и массивах" :)
попозже нарисуем, ладно?

Автор - nilem
Дата добавления - 08.08.2014 в 23:07
Leojse Дата: Пятница, 08.08.2014, 23:09 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 1 ±
Замечаний: 0% ±

2010/2013
Совсем забыл добавить.... Если есть улицы или номера домов, которых нет в сводной книге, то тоже копировать не надо.
 
Ответить
СообщениеСовсем забыл добавить.... Если есть улицы или номера домов, которых нет в сводной книге, то тоже копировать не надо.

Автор - Leojse
Дата добавления - 08.08.2014 в 23:09
nilem Дата: Суббота, 09.08.2014, 01:44 | Сообщение № 6
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
распакуйте архив в отдельную папку, откройте "Сводная книга", нажмите зеленую кнопку
[vba]
Код
Option Explicit
Dim x

Sub ertert()
Dim y(), i&, k&, s$, r
Application.ScreenUpdating = False

x = Range("B1").CurrentRegion.Value
ReDim y(1 To 1000, 1 To UBound(x, 2))
ReDim r(1 To UBound(x, 2))

With CreateObject("Scripting.Dictionary")
      .CompareMode = 1
      For i = 1 To UBound(x, 2) Step 2
          .Item(x(1, i) & x(1, i + 1)) = i
      Next i

      Range("A1").Formula = "=ToArray('" & ThisWorkbook.Path & "\[Книга1.xlsx]Лист1'!A8:D10000)"
      For i = 1 To UBound(x)
          If IsEmpty(x(i, 2)) Then Exit For
          If Len(x(i, 1)) = 0 Then
              s = x(i, 2) & x(i, 3)
              If .Exists(s) Then k = .Item(s): r(k) = r(k) + 1: y(r(k), k) = x(i, 4)
          End If
      Next i

      Range("A1").Formula = "=ToArray('" & ThisWorkbook.Path & "\[Книга2.xlsx]Лист1'!D4:G10000)"
      For i = 1 To UBound(x)
          If IsEmpty(x(i, 2)) Then Exit For
          If Len(x(i, 1)) = 0 Then
              s = x(i, 2) & x(i, 3)
              If .Exists(s) Then k = .Item(s) + 1: r(k) = r(k) + 1: y(r(k), k) = x(i, 4)
          End If
      Next i
End With
Range("A1").Formula = Empty
Range("B3").Resize(UBound(y, 1), UBound(y, 2)).Value = y
Application.ScreenUpdating = True
End Sub

Private Function ToArray(ref)
x = ref
End Function
[/vba]

edited:
не "зеленую", а "зеленовую" :)
К сообщению приложен файл: 1630897.zip (30.9 Kb)


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Суббота, 09.08.2014, 17:57
 
Ответить
Сообщениераспакуйте архив в отдельную папку, откройте "Сводная книга", нажмите зеленую кнопку
[vba]
Код
Option Explicit
Dim x

Sub ertert()
Dim y(), i&, k&, s$, r
Application.ScreenUpdating = False

x = Range("B1").CurrentRegion.Value
ReDim y(1 To 1000, 1 To UBound(x, 2))
ReDim r(1 To UBound(x, 2))

With CreateObject("Scripting.Dictionary")
      .CompareMode = 1
      For i = 1 To UBound(x, 2) Step 2
          .Item(x(1, i) & x(1, i + 1)) = i
      Next i

      Range("A1").Formula = "=ToArray('" & ThisWorkbook.Path & "\[Книга1.xlsx]Лист1'!A8:D10000)"
      For i = 1 To UBound(x)
          If IsEmpty(x(i, 2)) Then Exit For
          If Len(x(i, 1)) = 0 Then
              s = x(i, 2) & x(i, 3)
              If .Exists(s) Then k = .Item(s): r(k) = r(k) + 1: y(r(k), k) = x(i, 4)
          End If
      Next i

      Range("A1").Formula = "=ToArray('" & ThisWorkbook.Path & "\[Книга2.xlsx]Лист1'!D4:G10000)"
      For i = 1 To UBound(x)
          If IsEmpty(x(i, 2)) Then Exit For
          If Len(x(i, 1)) = 0 Then
              s = x(i, 2) & x(i, 3)
              If .Exists(s) Then k = .Item(s) + 1: r(k) = r(k) + 1: y(r(k), k) = x(i, 4)
          End If
      Next i
End With
Range("A1").Formula = Empty
Range("B3").Resize(UBound(y, 1), UBound(y, 2)).Value = y
Application.ScreenUpdating = True
End Sub

Private Function ToArray(ref)
x = ref
End Function
[/vba]

edited:
не "зеленую", а "зеленовую" :)

Автор - nilem
Дата добавления - 09.08.2014 в 01:44
Leojse Дата: Суббота, 09.08.2014, 10:46 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 1 ±
Замечаний: 0% ±

2010/2013
nilem, спасибо большое! Вы меня в прямом смысле спасли!
 
Ответить
Сообщениеnilem, спасибо большое! Вы меня в прямом смысле спасли!

Автор - Leojse
Дата добавления - 09.08.2014 в 10:46
Leojse Дата: Суббота, 16.08.2014, 14:42 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 1 ±
Замечаний: 0% ±

2010/2013
Добрый день. Вышеуказанный макрос отрабатывается на выложенном мной примере на ура, но на рабочих файлах никак не хочет собирать данные. Пробовал менять типы переменных, смотрел различные свойства, менял форматы ячеек, но никак не получается - еще мало что понимаю в vba. Либо ничего не собирается, либо out of range, либо метод/свойство не поддерживается... Поэтому снова прошу Вас о помощи.
Прикладываю максимально похожие примеры на рабочие файлы.
К сообщению приложен файл: 6022634.rar (30.9 Kb)


Сообщение отредактировал Leojse - Суббота, 16.08.2014, 14:43
 
Ответить
СообщениеДобрый день. Вышеуказанный макрос отрабатывается на выложенном мной примере на ура, но на рабочих файлах никак не хочет собирать данные. Пробовал менять типы переменных, смотрел различные свойства, менял форматы ячеек, но никак не получается - еще мало что понимаю в vba. Либо ничего не собирается, либо out of range, либо метод/свойство не поддерживается... Поэтому снова прошу Вас о помощи.
Прикладываю максимально похожие примеры на рабочие файлы.

Автор - Leojse
Дата добавления - 16.08.2014 в 14:42
nilem Дата: Воскресенье, 17.08.2014, 12:53 | Сообщение № 9
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
в измененных строках написал комментарии
[vba]
Код
Option Explicit
Dim x

Sub ertert()
Dim y(), i&, k&, s$, r
Application.ScreenUpdating = False

x = Range("B1").CurrentRegion.Value
ReDim y(1 To 1000, 1 To UBound(x, 2))
ReDim r(1 To UBound(x, 2)): Range("A1").Formula = Empty

With CreateObject("Scripting.Dictionary")
     .CompareMode = 1
     For i = 1 To UBound(x, 2) Step 2
         .Item(Trim(x(1, i)) & Trim(x(1, i + 1))) = i
     Next i

     Range("A1").Formula = "=ToArray('" & ThisWorkbook.Path & "\[Книга1.xlsx]Лист1'!A6:D10000)" 'данные начинаются с 6-й строки
     For i = 1 To UBound(x)
         If IsEmpty(x(i, 2)) Then Exit For
          
         ' If Len(x(i, 1)) = 0 Then'теперь условие для Книга1 не проверяем, т.е. его просто нет
         s = Trim(x(i, 2)) & Trim(x(i, 3))
         If .Exists(s) Then k = .Item(s): r(k) = r(k) + 1: y(r(k), k) = x(i, 4)
         ' End If
     Next i
      
     Range("A1").Formula = "=ToArray('" & ThisWorkbook.Path & "\[Книга2.xls]Лист1'!D4:G10000)" 'Книга2.xls - Книга2 оказалась в формате Ексель 2003
     For i = 1 To UBound(x)
         If IsEmpty(x(i, 2)) Then Exit For
         If Len(x(i, 1)) = 0 Then
             s = Trim(x(i, 2)) & Trim(x(i, 3)) 'везде добавляем Trim, т.к. какой-то коварный враг наставил пробелов в данных
             If .Exists(s) Then k = .Item(s) + 1: r(k) = r(k) + 1: y(r(k), k) = x(i, 4)
         End If
     Next i
End With
Range("A1").Formula = Empty
Range("B3").Resize(UBound(y, 1), UBound(y, 2)).Value = y
Application.ScreenUpdating = True
End Sub

Private Function ToArray(ref)
  x = ref
End Function
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениев измененных строках написал комментарии
[vba]
Код
Option Explicit
Dim x

Sub ertert()
Dim y(), i&, k&, s$, r
Application.ScreenUpdating = False

x = Range("B1").CurrentRegion.Value
ReDim y(1 To 1000, 1 To UBound(x, 2))
ReDim r(1 To UBound(x, 2)): Range("A1").Formula = Empty

With CreateObject("Scripting.Dictionary")
     .CompareMode = 1
     For i = 1 To UBound(x, 2) Step 2
         .Item(Trim(x(1, i)) & Trim(x(1, i + 1))) = i
     Next i

     Range("A1").Formula = "=ToArray('" & ThisWorkbook.Path & "\[Книга1.xlsx]Лист1'!A6:D10000)" 'данные начинаются с 6-й строки
     For i = 1 To UBound(x)
         If IsEmpty(x(i, 2)) Then Exit For
          
         ' If Len(x(i, 1)) = 0 Then'теперь условие для Книга1 не проверяем, т.е. его просто нет
         s = Trim(x(i, 2)) & Trim(x(i, 3))
         If .Exists(s) Then k = .Item(s): r(k) = r(k) + 1: y(r(k), k) = x(i, 4)
         ' End If
     Next i
      
     Range("A1").Formula = "=ToArray('" & ThisWorkbook.Path & "\[Книга2.xls]Лист1'!D4:G10000)" 'Книга2.xls - Книга2 оказалась в формате Ексель 2003
     For i = 1 To UBound(x)
         If IsEmpty(x(i, 2)) Then Exit For
         If Len(x(i, 1)) = 0 Then
             s = Trim(x(i, 2)) & Trim(x(i, 3)) 'везде добавляем Trim, т.к. какой-то коварный враг наставил пробелов в данных
             If .Exists(s) Then k = .Item(s) + 1: r(k) = r(k) + 1: y(r(k), k) = x(i, 4)
         End If
     Next i
End With
Range("A1").Formula = Empty
Range("B3").Resize(UBound(y, 1), UBound(y, 2)).Value = y
Application.ScreenUpdating = True
End Sub

Private Function ToArray(ref)
  x = ref
End Function
[/vba]

Автор - nilem
Дата добавления - 17.08.2014 в 12:53
Leojse Дата: Воскресенье, 17.08.2014, 12:59 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 1 ±
Замечаний: 0% ±

2010/2013
nilem, ОГРОМНЕЙШЕЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!
 
Ответить
Сообщениеnilem, ОГРОМНЕЙШЕЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!

Автор - Leojse
Дата добавления - 17.08.2014 в 12:59
Leojse Дата: Воскресенье, 17.08.2014, 13:06 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 1 ±
Замечаний: 0% ±

2010/2013
А можно еще вопрос? Дурной, наверно, вопрос, но всё же задам) Форматы копируемых данных Книг1 и 2 в сводную книгу имеют большое значение?
 
Ответить
СообщениеА можно еще вопрос? Дурной, наверно, вопрос, но всё же задам) Форматы копируемых данных Книг1 и 2 в сводную книгу имеют большое значение?

Автор - Leojse
Дата добавления - 17.08.2014 в 13:06
nilem Дата: Воскресенье, 17.08.2014, 13:17 | Сообщение № 12
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Здесь происходит не копирование ячеек, а перенос значений. Т.е. формат м.б. любой.


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеЗдесь происходит не копирование ячеек, а перенос значений. Т.е. формат м.б. любой.

Автор - nilem
Дата добавления - 17.08.2014 в 13:17
Leojse Дата: Суббота, 08.11.2014, 17:42 | Сообщение № 13
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 1 ±
Замечаний: 0% ±

2010/2013
nilem, снова прошу у Вас помощи. В долгу не останусь, обязательно отблагодарю! Подскажите, пожалуйста, как в макросе сделать так, чтобы при обработке данных не копировались номера квартир в сводную, если есть условие в книге1?
К сообщению приложен файл: 6738506.xlsx (12.8 Kb)
 
Ответить
Сообщениеnilem, снова прошу у Вас помощи. В долгу не останусь, обязательно отблагодарю! Подскажите, пожалуйста, как в макросе сделать так, чтобы при обработке данных не копировались номера квартир в сводную, если есть условие в книге1?

Автор - Leojse
Дата добавления - 08.11.2014 в 17:42
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Копирование данных из столбцов по условиям с поиском (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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