Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 23.01.2020
Сообщений: 8
Excel

Перенос данных на другие листы

23.01.2020, 12:02. Показов 3953. Ответов 20
Метки нет (Все метки)

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

В общем, требуется автоматическая фильтрация по столбцу H на листе "Лист для выгрузки" в соответствии с листом кодов (код = район).
Затем в трех столбцах из отфильтрованных строк требуется выбрать информацию из столбцов B, С и D (не более 20 строк) и перенести на лист "Опись" в соответствующие графы в столбцах B и C. (Т.е. "Регистрационный номер" в "Регистрационный номер", "ФИО клиента" в "ФИО клиента" и "Адрес доставки" в "Адрес доставки").

И так для каждого из кодов: отфильтровываем столбец H по коду, если что-то есть, то оно нужные столбцы переносятся на другой лист. Проблема в том, что в случае, если фильтр ничего не находит, то вся информация из столбцов переносится на другой лист и с этим ничего не сделать.

Затем фильтры сбрасываются и вся информация по столбцам переносится в "Журнал на сайт" (вот с этим я вроде справился).

Заранее спасибо за помощь!

Visual Basic
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Sub Макрос1()
 
  Sheets("Лист для выгрузки").Select
    ActiveSheet.Range("$A$1:$I$1000").AutoFilter Field:=8, Criteria1:= _
        "40262563000, г. Санкт-Петербург"
    Range("B2").Select
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(19, 1)).Select
    Selection.Copy
    Sheets("Опись").Select
    Range("B27:C46").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Лист для выгрузки").Select
    Range("D2").Select
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(19, 0)).Select
    Selection.Copy
    Sheets("Опись").Select
    Range("E27:E46").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        
        ' Далее следует то же самое для других кодов и районов:
        
        Sheets("Лист для выгрузки").Select
    ActiveSheet.Range("$A$1:$I$1000").AutoFilter Field:=8, Criteria1:= _
        "40263561000, г. Санкт-Петербург"
    Range("B2").Select
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(19, 1)).Select
    Selection.Copy
    Sheets("Опись").Select
    Range("B63").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Лист для выгрузки").Select
    Range("D2").Select
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(19, 0)).Select
    Selection.Copy
    Sheets("Опись").Select
    Range("E63").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        
         ' И т.д. Заканчивается переносом в журнал:
        
        ActiveWindow.ScrollRow = 1
    ActiveWindow.ScrollColumn = 1
        
    Sheets("Лист для выгрузки").Select
    ActiveSheet.Range("$A$1:$I$1000").AutoFilter Field:=8
    Range("A2:G200").Select
    
    Selection.Copy
    Sheets("Журнал на сайт").Select
    Range("B2:H200").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub
К сожалению, файл слишком большой, потому запакован в zip.
Вложения
Тип файла: zip Форма заявок.zip (50.4 Кб, 7 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.01.2020, 12:02
Ответы с готовыми решениями:

Перенос данных в отдельные листы по форме и условию
Здравствуйте!! Есть массив Данных в разрезе Отделов, нужно перенести каждый Отдел из Данных в отдельные листы с наименованием листа также...

Перенос данных из одного листа одной таблицы в создаваемые листы другой таблицы
Доброго времени суток! Подскажите пожалуйста как написать макрос в Excel для переноса данных из одного листа одной таблицы в создаваемые...

Перенос данных excel -excel на разные листы
Доброго времени суток. Возникла небольшая проблема: Переношу данные из книги в книгу, но в каждой книге по 3 листа, а данные...

20
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
23.01.2020, 15:03
Цитата Сообщение от Corovaneer Посмотреть сообщение
И так для каждого из кодов: отфильтровываем столбец H по коду, если что-то есть, то оно нужные столбцы переносятся на другой лист
Вы фильтруете и копируете данные всегда в ячейки одного и того же рабочего листа "Опись", что не имеет смысла, т.к. в конце всё равно останутся данные только последней фильтрации.
0
0 / 0 / 0
Регистрация: 23.01.2020
Сообщений: 8
23.01.2020, 15:47  [ТС]
Из того, что я вижу сейчас, фильтровать и копировать он может правильно, по очереди для каждого из кодов. Проблема одна: если фильтр не находит ничего, то нужно, чтобы ничего не копировалось. Или были пустые строки, которые бы копировались. А он копирует данные из неотфильтрованных строк.
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
23.01.2020, 16:04
А я вижу, что сейчас очередь не имеет смысла, т.к. новое копирование приводит к удалению старых данных и в результате - данные только последней фильтрации.
0
0 / 0 / 0
Регистрация: 23.01.2020
Сообщений: 8
23.01.2020, 17:45  [ТС]
Наверное, я недостаточно полно описал действия в этой части. В файле имеются описи для 18 кодов (=районов), соответственно, при сортировке по одному коду данные отправляются в опись к соответствующему коду району, при сортировке по следующему коду - в следующую опись, соответствующую следующему коду.
Т.е. каждый раз копирование происходит на тот же лист, но в другую часть этого листа.
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
23.01.2020, 18:48
Лучший ответ Сообщение было отмечено Corovaneer как решение

Решение

Вы правы, это я старый крот не вижу очевидного.

В общем, предлагаю просто не фильтровать, если нет искомого значения. Т.е. сначала определим наличие, например, с помощью стандартной функции рабочего листа СЧЁТЕСЛИ/COUNTIF , если есть, копируем.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim ws1 As Worksheet, ws2 As Worksheet, r As Range, c&, i&, a
Set ws1 = Worksheets("Лист для выгрузки") 'Лист1
Set ws2 = Worksheets("Опись") 'Лист2
 
a = Array("40262563000", "40263561000", "40265561000")
For i = 1 To UBound(a)
    If Application.CountIf(ws1.Range("H:H"), a(i) & "*") Then
       ws1.Range("A:H").AutoFilter 8, a(i) & "*"
       Set r = ws1.AutoFilter.Range
       With r
            .Resize(.Rows.Count - 1).Offset(1).Columns(2).Copy
       End With
       ws2.Cells(c * 36 + 27, "B").PasteSpecial
       c = c + 1
    End If
Next
Правда здесь нет ограничений на 20 строк. Возможно имеет смысл просто перебирать элементы массива/ячейки или только видимые ячейки.


С ограничением в 20 строк, но уже без копирования :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim ws1 As Worksheet, ws2 As Worksheet, t$, i1&, i2&, i3&, a1, a2, a3(19, 3)
Set ws1 = Worksheets("Лист для выгрузки") 'Лист1
Set ws2 = Worksheets("Опись") 'Лист2
 
a1 = Array("40262563000", "40263561000", "40265561000")
With ws1
     '.AutoFilterMode = False
     If .FilterMode Then .ShowAllData
     a2 = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "H").End(xlUp)).Value
End With
 
For i1 = 0 To UBound(a1)
    t = a1(i1) & "*"
    For i2 = 1 To UBound(a2)
        If a2(i2, 8) Like t Then
           a3(i3, 0) = a2(i2, 2)
           a3(i3, 1) = a2(i2, 3)
           a3(i3, 3) = a2(i2, 4)
           i3 = i3 + 1: If i3 = 20 Then Exit For
        End If
    Next
    ws2.Cells(i1 * 36 + 27, "B").Resize(20, 4) = a3: Erase a3: i3 = 0
Next
1
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
23.01.2020, 19:33
Вообще-то копирование никто и не просил, просили перенос
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
23.01.2020, 19:45
В изначальном коде наличествует Copy и PasteSpecial
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
23.01.2020, 19:48
Это я вижу, но я сталкивался, что на самом деле бывает что пользователю нужно переносить данные, представляете!
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
23.01.2020, 19:53
Нет, не представляю. Но автор вставляет именно значения, об этом говорит константа xlPasteValues
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
23.01.2020, 19:55
Да вижу, вижу. Просто я люблю точность в высказывании желаний
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
23.01.2020, 20:00
А в чем неточность ? Автор пишет, что хочет перенести данные и осуществляет это с помощью копирования и вставки значений. Можно, конечно, придраться к тому, что в жизни, обычно, перенос подразумевает исчезновение об'екта в исходном месте пребывания. Но затем нужна такая мелочность...
0
0 / 0 / 0
Регистрация: 23.01.2020
Сообщений: 8
24.01.2020, 15:36  [ТС]
Ого, для меня этот код выглядит как магия, но главное, что он работает! Огромное вам спасибо!
0
0 / 0 / 0
Регистрация: 23.01.2020
Сообщений: 8
04.02.2020, 17:55  [ТС]
Еще раз спасибо уважаемому pashulka за код. Теперь возник новый вопрос, связанный с ограничением в 20 строк на странице "Опись".

Как оказалось, в случае, если происходит заполнение всех 20 строк, может остаться никуда не скопированная информация с листа "Лист для выгрузки". Соответственно, при заполнении этой самой строки потребуется добавление Описи клиентов справа от Описи клиентов с скопированной туда информацией, ну а далее потребуется копирование оставшейся информации с листа "Лист для выгрузки" на добавленную Опись клиентов. Если и эта Опись клиентов заполнится, потребуется добавление еще одной и т.д.
Я понимаю, что здесь потребуются циклы, так что к коду pashulka я добавляю что-то такое, но всё без толку:

Visual Basic
1
2
3
4
5
For i4 = (22, 55)
If ws2.Cells(46, 2) > 0 Then
ws2.Cells(i4, 8).Copy Cells(i4, 15)
End If
Next
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
06.02.2020, 14:15
Corovaneer, Если правильно понял Ваши хотелки, то :

Visual Basic
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
Private Sub Test()
    Dim t$, i1&, i2&, i3&, i4&, a1, a2, a3(19, 3)
    Dim ws1 As Worksheet, ws2 As Worksheet
    Set ws1 = Worksheets("Лист для выгрузки") 'Лист1
    Set ws2 = Worksheets("Опись") 'Лист2
 
    a1 = Array("40262563000", "40263561000", "40265561000")
    With ws1
         '.AutoFilterMode = False
         If .FilterMode Then .ShowAllData
         a2 = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "H").End(xlUp)).Value
    End With
 
    For i1 = 0 To UBound(a1)
        t = a1(i1) & "*"
        For i2 = 1 To UBound(a2)
            If a2(i2, 8) Like t Then
               a3(i3, 0) = a2(i2, 2)
               a3(i3, 1) = a2(i2, 3)
               a3(i3, 3) = a2(i2, 4)
               i3 = i3 + 1
               If i3 = 20 Then pseudoCopy ws2, a3, i3, i4
            End If
        Next
        If i3 Then pseudoCopy ws2, a3, i3, i4
    Next
End Sub
 
Private Sub pseudoCopy(ws2 As Worksheet, a3, i3&, i4&)
    ws2.Cells(i4 * 36 + 27, "B").Resize(20, 4) = a3
    Erase a3: i3 = 0: i4 = i4 + 1
End Sub
1
0 / 0 / 0
Регистрация: 23.01.2020
Сообщений: 8
07.02.2020, 11:30  [ТС]
pashulka, спасибо огромное! У меня есть только один вопрос: как раскидать оба Sub так, чтобы они работали, так сказать, в спайке. В рамках одного модуля два Sub работать не будут, а если раскидать их в разные модули, то ссылка не проходит. Может, я чего-то не понимаю?
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
07.02.2020, 11:32
Цитата Сообщение от Corovaneer Посмотреть сообщение
В рамках одного модуля два Sub работать не будут
- кто Вам сказал такую чушь?
Да вон выше сами поблагодарили пример кода где именно так и написано - в рамках одного модуля два Sub
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
07.02.2020, 11:33
Цитата Сообщение от Corovaneer Посмотреть сообщение
В рамках одного модуля два Sub работать не будут
Чё правда ? А мужики то и не знают
0
0 / 0 / 0
Регистрация: 23.01.2020
Сообщений: 8
07.02.2020, 12:52  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
- кто Вам сказал такую чушь?
Цитата Сообщение от pashulka Посмотреть сообщение
Чё правда ? А мужики то и не знают
Чувствую себя ужасно глупо, но я не понимаю, как применить этот код с двумя Sub в файле.
Вложения
Тип файла: zip Форма заявок (2).zip (78.7 Кб, 4 просмотров)
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
07.02.2020, 16:26
Примерно так
Вложения
Тип файла: zip Форма заявок.zip (30.9 Кб, 10 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2020, 16:26
Помогаю со студенческими работами здесь

Как програмно изменить ссылки на другие листы
Здрасьте! Задача такая: Есть лист с наименованиями товара и кодами. На ячейки этого листа ссылается куча других листов. Тоесть,...

Скопировать данные из sheet1 на другие листы этой же книги
Как макросам можно скопировать все данные из sheet1 в остальные скажем 5 sheet'ов

Процедура копирующая отрицательные или положительные числа на другие листы
Доброе утро всем форумчанам, сижу на экзамене. дали вот такую задачу, помогите пожалуйста. С меня причитается!:) На листе1 в столбце А...

Перенос данных на другие листы
Доброго времени суток. Хочу что бы данные из первого листа распространялись на все остальные листы в зависимости от статьи расходов в...

Перенос значений на другие листы по заданным условиям (Протоколы соревнований)
Помогите пожалуйста составить протокол соревнований с автоматическим подсчетом результатов. Условия следующие: Количество участников -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru