С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
Dimon_Stv

Копирование с листа на лист

19.05.2011, 09:53. Показов 3715. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане!
У меня такая задачка никак не могу ее решить. Есть эксель с двумя листами, на одном коды номенклатуры, на другом коды номенклатуры и цена. Нужно в первом листе слева от кодов проставить соответствия цен с другого листа если такой код есть на втором листе. Пробую так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Dim cOtkuda As Range
Dim cKuda As Range
Dim f As Range 'найденное значение
 
Set cKuda = Worksheets("Лист1").Range("a3:a7")
Set cOtkuda = Worksheets("Лист2").Range("a3:a6")
 
 
With cKuda
    Set f = cOtkuda.Find(cKuda.Text, LookIn:=xlValues)
End With
Дальше не знаю что делать, что здесь можно придумать?
Вложения
Тип файла: rar Задачка.rar (14.3 Кб, 33 просмотров)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.05.2011, 09:53
Ответы с готовыми решениями:

Копирование данных с листа на лист
Подскажите как в VBA Excel описать кнопку, чтобы при её нажатии 6 числовых значений разных ячеек 1-го листа копировались в другие 6...

Копирование таблиц с листа на лист
Реализовать функцию копирования таблицы, расположенной на первом листе книги MS Excel, на второй лист с расчетом средних значений во всех...

Копирование ячеек с листа на лист по условию одной ячейки
Уважаемые специалисты Excel, прошу Вашей помощи в написании макроса. Сам на просторах интернета найти не смог. В чем собственно...

11
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
19.05.2011, 10:14
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
Private Sub CommandButton1_Click()
    Dim src As Worksheet
    Dim dst As Worksheet
    Dim i As Long, j As Long, n As Long
    
    Set src = ThisWorkbook.Worksheets("Лист2")
    Set dst = ThisWorkbook.Worksheets("Лист1")
    
    i = 3
    Do While Not dst.Cells(i, 1).Value = Empty
        j = 3
        Do While Not src.Cells(j, 1).Value = Empty
            If src.Cells(j, 1).Value = dst.Cells(i, 1).Value Then
                dst.Cells(i, 2).Value = src.Cells(j, 2).Value
                dst.Cells(i, 3).Value = src.Cells(j, 3).Value
                Exit Do
            End If
            j = j + 1
        Loop
        i = i + 1
    Loop
    
    Set src = Nothing
    Set dst = Nothing
End Sub
1
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
19.05.2011, 10:51
Мой вариант:
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
Sub P1()
Dim Куда As Excel.Worksheet, Откуда As Excel.Worksheet
Dim Поиск As Excel.Range, Адрес As String
Dim LastRowКуда As Long, LastRowОткуда As Long
Dim Ячейка As Excel.Range
'Будем обращаться к листам через объектные переменные: Куда и Откуда.
'Меньше кода писать и код быстрее выполняется.
Set Куда = ActiveWorkbook.Worksheets("Лист1")
Set Откуда = ActiveWorkbook.Worksheets("Лист2")
'Определяем последние заполненные строки в столбце А,
'чтобы весь столбец не просматривать (чтобы код быстрее работал).
'Специальной функции для этого нет в объектной модели Excel, поэтому нужно извращнуться.
'Чтобы понять, как это работает, поставьте курсор на самую последнюю ячейку в столбце A
'и нажмите сочетание клавиш на клавиатуре: Ctrl + стрелка вверх.
'В результате активной станет первая ячейка, содержащая текст.
LastRowКуда = Куда.Cells(Куда.Rows.Count, 1).End(xlUp).Row
LastRowОткуда = Откуда.Cells(Откуда.Rows.Count, 1).End(xlUp).Row
'Будем просматривать все ячейки на листе Откуда и искать их содержимое на листе Куда.
For Each Ячейка In Откуда.Range(Откуда.Cells(3, 1), Откуда.Cells(LastRowОткуда, 1))
    With Куда.Range(Куда.Cells(3, 1), Куда.Cells(LastRowКуда, 1))
        'LookIn:=xlFormulas - так быстрее поиск осуществляется.
        'LookAt:=xlWhole - полное соотвтествие двух ячеек.
        Set Поиск = .Find(What:=Ячейка.Value, LookIn:=xlFormulas, _
            LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False)
        If Not Поиск Is Nothing Then
            Адрес = Поиск.Address
            Do
                Поиск.Offset(0, 1).Value = Ячейка.Offset(0, 1)
                Поиск.Offset(0, 2).Value = Ячейка.Offset(0, 2)
                Set Поиск = .FindNext(Поиск)
            Loop While Not Поиск Is Nothing And Адрес <> Поиск.Address
        End If
    End With
Next Ячейка
MsgBox "Работа сделана"
End Sub


mc-black,
у тебя идёт постоянный просмотр одного и того же диапазона. Find быстрее работает. Правда его не всегда можно использовать (например, если имеет место объединение ячеек).
2
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
19.05.2011, 11:05
Не использую Find. Когда оптимизирую скорость, вложеный цикл делаю не по диапазону, а по массиву, созданному из диапазона. Цель этого куска - показать человеку, как это делается, а не написать наиболее быстрый (и возможно непонятный для новичка) код. Кстати, давай возьмем с Find и проверим разницу во времени на его примере таблиц из 5 строчек?
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
19.05.2011, 11:09
mc-black,
я проводил тест на скорость и результат здесь на форуме выкладывал.
Я брал Excel 2007 (там больше строк), помещал в последнюю строку данные и просматривал все ячейки с 1 до последней и осуществлял поиск.
Быстрее был поиск, причём в 10 раз что ли (это если по формулам искать, а не по значению).

А вот в массив я не загонял.
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
19.05.2011, 11:21
Есть эксель с двумя листами, на одном коды номенклатуры, на другом коды номенклатуры и цена. Нужно в первом листе слева от кодов проставить соответствия цен с другого листа
А стандартная ВПР не устраивает?
0
Dimon_Stv
19.05.2011, 11:29
Код с find очень ксати у меня на каждом листе по 5000 позиций. Мой пример это сильное упращение ))

Добавлено через 5 минут
Цитата Сообщение от Alex77755 Посмотреть сообщение
А стандартная ВПР не устраивает?
Неа, мне помимо этого нужно реализовать выбор периода и в зависимости от выбора использовать тот или иной лист, который характеризует период
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
19.05.2011, 11:41
Киньте плиз код с find
Хм! А куда ещё кидать? Просто скопируй!
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
19.05.2011, 14:52
Цитата Сообщение от Busine2009 Посмотреть сообщение
я проводил тест на скорость и результат здесь на форуме выкладывал.
Я брал Excel 2007 (там больше строк), помещал в последнюю строку данные и просматривал все ячейки с 1 до последней и осуществлял поиск.
Быстрее был поиск, причём в 10 раз что ли (это если по формулам искать, а не по значению).
Охотно верю. Надо будет попрактиковать твой метод, может получу хороший доп выигрыш при поиске по формулам по сравнению с поиском по значениям в массиве. Если устроит - переделаю макросы, которыми делаю свою работу =)
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
19.05.2011, 14:55
mc-black,
но Find чувствителен (например, если имеет место объединение ячеек). Я сам на практике ни разу не использовал (только в Word работал).
От Word и пошло - кто-то сказал, что быстрее искать в Word, чем просматривать, например, все слова.
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
19.05.2011, 14:56
ВПР во многих случаях не подходит, так как запрограммирована она кривыми руками и нормально отработает только на сортированном списке, а это в Excel не всегда можно гарантировать. С ВПР также мне не нравится, что ключевая колонка должна быть обязательно левее (выше), чем подставляемые данные, что тоже бывает накладывает ограничения.
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
19.05.2011, 23:04
mc-black,
ВПР во многих случаях не подходит, так как запрограммирована она кривыми руками и нормально отработает только на сортированном списке, а это в Excel не всегда можно гарантировать. С ВПР также мне не нравится, что ключевая колонка должна быть обязательно левее (выше), чем подставляемые данные, что тоже бывает накладывает ограничения.
Если б ты знал как мне не нравится система СИ: Почему это я должен измерать объём выпитого в литрах, а не пинтах?
У тебя НЕ КРИВЫЕ руки?
Уверен???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2011, 23:04
Помогаю со студенческими работами здесь

Копирование строк с листа на лист при условии их заливки
Добрый день. Помогите пожалуйста реализовать на первых порах одну операцию. Дано: Книга (в приложении). в ней 2 листа. в них...

Копирование данных из разных ячеек одного листа на другой лист
Ребят, доброго всем вечера. Требуется помощь. VBA в рамках предмета под названием &quot;информатика&quot;, изучал лет 10 назад, на первом...

Копирование ячеек столбца одного листа и переноса на другой лист
Доброго времени суток всем вам, уважаемые форумчане. В виду рабочей необходимости, я начал изучать программирование на VBA. Однако на...

Экономное копирование из одного листа в другой (добавление готовых накладных на лист для печати в excel)
Здравствуйте, подскажите, пожалуйста макрос который будет компактно копировать подготовленные накладные, на лист, с которого в дальнейшем...

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru