Копирование строки по условию vba excel

Копирование строк по условию из существующего набора данных в отдельную таблицу с помощью кода VBA Excel. Определение числа строк в исходной таблице.

Условие задачи

Есть исходная таблица (набор данных) со списком файлов, расположенных в двух папках. Необходимо строки таблицы, содержащие слово «Изображения», скопировать в новую таблицу, расположенную ниже исходного набора данных, через одну пустую строку. В результате должно получиться, как на изображении ниже:

Решение задачи

Код VBA Excel для копирования строк исходного набора данных по условию в отдельную таблицу:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Sub KopirovaniyeStrok()

Dim s As String, n As Long, m As Long, i As Long

‘Задаем условие поиска

s = «Изображения»

‘Определяем номер последней строки исходной таблицы

n = Range(«A2»).CurrentRegion.Rows.Count

‘Задаем номер первой строки новой таблицы

m = n + 2

    For i = 2 To n

        ‘Проверяем условие

        If Cells(i, 1) = s Then

            ‘Копируем строку, удовлетворяющую условию, в новую таблицу

            Cells(i, 1).Resize(1, 3).Copy Cells(m, 1)

            m = m + 1

        End If

    Next

End Sub

При желании, можно добавить в эту процедуру еще одну переменную и автоматическое определение количества столбцов:

Dim c As Long

c = Range(«A2»).CurrentRegion.Columns.Count

Тогда выражение копирования примет следующий вид:

Cells(i, 1).Resize(1, c).Copy Cells(m, 1)


 

paha83

Пользователь

Сообщений: 12
Регистрация: 01.01.1970

Доброго времени суток уважаемые форумчане!
Имею задачу которую не могу решить сам, из-за отсутствия знаний и навыков.
Исходные данные:
1. Несколько одинаковых по структуре листов (см. пример) 1, 2, 3;
2. Лист «Финиш».

Задача. С помощью VBA:
1. Скопировать строки из активнного листа либо1, либо 2… и вставить их на лист «Финиш».
Условия:
1. Копировать строки только при условии заполненной ячейки в столбце  «В»;
2. Скопированные строки должбыть вставлены как значения;
3. При копировании новых данных на лист «Финиш» они должны вставляться ниже старых;
4. Если в листе «Финиш» есть заполненные строки с копируемой датой, то старые затираются, а на их место становятся новые;
5. Перезаписать данные можно только в течении 1-го дня после указанной даты в листах 1, 2 …, либо при вводе пароля (скажем 143).

Спасибо!

Прикрепленные файлы

  • Копия.xlsx (48.88 КБ)

 

CAHO

Пользователь

Сообщений: 2183
Регистрация: 25.02.2013

Пункт 3 и 4 противоречат друг другу. Или я не так понял.

Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.

 

paha83

Пользователь

Сообщений: 12
Регистрация: 01.01.1970

Приветствую, САНО!
Спасибо за внимание.
Может быть я не так описал, попробую разъяснить.
Противоречия невижу, т.к. п. 4 нежен для того чтобы данные с одной даты не задваивались в отчете, если в течении следующего дня после копируемой даты выявится ошибка то необходима возможность внести корректировку и перезаписать данные.
А в случае если пере записывание происходит позже чем 1 день после копируемой даты (п. 5) — это для защиты данных от потери (скажем вредительство).

 

kakaccc

Пользователь

Сообщений: 5
Регистрация: 22.09.2015

#4

22.09.2015 15:38:18

paha83

, если еще актуально:

Код
Sub Copy_rows_if()
Dim currentRow As Integer
Dim sourceCol As Integer
Dim LastRow As Integer
Dim currentRowValue
Dim sourcews As String

sourcews = ActiveSheet.Name 'базовый лист
sourceCol = 2   'колонка B ключевая
RowCount = Cells(Rows.Count, sourceCol).End(xlUp).Row

For currentRow = 1 To RowCount  'для всех строк базового листа
    currentRowValue = Cells(currentRow, sourceCol).Value
    If Not (IsEmpty(currentRowValue) Or currentRowValue = "") Then
          Rows(currentRow).Copy
          Worksheets("Финиш").Select
          LastRow = Cells(Rows.Count, sourceCol).End(xlUp).Row
          Range(Cells(LastRow + 1, 1), Cells(LastRow + 1, 1)).PasteSpecial Paste:=xlPasteValues
          Worksheets(sourcews).Activate
    End If
Next
End Sub

Здесь первые 3 пункта.

Прикрепленные файлы

  • Копия — копия.xlsm (54.39 КБ)

Изменено: kakaccc22.09.2015 18:11:32

 

kakaccc

Пользователь

Сообщений: 5
Регистрация: 22.09.2015

#5

23.09.2015 15:35:13

Для 5 пункта:

Код
Sub zashita_dannyh()
Dim currentRow As Integer
Dim sourceCol As Integer
Dim data As String

sourceCol = 2
RowCount = Cells(1, sourceCol).End(xlDown).Row
RowCount_2 = ActiveSheet.Cells(RowCount, sourceCol).End(xlDown).Row
data = Range(Cells(RowCount, sourceCol), Cells(RowCount, sourceCol)).Value

'проверка на ошибку
For currentRow = RowCount To RowCount_2 - 2
    currentRowValue = Cells(currentRow, sourceCol).Value
    If Not (IsEmpty(currentRowValue) Or currentRowValue = "") And _
    Cells(currentRow + 1, sourceCol).Value <> currentRowValue Then
        MsgBox ("даты на лите не совпадают")
        Exit Sub
    End If
Next

'протектим лист
If Date - DateValue(data) > 1 Then
ActiveSheet.Protect Password:="143" 'пароль 143
End If
End Sub

Хотя, по-моему, без макроса будет даже проще. Пока он настроен так, что его надо запустить на каждом листе, который будет затем защищен.

Прикрепленные файлы

  • Копия — копия.xlsm (55.93 КБ)

 

paha83

Пользователь

Сообщений: 12
Регистрация: 01.01.1970

Доброго времени суток,

kakaccc!

Большое спасибо за ответ и помощь.
Для меня тема актуальна, т.к. схожие задачи приходится решать постоянно.

Еще раз спасибо!!!

 

rSkrin

Пользователь

Сообщений: 3
Регистрация: 26.02.2016

Добрый день!
Друзья, знатоки Excel, подскажите пожалуйста решение проблемы, аналогичной вышеизложенной с небольшим усложнением. Требуется скопировать все строки таблицы ежедневного отчета, кроме шапки (т.е. начиная с 5-й строки), из листа «отчет» в лист «архив», ниже ранее скопированных, при условии заполнения  всех ячеек в столбце 5 (Е), т.е . достигнута полнота отчета. Если хоть одна ячейка в столбце 5 не заполнена не производить копирование на лист  «архив». И подскажите пожалуйста, возможно ли отображение строк на листе «архив», с рамками как в таблице на листе «отчет» или автоматическое добавление границ таблицы.

 

kakaccc

Пользователь

Сообщений: 5
Регистрация: 22.09.2015

#8

27.02.2016 17:38:57

Код
Sub copy_to_archive()

Dim currentRow As Integer
Dim sourceCol As Integer
Dim LastRow As Integer
Dim currentRowValue
Dim sourcews As String
Dim Rowsnum As Integer

sourcews = ActiveSheet.Name 'базовый лист
sourceCol = 5   'Ключевая E колонка
Set myTable = Worksheets(sourcews).Range("A1").CurrentRegion
Rowsnum = myTable.Rows.Count

For currentRow = 5 To Rowsnum  'проверяем есть ли пустые в 5-ой колонке
    currentRowValue = Cells(currentRow, sourceCol).Value
    If (IsEmpty(currentRowValue) Or currentRowValue = "") Then
    MsgBox ("Внимание! Есть пустые ячейки.")
    Exit Sub
    End If
Next

For currentRow = 5 To Rowsnum  'Копируем
    Rows(currentRow).Copy
    Worksheets("Архив").Select
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    With Range(Cells(LastRow + 1, 1), Cells(LastRow + 1, 1))
    .PasteSpecial Paste:=xlPasteValues
    .PasteSpecial Paste:=xlPasteFormats
    End With
    Worksheets(sourcews).Activate
Next
End Sub

Немного громоздкий макрос получился.
Ограничение такое: таблица должны начинаться с ячейки А1.
rSkrin, если сойдет, то потом откалибруем под ваши нужды.

Изменено: kakaccc28.02.2016 02:18:56

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#9

27.02.2016 18:36:24

kakaccc, чем по-Вашему будут отличаться результаты, если блок:

Код
For currentRow = 5 To Rowsnum 'Копируем
 Rows(currentRow).Copy
 Worksheets("Архив").Select
 LastRow = Cells(Rows.Count, 1).End(xlUp).Row
 With Range(Cells(LastRow + 1, 1), Cells(LastRow + 1, 1))
 .PasteSpecial Paste:=xlPasteValues
 .PasteSpecial Paste:=xlPasteFormats
 End With
 Worksheets(sourcews).Activate
Next

записать так:

Код
with Worksheets("Архив")
     LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
     myTable.offset(5).resize(myTable.Rows.Count-5).copy .Cells(LastRow + 1, 1)
end with

;)

Я сам — дурнее всякого примера! …

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

Файл должен находиться в папке c:1. На таблице ПКМ-Обновить.

Прикрепленные файлы

  • Копия.xlsx (57.41 КБ)

Неизлечимых болезней нет, есть неизлечимые люди.

 

kakaccc

Пользователь

Сообщений: 5
Регистрация: 22.09.2015

KuklP, потому что я нуб в vba  :D

Спасибо! Буду теперь знать и использовать эту функцию.
Но хотел бы сначала разобраться. Объясни, пожалуйста, последнее действие: …copy .Cells(LastRow + 1, 1)
Как это работает? Это типа destination? К чему относится точка перед Cells() Почему, вообще, происходит вставка копируемого?

 

rSkrin

Пользователь

Сообщений: 3
Регистрация: 26.02.2016

Спасибо друзья! Но есть вопрос. Уважаемый kakaccc, правильно ли я понял про «таблица должна начинаться с ячейки А1»- т.е.  начало всей таблицы, в том числе и шапки.  

 

rSkrin

Пользователь

Сообщений: 3
Регистрация: 26.02.2016

Вопрос отменяю. Чуть подправил, проверил работу, все отлично!!! Спасибо.

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#14

28.02.2016 13:55:14

Цитата
kakaccc написал:
Это типа destination? К чему относится точка перед Cells()

Да, это destination.
выражением with Worksheets(«Архив») мы объявляем ссылку  на родительский объект Worksheets(«Архив»). дальше всему, что начинается с точки, вба будет пытаться присвоить родительский объект. Т.е. конструкцию

Код
with Worksheets("Архив")
 LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
 myTable.offset(5).resize(myTable.Rows.Count-5).copy .Cells(LastRow + 1, 1)
end with

можно записать буквально:

Код
 LastRow = Worksheets("Архив").Cells(Worksheets("Архив").Rows.Count, 1).End(xlUp).Row
 myTable.offset(5).resize(myTable.Rows.Count-5).copy Worksheets("Архив").Cells(LastRow + 1, 1)

в этом слуячае родительский объект вычисляется 3 раза вместо одного в предыдущем примере.
ВСЕ ЭТО и много другого интересного есть в справке по F1, причем составлено гораздо профессиональней и понятней чем в моем объяснении.

Я сам — дурнее всякого примера! …

 

kakaccc

Пользователь

Сообщений: 5
Регистрация: 22.09.2015

KuklP, все, раз это destination, то вопросов нет. Более менее разобрался. Буду теперь пользоваться. Красиво и лаконично получилось. Спасибо за объяснение!

rSkrin, да, вся таблица должна начинаться с А1 (шапка в вашемслучае). Можно сделать независимо от находжения таблицы, используя свойство CurrentRegion, например. Но тогда перед запуском макроса надо будет выделять какую-нибудь ячейку из таблицы. Первоначально я так и записал макрос. Не знал как для вас проще будет. Если хотите, можно так сделать.

 

0mega

Пользователь

Сообщений: 170
Регистрация: 24.12.2012

#16

06.11.2022 11:54:18

KuklP

, здравствуйте

Цитата
KuklP написал:
LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row

почему команда начинается с точки
LastRow = .Cells(.Rows …
Ранее Вы предоставили  «общепринятую «

Цитата
написал:
LastRow = Cells(Rows.Count, 1).End(xlUp).Row

Какое у них отличие ?

 

MikeVol

Пользователь

Сообщений: 230
Регистрация: 20.10.2020

Ученик

#17

06.11.2022 12:29:09

0mega, Думаю если вы прочтёте справку то возможно поймёте что к чему.

почему команда начинается с точки

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Option Explicit         ' Обязательное объявление переменных
Option Compare Text     ' отсутствие чувствительности к регистру при сравнении символов
 
Sub Raspredelenie_po_listam()
    Const FirstRow& = 7 ' Константа - первая строка данных ниже шапки на всех листах
    Dim i&, j&, LastRow&, LastRowTarget&, ShName, Sh_Target As Worksheet, Prefix$, FormulaRC$, A
    Application.ScreenUpdating = False ' Временное отключение обновления экрана в Excel
    For Each ShName In Array("Лист2", "Лист3", "Лист4") ' Цикл по 3 листам с результатами для очистки старых данных
        With Sheets(ShName) ' Работа с объектом Sheet через символ "."
            LastRowTarget = .Cells(.Rows.Count, "Z").End(xlUp).Row ' Определение последней заполненной строки по столбцу Z
            If LastRowTarget < FirstRow Then LastRowTarget = FirstRow  ' последняя заполненная строка не должна быть меньше FirstRow  (=7)
            .Rows(FirstRow & ":" & LastRowTarget).Clear    ' Удаление строк со старыми данными при новом распределении
        End With
    Next ShName
    With Лист1 ' Работа с объектом Лист1 (программное имя объекта) через символ "."
        LastRow = .Cells(.Rows.Count, "Z").End(xlUp).Row  ' Определение последней заполненной строки по столбцу Z
        Prefix = "=" & Лист1.Name & "!R" ' Первая часть ссылочных формул
        A = .Range(.Cells(1, 1), .Cells(LastRow, 15)).Value ' Формируем массив для проверки условий
        For i = FirstRow To LastRow ' Цикл по строкам анализируемого листа
            A(i, 8) = Trim(A(i, 8)) ' удаление пробелов спереди и сзади в элементах 8-го столбца массива
            A(i, 15) = Trim(A(i, 15))
            If A(i, 8) = "ЗБС" Or A(i, 8) = "ВНС" Then ' Комплекс условий 1
                Set Sh_Target = Лист2 ' Объектная ссылка на лист цель.
            ElseIf (A(i, 8) = "Конс" Or A(i, 8) = "Раск") And A(i, 15) = "Я" Then ' Комплекс условий 2
                Set Sh_Target = Лист3 ' Объектная ссылка на лист цель.
            Else ' если не выполняется ни 1-ый ни 2-ой комлекс условий
                Set Sh_Target = Лист4 ' Объектная ссылка на лист цель.
            End If
            .Range(.Cells(i, 1), .Cells(i, "AU")).Copy  ' копирование  i-той строки (по AU,для последующей вставки форматов)
            FormulaRC = Prefix & Format(i) & "C"  ' 2-я часть ссылочной формулы
            With Sh_Target '  Работа с объектом листом-целью, куда копируем форматы, через символ "."
                 LastRowTarget = .Cells(.Rows.Count, "Z").End(xlUp).Row + 1 ' Определение последней пустой строки по столбцу Z
                 If LastRowTarget < FirstRow Then LastRowTarget = FirstRow
                .Cells(LastRowTarget, 1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ' вставка скопированных форматов
                .Rows(LastRowTarget).RowHeight = Лист1.Rows(i).RowHeight ' Выравнивание высоты строки по исходной
                .Range(.Cells(LastRowTarget, 1), .Cells(LastRowTarget, "AU")).FormulaR1C1 = FormulaRC  ' заполнение целевого диапазона ссылочными формулами
            End With
        Next i
    End With
    Set Sh_Target = Nothing ' Очистка памяти от объектных ссылок
End Sub

копирование строк с условием

Klara

Дата: Четверг, 07.08.2014, 08:33 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 24


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Дорогие ребята, помогите разобраться)
у меня есть активная книга1, в ней вызывается макрос, выбираем папку где хранятся ексель файлы, открываем по одной(программно), и берем построчно из открытой книги2 листа1 сравниваем столбец Е со столбцом Е в активной книге1 листа2(этот лист изначально пустой), если не равны то копируем всю строчку и вставляем в активную книгу1 на лист2
копировать в дальнейшем друг под друга
т.е. берем 2ую строку из кн2 смотрим столбец Е там стоит 245, сравниваем это значение со столбцом Е кн1, там пусто, он не равны, вставляем всю строчку в лист2 кн1, потом другую строчку берем в кн2 сравниваем начиная с первой строчки столбца Е кн1, не равны, копируем в след пустую строчку, 3яя строка кн2 сравниваем начиная с первой строчки, не равны, копируем и тд
пробовала так…не получаться(((
[vba]

Код

Sub Вывод2()
Dim sFolder As String
Dim sFiles As String
        With Application.FileDialog(msoFileDialogFolderPicker)
            If .Show = False Then Exit Sub
            sFolder = .SelectedItems(1)
            Workbooks(«Книга1»).Activate
        End With
        sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, «», Application.PathSeparator)
        Application.ScreenUpdating = False
        sFiles = Dir(sFolder & «*.xls*»)
        Do While sFiles <> «»

                           Workbooks.Open sFolder & sFiles
            Worksheets(«Лист1»).Activate             

                            r_ = Range(«B» & Rows.Count).End(xlUp).Row

                                               For i = 2 To r_     
‘ тут ругается         
                If ThisWorkbook.Worksheets(1).Range(«E» & i).Value <> ActiveWorkbook.Sheets(2).Range(«E» & i).Value Then
                ThisWorkbook.Worksheets(1).Rows(i).Copy ActiveWorkbook.Worksheets(2).Cells(i)
                End If
Next i
End sub

[/vba]

Сообщение отредактировал KlaraЧетверг, 07.08.2014, 08:41

 

Ответить

RAN

Дата: Четверг, 07.08.2014, 09:33 |
Сообщение № 2

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

[vba]

Код

Sub Вывод2()
      Dim sFolder As String
      Dim sFiles As String
      r_ = ThisWorkbook.Range(«B» & ThisWorkbook.Rows.Count).End(xlUp).Row
      With Application.FileDialog(msoFileDialogFolderPicker)
          If .Show = False Then Exit Sub
          sFolder = .SelectedItems(1)
          ‘            Workbooks(«Книга1»).Activate
      End With
      sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, «», Application.PathSeparator)
      Application.ScreenUpdating = False
      sFiles = Dir(sFolder & «*.xls*»)
      Do While sFiles <> «»
          ‘            Workbooks.Open sFolder & sFiles
          ‘            Worksheets(«Лист1»).Activate
          ‘            r_ = Range(«B» & Rows.Count).End(xlUp).Row
          With Workbooks.Open(sFolder & sFiles).Sheets(2)
              For i = 2 To r_
                  ‘ тут ругается
                  ‘                If ThisWorkbook.Worksheets(1).Range(«E» & i).Value <> ActiveWorkbook.Sheets(2).Range(«E» & i).Value Then
                  ‘                ThisWorkbook.Worksheets(1).Rows(i).Copy ActiveWorkbook.Worksheets(2).Cells(i)
                  If ThisWorkbook.Worksheets(1).Range(«E» & i).Value <> .Range(«E» & i).Value Then
                      ThisWorkbook.Worksheets(1).Rows(i).Copy .Cells(i, «A»)
                  End If
              Next i
          End With
          sFiles = Dir
      Loop
End Sub

[/vba]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANЧетверг, 07.08.2014, 09:35

 

Ответить

Rioran

Дата: Четверг, 07.08.2014, 09:42 |
Сообщение № 3

Группа: Авторы

Ранг: Ветеран

Сообщений: 903


Репутация:

290

±

Замечаний:
0% ±


Excel 2013

Klara, здравствуйте.

Из очевидного Вашему макросу требуется:

1). Добавить закрывающий Loop к циклу Do While, это критично. Иначе цикла не будет.
2). Добавить перед закрытием цикла sFiles = Dir, чтобы макрос переходил к следующему файлу. Иначе на одном и том же топтаться будет.
3). После цикла в конце добавить Application.ScreenUpdating = True. Это не критично, скорее эстетика — если выключаешь обновление экрана — будь добр(а) его потом вернуть.
4). В Вашем макросе отсутствует поиск и перебор уже заполненных строк в ThisWorkBook’e.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279

 

Ответить

Klara

Дата: Четверг, 07.08.2014, 09:48 |
Сообщение № 4

Группа: Пользователи

Ранг: Новичок

Сообщений: 24


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

открывает теперь вообще все файлы которые в папке, даже ту,что уже открыта
и не понятно куда он копирует

 

Ответить

RAN

Дата: Четверг, 07.08.2014, 09:57 |
Сообщение № 5

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Копирует туда, куда в и пытались — на второй лист открываемой книги.
Повторное открытие я прозевал, да и у вас его не было.
По всему остальному, вам еще вчера Дмитрий ответил

Цитата

Что именно надо сравнить и по какому принципу — тоже неясно. Вот когда распишите нормально, что и с чем и как сравнивать — тогда можно будет попробовать Вам помочь. А так…


Быть или не быть, вот в чем загвоздка!

 

Ответить

Klara

Дата: Четверг, 07.08.2014, 09:57 |
Сообщение № 6

Группа: Пользователи

Ранг: Новичок

Сообщений: 24


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

1),2),3) это понятно)))это просто начальная вырезка из кода)
4)ThisWorkBook это имеется ввиду та самая книга, которую мы открываем, т.е. поиск непустых строк?если непустых, то по критериям
[vba]

Код

If Range(«B» & i).Value <> «» Then
                     If Range(«E» & i) <> «» Then
                         If IsDate(Range(«D» & i)) Then

                         End If
                     End If
                 End If

[/vba]

 

Ответить

RAN

Дата: Четверг, 07.08.2014, 10:00 |
Сообщение № 7

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

ThisWorkBook ничего в виду не имеется. ThisWorkBook это Эта Книга (где живет макрос). А активной может быть любая. Тут вы и запутались.


Быть или не быть, вот в чем загвоздка!

 

Ответить

Klara

Дата: Четверг, 07.08.2014, 10:04 |
Сообщение № 8

Группа: Пользователи

Ранг: Новичок

Сообщений: 24


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

вообщем видимо я не умею объяснять…(

 

Ответить

Klara

Дата: Четверг, 07.08.2014, 10:05 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 24


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

ааааа, ну вот наверно где мой косяк…а как сделать чтоб он обращался к открытой книге?

 

Ответить

RAN

Дата: Четверг, 07.08.2014, 10:09 |
Сообщение № 10

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

По кругу пошли? К открытой — это к какой?
Мой код обращается к двум книгам — Этой, и той, которая открыта макросом в данный момент (последняя).


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANЧетверг, 07.08.2014, 10:12

 

Ответить

Klara

Дата: Четверг, 07.08.2014, 10:12 |
Сообщение № 11

Группа: Пользователи

Ранг: Новичок

Сообщений: 24


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

которую открыл через диалоговое окно))
книга1(как её называла активная)-это как раз куда надо копировать
книга2(открытая) — откуда надо копировать

 

Ответить

RAN

Дата: Четверг, 07.08.2014, 10:14 |
Сообщение № 12

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

[vba]

Код

.Rows(i).Copy ThisWorkbook.Worksheets(1).Cells(i, «A»)

[/vba]
Очень сложно?


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANЧетверг, 07.08.2014, 10:14

 

Ответить

Klara

Дата: Четверг, 07.08.2014, 10:18 |
Сообщение № 13

Группа: Пользователи

Ранг: Новичок

Сообщений: 24


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

не сложно,спасибо

все какие то злые(

Сообщение отредактировал KlaraЧетверг, 07.08.2014, 10:18

 

Ответить

RAN

Дата: Четверг, 07.08.2014, 10:55 |
Сообщение № 14

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Вы считаете, что я со зла вам макрос правил?
Хорошо, буду добрым.


Быть или не быть, вот в чем загвоздка!

 

Ответить

Sub Программа()

        Dim shSrc As Worksheet, arrSrc()
    Dim shRes As Worksheet, arrRes(), r As Long
    Dim strFN_src As String
    Dim lr As Long, i As Long

            ‘1. Юзер выбирает файл-источник.
    strFN_src = GetFilePath
    If strFN_src = «» Then Exit Sub

        ‘2. Отключение монитора, чтобы ускорить работу макроса и чтобы меньше мигало.
    Application.ScreenUpdating = False

        ‘3. Присваивание листу-результату имени «shRes». Затем через это имя удобно обращаться к листу в коде.
    Set shRes = ActiveSheet

        ‘4. Открытие файла-источника.
        ‘ Листу «свод» присваивается имя «shSrc».
        ‘ ReadOnly:=True — нам нужно открыть только для чтения. Это может чем-нибудь упростить макрос.
    Set shSrc = Workbooks.Open(Filename:=strFN_src, ReadOnly:=True).Worksheets(«свод»)

        ‘5. Копирование некоторых данных из листа-источника в массив. С массивом быстрее работать, чем с эксель-ячейками.
        ‘ На листе не должно быть скрытых строк, иначе некоторые строки могут быть не учтены.
    lr = shSrc.Cells(shSrc.Rows.Count, «A»).End(xlUp).Row
    arrSrc() = shSrc.Range(«A1:C» & lr).Value

        ‘6. Создание ячеек в массиве-результате. Сначала в него запишутся данные, а затем он
        ‘ будет вставлен на эксель-лист. Это ускорит работу макроса.
        ‘ Строк создаётся максимально возможное кол-во, т.к. заранее не известно, сколько будет строк с данными.
    ReDim arrRes(1 To UBound(arrSrc, 1), 1 To 3)

        ‘7. Копирование данных из листа-источника в массив-результат.
    For i = 5 To UBound(arrSrc, 1)
        If (arrSrc(i, 1) = 1) And (arrSrc(i, 3) = «ВСЕГО») Then
            r = r + 1
            arrRes(r, 1) = arrSrc(i, 1)
            arrRes(r, 2) = arrSrc(i, 2)
            arrRes(r, 3) = shSrc.Cells(i, «P»).Value
        End If
    Next i

        ‘8. Закрытие файла-источника.
    shSrc.Parent.Close SaveChanges:=False

        ‘9. Действия, если не было найдено нужных строк.
    If r = 0 Then
        Application.ScreenUpdating = True
        MsgBox «В файле-источнике нет нужных данных.», vbExclamation
        Exit Sub
    End If

        ’10. Вставка данных на лист-результат.
    shRes.Range(«A3»).Resize(r, UBound(arrRes, 2)).Value = arrRes()

        ’11. Включение монитора.
    Application.ScreenUpdating = True

        ’12. Сообщение, чтобы было понятно, что программа завершила работу.
    MsgBox «Готово.», vbInformation

    End Sub

Private Function GetFilePath() As String

        Const sTitle As String = «Выберите файл КДРО»
    Const sInitialPath As String = «c:»
    Const sFilterDescription As String = «Книги Excel»
    Const sFilterExtention As String = «*.xls*»

        With Application.FileDialog(msoFileDialogOpen)
        .ButtonName = «Выбрать»: .Title = sTitle: .InitialFileName = sInitialPath
        .Filters.Clear: .Filters.Add sFilterDescription, sFilterExtention

                If .Show = 0 Then Exit Function

                GetFilePath = .SelectedItems(1)

            End With

    End Function

[свернуть]

Как скопировать строки из нескольких листов на основе критериев на новый лист?

Предположим, у вас есть книга с тремя листами, которые имеют такое же форматирование, как показано на скриншоте ниже. Теперь вы хотите скопировать все строки из этих листов, столбец C которых содержит текст «Завершено», в новый лист. Как можно быстро и легко решить эту проблему, не копируя и не вставляя их вручную?

Скопируйте строки из нескольких листов на основе критериев в новый лист с кодом VBA


Скопируйте строки из нескольких листов на основе критериев в новый лист с кодом VBA

Следующий код VBA может помочь вам скопировать определенные строки со всех листов в книге на основе определенного условия в новый лист. Пожалуйста, сделайте так:

1. Удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модулии вставьте следующий код в окно модуля.

Код VBA: копирование строк с нескольких листов на основе критериев на новый лист

Public Sub CopyRows_ValuesAndNumberFormats()
Dim xWs As Worksheet
Dim xCWs As Worksheet
Dim xRg As Range
Dim xStrName As String
Dim xRStr As String
Dim xRRg As Range
Dim xC As Integer
On Error Resume Next
Application.DisplayAlerts = False
xStr = "Kutools for Excel"
xRStr = "Completed"
Set xCWs = ActiveWorkbook.Worksheets.Item(xStr)
If Not xCWs Is Nothing Then
    xCWs.Delete
End If
Set xCWs = ActiveWorkbook.Worksheets.Add
xCWs.Name = xStr
xC = 1
For Each xWs In ActiveWorkbook.Worksheets
    If xWs.Name <> xStr Then
        Set xRg = xWs.Range("C:C")
        Set xRg = Intersect(xRg, xWs.UsedRange)
        For Each xRRg In xRg
            If xRRg.Value = xRStr Then
               xRRg.EntireRow.Copy
               xCWs.Cells(xC, 1).PasteSpecial xlPasteValuesAndNumberFormats
               xC = xC + 1
            End If
        Next xRRg
    End If
Next xWs
Application.DisplayAlerts = True
End Sub

Внимание: В приведенном выше коде:

  • Текст «Заполненная» в этом xRStr = «Завершено» сценарий указывает конкретное условие, на основе которого вы хотите скопировать строки;
  • C: C В этом Установите xRg = xWs.Range («C: C») скрипт указывает конкретный столбец, в котором находится условие.

3, Затем нажмите F5 ключ для запуска этого кода, и все строки с определенным условием были скопированы и вставлены в новый рабочий лист с именем Kutools for Excel в текущей рабочей книге. Смотрите скриншот:


Более относительные статьи с данными для извлечения или копирования:

  • Копирование данных на другой лист с помощью расширенного фильтра в Excel
  • Обычно мы можем быстро применить функцию расширенного фильтра для извлечения данных из необработанных данных на том же листе. Но иногда, когда вы пытаетесь скопировать отфильтрованный результат на другой рабочий лист, вы получаете следующее предупреждающее сообщение. В таком случае, как бы вы могли справиться с этой задачей в Excel?
  • Копировать строки на новый лист на основе критериев столбца в Excel
  • Например, есть таблица покупки фруктов, и теперь вам нужно скопировать записи на новый лист на основе указанных фруктов, как это легко сделать в Excel? Здесь я расскажу о нескольких методах копирования строк на новый лист на основе критериев столбца в Excel.
  • Копировать строки, если столбец содержит определенный текст / значение в Excel
  • Предположим, вы хотите найти ячейки, содержащие определенный текст или значение в столбце, а затем скопировать всю строку, в которой находится найденная ячейка, как вы можете с этим справиться? Здесь я представлю несколько методов, чтобы определить, содержит ли столбец определенный текст или значение, а затем скопировать всю строку в Excel.

Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы и хранение данных; Разделить содержимое ячеек; Объедините повторяющиеся строки и сумму / среднее значение… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Избранные и быстро вставляйте формулы, Диапазоны, диаграммы и изображения; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Группировка сводной таблицы по номер недели, день недели и другое … Показать разблокированные, заблокированные ячейки разными цветами; Выделите ячейки, у которых есть формула / имя

вкладка kte 201905


Вкладка Office — предоставляет интерфейс с вкладками в Office и значительно упрощает вашу работу

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (2)


Оценок пока нет. Оцените первым!

Sub Yana_Zhilak() 
Dim LastRow As Long, Rw As Long 'Объявили переменный послдедних строк для двух слистов
LastRow = Cells(Rows.Count, 1).End(xlUp).Row 'Нашли номер последней строки на активном листе (там, где кнопка)
With Sheets("Лист2") 'Применительно к Лист2
Rw = .Cells(Rows.Count, 1).End(xlUp).Row + 1 'Нашли номер первой свободной строки на этом листе
Range(.Cells(4, 1), .Cells(Rw + 1, 5)).ClearContents 'Очистили ПОЛНОСТЬЮ диапазон на втором листе
Rw = 7 'Указали, что первая свободная строка =7
For i = 7 To LastRow 'Цикл со строки № 7 по последнюю заполненную (на активном листе)
If Cells(i, 8) = "ЗБС" Then 'Если ячейка столбца 8 текущей строки = "ЗБС", то
Range(Cells(i, 1), Cells(i, 44)).Copy .Cells(Rw, 1) 'Дипазон (текущая строка, столбцы 1:44) копируем в первую свободную ячейку второго листа
Rw = Rw + 1 'Увеличивем переменную-счётчик первой свободной строки второго листа
End If
Next
End With
End Sub

Всем доброго времени суток. Пытаюсь написать макрос на VBA для Excel для переноса строки из таблицы на одном листе на другой при вводе в определенный столбец определенных данных. Написал обработчик события:

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim table1 As ListObject, table2 As ListObject, table3 As ListObject

    Set table1 = Application.ThisWorkbook.Worksheets("Имя листа").ListObjects("Таблица1")
    Set table2 = Application.ThisWorkbook.Worksheets("Имя листа").ListObjects("Таблица2")
    Set table3 = Application.ThisWorkbook.Worksheets("Имя листа").ListObjects("Таблица3")
    
    If Target.Count > 1 Then
        Exit Sub
    End If
    
    If Application.Intersect(Target, table1.ListColumns(2)) Then
        If Target.Value = "Îòâàë" Then
            removeFailed (Target.EntireRow)
        End If
        Exit Sub
    
    ElseIf Application.Intersect(Target, table2.ListColumns(2).Range) Then
        If Target.Value = "Условие" Then
            removeFailed (Target.EntireRow)
        End If
        Exit Sub
    
    ElseIf Application.Intersect(Target, table1.ListColumns(2).Range) Then
        If Target.Value = "Условие" Then
            removeFailed (Target.EntireRow)
        End If
        Exit Sub
    
    Else
        Exit Sub
    
    End If
End Sub

и саму функцию, которая осуществляет перенос:

Function removeFailed(targetRow As Range)
    Dim l
    
    targetRow.Select
    Selection.Copy
    Application.ThisWorkbook.Worksheets("Имя листа назначения").Select
    l = Application.ThisWorkbook.Worksheets("Имя листа назначения").ListObjects("Таблица назначения").Range.End(xlDown)
    Rows(l & ":" & l).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Application.ThisWorkbook.Worksheets("Имя листа").Select
    targetRow.Delete
End Function

При выполнении вылетает ошибка «Type Missmatch». Подскажите пожалуйста советом, что я сделал неверно и как исправить все так, чтобы скрипт выполнял необходимые действия. Заранее большое спасибо!

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Копирование строк на другой лист если excel
  • Копирование строк в excel макросы
  • Копирование страницы в excel с сохранением формата
  • Копирование формата в ms word
  • Копирование страницы word целиком

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии