Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
20.04.2024, 10:26:27

Войти
Интересные и полезные статьи по работе с Excel и VBA можно найти в разделе ХИТРОСТИ
33 242 Сообщений в 5 457 Тем от 6 758 Пользователей
Последний пользователь: Сергей2662
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Открытие файла и копирование конкретных данных
Страниц: [1]   Вниз
Печать
Автор Тема: Открытие файла и копирование конкретных данных  (Прочитано 6476 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Stepashka
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 17


Просмотр профиля
« : 11.03.2018, 08:22:25 »

Здравствуйте, форумчане
Помогите, пожалуйста, советом.
Задумка такая:
Открываем файл (Книга1), при выполнение трех условий, отбираем необходимые данные, а затем, копируем их другой файл по столбцам (книга2).

Условия:
1) Содержание слова "форум" в ячейках первого столбца;
2) 13 столбец не должен быть равен значению "Отсутствует";
3) Количество символов 4 столбца менее 25.

Моя "задумка" Улыбка находит только первое значение и останавливается, причем, отобранные данные переносятся во второй файл многократно - одно и тоже значение.
Понимаю, что, что-то не то с циклом, но что конкретно, не понимаю.

Прошу содействия.

Спасибо.

Код: (vb)
Sub Открытие_и_копия8()

Dim i As Integer
Dim iLastRow As Long

Workbooks.Open Filename:="C:\Users\Книга1.xlsm"

Set List1 = Workbooks("Книга1.xlsm").Sheets("Лист1")
Set List2 = Workbooks("Книга2.xlsm").Sheets("Лист1")

 iLastRow = List1.Cells(Rows.Count, 1).End(xlUp).Row
   For i = 1 To iLastRow
     
        If Cells(i, 1) Like "*Форум*" Then
        If List1.Cells(i, 13).Value <> "Отсутствует" Then
        If Len(List1.Cells(i, 4)) < 25 Then
  Workbooks("Книга2.xlsm").Activate
  ActiveWorkbook.Worksheets("Лист1").Select
 
   List2.Cells(8, 1) = List1.Cells(i, 4)
   List2.Cells(9, 1) = List1.Cells(i, 4)
   List2.Cells(10, 1) = List1.Cells(i, 4)
   List2.Cells(11, 1) = List1.Cells(i, 4)
   List2.Cells(12, 1) = List1.Cells(i, 4)
   List2.Cells(13, 1) = List1.Cells(i, 4)
   List2.Cells(14, 1) = List1.Cells(i, 4)
   List2.Cells(15, 1) = List1.Cells(i, 4)
   List2.Cells(16, 1) = List1.Cells(i, 4)
   List2.Cells(17, 1) = List1.Cells(i, 4)
   List2.Cells(18, 1) = List1.Cells(i, 4)
   List2.Cells(19, 1) = List1.Cells(i, 4)
   
 
   List2.Cells(8, 12) = List1.Cells(i, 4)
   List2.Cells(9, 12) = List1.Cells(i, 4)
   List2.Cells(10, 12) = List1.Cells(i, 4)
   List2.Cells(11, 12) = List1.Cells(i, 4)
   List2.Cells(12, 12) = List1.Cells(i, 4)
   List2.Cells(13, 12) = List1.Cells(i, 4)
   List2.Cells(14, 12) = List1.Cells(i, 4)
   List2.Cells(15, 12) = List1.Cells(i, 4)
   List2.Cells(16, 12) = List1.Cells(i, 4)
   List2.Cells(17, 12) = List1.Cells(i, 4)
   List2.Cells(18, 12) = List1.Cells(i, 4)
   List2.Cells(19, 12) = List1.Cells(i, 4)
   
   End If
   End If
   End If
   
   Next i
   
Workbooks("Книга1.xlsm").Close False

End Sub

Записан
alex77755
Постоялец
***

Репутация: +17/-0
Офлайн Офлайн

Сообщений: 160


Просмотр профиля E-mail
« Ответ #1 : 21.03.2018, 21:49:22 »

Код: (vb)
iLastRow = List1.Cells(Rows.Count, 1).End(xlUp).Row

правильнее так:
Код: (vb)
iLastRow = List1.Cells(List1.Rows.Count, 1).End(xlUp).Row

Цитировать
многократно - одно и тоже значение
Так что написали, то и выводится: с 8 по 19 строки записывается одно и то же значение  List1.Cells(i, 4)
Причём в 2 колонки. И причём переписывается при каждом выполнении условий
« Последнее редактирование: 22.03.2018, 08:59:10 от Дмитрий Щербаков(The_Prist) » Записан
Stepashka
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 17


Просмотр профиля
« Ответ #2 : 06.04.2018, 05:11:09 »

Спасибо за ответ.
Немного преобразовала, но результат прежний. В тупике.  Интернет не помог. Поделитесь, пожалуйста, соображениями, как можно реализовать. Спасибо.
Код: (vb)
      

Sub Открытие_и_копия3()
     
    Dim i As Integer
    Dim j As Integer

    Dim iLastRow As Long
     
    Workbooks.Open Filename:="C:\Users\Книга1.xlsm"
     
    Set List1 = Workbooks("Книга1.xlsm").Sheets("Лист1")
    Set List2 = Workbooks("Книга2.xlsm").Sheets("Лист1")
     
     iLastRow = List1.Cells(Rows.Count, 1).End(xlUp).Row
       For i = 1 To iLastRow
        For j = 8 To 19
           
            If Cells(i, 1) Like "*Форум*" Then
            If List1.Cells(i, 13).Value <> "Отсутствует" Then
            If Len(List1.Cells(i, 4)) < 25 Then
      Workbooks("Книга2.xlsm").Activate
      ActiveWorkbook.Worksheets("Лист1").Select
       
       List2.Cells(j, 1) = List1.Cells(i, 4)
       List2.Cells(j, 12) = List1.Cells(i, 4)
               
       End If
       End If
       End If
       
       Next j
       Next i
         
    Workbooks("Книга1.xlsm").Close False
     
    End Sub

Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #3 : 06.04.2018, 09:37:26 »

1.
Код: (vb)
List2.Cells(j, 1) = List1.Cells(i, 4)
List2.Cells(j, 12) = List1.Cells(i, 4)

в List2 столбцы разные, а значения из List1 попадают из одинаковых столбцов.

2.
Код: (vb)
Workbooks("Книга2.xlsm").Activate  
      ActiveWorkbook.Worksheets("Лист1").Select

уберите, оно не нужно здесь. От слова вообще.

3. Сравнения на "форум" у Вас с привязкой к активному листу и с учетом регистра. Лучше от этого избавиться, пусть без оптимизации, но понятно Вам:
Код: (vb)
If LCase(List1.Cells(i, 1).Value) Like "*форум*" Then  
            If LCase(List1.Cells(i, 13).Value) <> "отсутствует" Then 
            If Len(List1.Cells(i, 4)) < 25 Then


4. Циклы явно расположены неверно - зачем второй цикл до проверки значений в List1?
5. Тип Integer не лучший выбор при работе со строками. Т.к. его предел 32756, то при попытке записи в строку, превышающую этот предел будет ошибка.
6. Ну и совершенно непонятно, какие в итоге значения должны быть куда записаны.
For j = 8 To 19
т.е. всегда будете записывать данные с 8-ой по 19 строку? Как-то не очень правильно. И всегда только два столбца и значения в них попадают всегда из 1-го...Бред, одним словом. Напишите что куда должно попадать. Тогда можно будет показать код более правильный и более отвечающий требованиям. А пока только так:
Код: (vb)
Sub Открытие_и_копия3()
    Dim i As Long, j As Long
    Dim iLastRow As Long, llastr_2 As Long
       
    Workbooks.Open Filename:="C:\Users\Книга1.xlsm"
    Set List1 = Workbooks("Книга1.xlsm").Sheets("Лист1")
    Set List2 = Workbooks("Книга2.xlsm").Sheets("Лист1")
    iLastRow = List1.Cells(List1.Rows.Count, 1).End(xlUp).Row
    For i = 1 To iLastRow
        If LCase(List1.Cells(i, 1).Value) Like "*форум*" Then
            If LCase(List1.Cells(i, 13).Value) <> "отсутствует" Then
                If Len(List1.Cells(i, 4)) < 25 Then
                    llastr_2 = List2.Cells(List2.Rows.Count, 1).End(xlUp).Row
                    For j = 1 To 11
                        List2.Cells(llastr_2 + j, 1) = List1.Cells(i, 4)
                        List2.Cells(llastr_2 + j, 12) = List1.Cells(i, 4)
                    Next j
                End If
            End If
        End If
    Next i
    Workbooks("Книга1.xlsm").Close False
End Sub



Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Stepashka
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 17


Просмотр профиля
« Ответ #4 : 22.04.2018, 07:44:10 »

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

Цитировать
Всегда будете записывать данные с 8-ой по 19 строку?
- Да, данные отбираются из одной общей таблице по трем критериям. Из отобранных записей строится другая таблица. Как то так.

Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #5 : 22.04.2018, 09:14:57 »

но проблема осталась
А эта проблема никуда не денется, потому что мы не знаем что должно переноситься, а Вы упорно не хотите это нормально объяснить. Я уже писал об этом:
Ну и совершенно непонятно, какие в итоге значения должны быть куда записаны.
For j = 8 To 19
т.е. всегда будете записывать данные с 8-ой по 19 строку? Как-то не очень правильно. И всегда только два столбца и значения в них попадают всегда из 1-го...Бред, одним словом. Напишите что куда должно попадать. Тогда можно будет показать код более правильный и более отвечающий требованиям.
пока Вы не расскажете что откуда и по какому принципу должно переноситься - решения не будет найдено. Еще лучше приложить пример файла с данными и показать чего хотите получить на выходе.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Stepashka
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 17


Просмотр профиля
« Ответ #6 : 22.04.2018, 11:35:32 »

Каюсь, постараюсь подробнее изложить на простом примере:
Номера выделенные красной заливкой в приложенном файле должный копироваться из Книга1 в Книга2 один раз каждый найденный номер. Отбираться из Книга1 по принципу:
1) Ячейка Столбца 1 (Книга1) содержит слово "форум".
2) Значение ячейки Столбца 4  (Книга1) отличается от слова "отсутствует"
3) Количество символов в ячейке Столбца 3 (Книга1) менее 25
Процесс запускается с кнопки в Книга2.

Как видно из примера (в приложении) последний найденный номер многократно прописан в таблицу Книга2, а должен быть список из всех найденных номеров без дубликатов.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #7 : 22.04.2018, 14:32:15 »

Я может чего не понимаю, но в таком случае достаточно просто убрать цикл в моем последнем коде:
Код: (vb)
For j = 1 To 11  
    List2.Cells(llastr_2 + j, 1) = List1.Cells(i, 4)  
    List2.Cells(llastr_2 + j, 12) = List1.Cells(i, 4)  
Next j

и вместо него написать так:
Код: (vb)
List2.Cells(llastr_2 + 1, 1) = List1.Cells(i, 4)
List2.Cells(llastr_2 + 1, 2) = List1.Cells(i, 4)

Тогда копироваться будет один раз. Правда, один и тот же номер в два столбца - но по этому поводу Вы никаких пояснений не даете...
Ну и не очень понятно - изначально номера столбцов были другие. И не понял, зачем Вы удалили мою строку, где последняя заполненная ячейка в итоговой книге определялась. Без неё поиск вообще теряет смысл, т.к. значения всегда записываются начиная с 1-ой строки. В общем, если опираться на приложенные файлы, то код должен выглядеть как-то так:
Код: (vb)
Sub Открытие_и_копия3()
    Dim i As Long, j As Long
    Dim iLastRow As Long, llastr_2 As Long
          
    Workbooks.Open Filename:="C:\Users\Администратор\Desktop\Пример\Книга1.xlsm"
    Set List1 = Workbooks("Книга1.xlsm").Sheets("Лист1")
    Set List2 = Workbooks("Книга2.xlsm").Sheets("Лист1")
    iLastRow = List1.Cells(List1.Rows.Count, 1).End(xlUp).Row
    For i = 2 To iLastRow
        If LCase(List1.Cells(i, 1).Value) Like "*форум*" Then
            If LCase(List1.Cells(i, 4).Value) <> "отсутствует" Then
                If Len(List1.Cells(i, 3)) < 25 Then
                    llastr_2 = List2.Cells(List2.Rows.Count, 1).End(xlUp).Row
                    List2.Cells(llastr_2 + 1, 1).Value = List1.Cells(i, 2).Value
                    List2.Cells(llastr_2 + 1, 2).Value = List1.Cells(i, 2).Value
                End If
            End If
        End If
    Next i
    Workbooks("Книга1.xlsm").Close False
End Sub
« Последнее редактирование: 22.04.2018, 14:36:36 от Дмитрий Щербаков(The_Prist) » Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Stepashka
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 17


Просмотр профиля
« Ответ #8 : 22.04.2018, 14:51:03 »

Спасибо огромное! пробую....

Цитировать
Правда, один и тот же номер в два столбца - но по этому поводу Вы никаких пояснений не даете...

Несколько столбцов нужны т.к. количество отобранных номеров будет большим, но, разумеется, в каждом столбце разные значения.
Записан
Stepashka
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 17


Просмотр профиля
« Ответ #9 : 23.04.2018, 13:22:34 »

Я, конечно дико извиняюсь, но никак не получается сделать, чтобы найденные значения выстраивались в несколько колонок с 8 по 19 строку. Ориентироваться на последнюю заполненную строку не могу, т.к. и сверху и снизу итоговой таблицы содержится текст. А найденные номера, как бы "вклиниваются" в середину таблицы.
Например: найдено 37 значений (см. Пример 2), все найденные числа в итоговую таблицу прописываются только один раз, и выстраиваются с 8 по 19 строку в несколько столбцов.
Спасибо.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #10 : 23.04.2018, 15:36:32 »

в несколько колонок с 8 по 19 строку
Это как понять-то? Вы можете попытаться объяснить что в какой столбец должно попасть как-то более расширенно и чтобы понятно было не только Вам? Вот есть у нас 15 найденных номеров. Как надо их записать? И что должно быть в каком столбце при этом?
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #11 : 23.04.2018, 16:10:24 »

В общем, если правильно понял, то такой код точно должен помочь(если структура, показанная на скрине совпадает с реальностью):
Код: (vb)
Sub Открытие_и_копия3()
    Dim i As Long, j As Long
    Dim iLastRow As Long, llastr_2 As Long, lres_col As Long
         
    Workbooks.Open Filename:="C:\Users\Администратор\Desktop\Пример\Книга1.xlsm"
    Set List1 = Workbooks("Книга1.xlsm").Sheets("Лист1")
    Set List2 = Workbooks("Книга2.xlsm").Sheets("Лист1")
    iLastRow = List1.Cells(List1.Rows.Count, 1).End(xlUp).Row
    lres_col = 1
    For i = 2 To iLastRow
        If LCase(List1.Cells(i, 1).Value) Like "*форум*" Then
            If LCase(List1.Cells(i, 4).Value) <> "отсутствует" Then
                If Len(List1.Cells(i, 3)) < 25 Then
                    llastr_2 = List2.Cells(20, lres_col).End(xlUp).Row
                    If llastr_2 < 7 Then
                        lres_col = lres_col + 1
                        llastr_2 = 7
                    End If
                    List2.Cells(llastr_2 + 1, lres_col).Value = List1.Cells(i, 2).Value
                End If
            End If
        End If
    Next i
    Workbooks("Книга1.xlsm").Close False
End Sub
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Stepashka
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 17


Просмотр профиля
« Ответ #12 : 20.05.2018, 08:04:16 »

Дмитрий, спасибо большое, все получилось.
Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru