С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 7
1

Проблема с копированием ячеек

24.05.2010, 17:32. Показов 1975. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
задача следующая.
есть файл (book1), например такой структуры:
A B C ....
1 25
2 23
3
4 21
. 45
. 67
. 34
.
.

и ещё один файл (book2), вот такой:
A B C
1 12 1
2 13 2
3 24 3
. 23 5
. 25 8
. 21 9
34 7
45 12
67 01
.
.
.

(в ячейках не обязателно числа, это так, для примера, есть просто пустые ячейки)

задача: копируем ячейку А1(book1)(А1=25), ищем в book2 ячейку идентичную А1(book1)(это будет А5), смещение на 1 ячейку влево (это будет В5), копирование содеожимого В5, возврат в book1 в ячеку В1 вставляем содеожимое В5. И так далее...., в результате book1 должна принять вид:

A B C ....
1 25 8
2 23 5
3
4 21 9
. 45 12
. 67 01
. 34 7
.

написал вот это (цикла пока нет):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub Macro1()
 
    Workbooks('book1.xls').Activate
    Range('A1').Select
    Selection.Copy
    
    Workbooks('Book2.xls').Activate
    Cells.Find(What:=Paste, After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False).Activate
    ActiveCell.Offset(0, 1).Select
    Application.CutCopyMode = False
    Selection.Copy
    Workbooks('Book1.xls').Activate
    Range('B1').Select
    ActiveSheet.Paste
    
End Sub
подскажите как сделать правильно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.05.2010, 17:32
Ответы с готовыми решениями:

Проблема с копированием на ФТП
Возникла следующая проблема: Подключаюсь к ФТП-серверу. Копирую с него файлы на компьютер. При...

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

Проблема с копированием в буфер обмена
Подскажите, пожалуйста, почему не копируется в буфер обмена private void Button1_Click(object...

проблема с копированием файлов на xubuntu
Здравствуйте на линуксе я новенький к сожалению вынужден на него перейти. Но вот неприятность...

11
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
24.05.2010, 20:15 2
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub Exemple()
Dim MyRange1 As Range, MyRange2 As Range, MyFlag As Range, lngRows1 As Long
 
Set MyRange1 = Workbook('Book1.xls').Worksheets(1).Cells(1, 1).CurrentRegion
Set MyRange2 = Workbook('Book2.xls').Worksheets(1).Cells(1, 1).CurrentRegion
 
lngRows1 = MyRange1.Rows.Count
 
For i = 1 To lngRows1
    Set MyFlag = MyRange2.Find(What:=MyRange1(i, 1), LookIn:=xlValues, LookAt:=xlWhole)
    If Not MyFlag Is Nothing Then
        If Not MyFlag.Offset(, columnOffset:=1) Is Nothing Then _
        MyRange1(i, 2) = MyFlag.Offset(, columnOffset:=1)
    End If
Next i
 
End Sub
0
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 7
25.05.2010, 12:04  [ТС] 3
спасибо, работает, но до первой пустой ячейки, как только в бук1 встречаеться пустая ячейка - работа завершаеться.
я сделал вот так:
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
Sub copy()
 
    Workbooks.Open ('....book1')    
    Workbooks('book1').Activate
    Range('D4').Activate
 
    i = ActiveCell.Value
    
    Workbooks('book2').Activate
    Cells.Find(What:=i, After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False).Activate
   
    ActiveCell.Offset(0, 7).Select
    
    
    Application.CutCopyMode = False
    Selection.Copy
    Application.ScreenUpdating = False
    
    Workbooks('book1').Activate
    Range('K4').Select
    ActiveSheet.Paste
    
    ActiveCell.Offset(1, -7).Select
 
   
End Sub
на смещение внимание не обращай, не суть, сейчас надо забацать всё
это в цикл, сделать проверку на пустые ячейки (если пусто, то сдвиг на 1 вниз....и. так далее до следующего значения, если это значение...ну скажем 'end' - то завершить)
0
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 7
25.05.2010, 12:07  [ТС] 4
vlth у тебя красивей , ещё раз спасибо, я VBA начал рюхать только вчера утром
0
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
25.05.2010, 13:33 5
<как только в бук1 встречаеться пустая ячейка - работа завершаеться>

Так и было предусмотрено (исходя из условий задачи):

Set MyRange1 = ThisWorkbook.Worksheets(1).Cells(1, 1).CurrentRegion
(определили диапазон со значениями, присвоили объектной переменной
ссылку на этот диапазон)

lngRows1 = MyRange1.Rows.Count
(подсчитали кол-во строк в диапазоне - т.е. от 'A1' вниз по столбцу до
первой пустой ячейки)
0
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 7
25.05.2010, 14:47  [ТС] 6
это я понял, а как сделать так, что если ячейка пуста то вниз на одну и так далее, пока не будет со значением?
ещё, если в ячейке бук1 будет значение, которого нет в бук2, то при поиске выдаст ошибку и остановиться, а как сделать так, что бы в бук1 эта ячейка пометилась например красным и дальше продолжилось.

сегодня ещё посидел, доработал немного свой, но что-то тоже не очень...вот что получилось (коряво, но пока только так):
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
Sub copy()
    
    Workbooks.Open ('бук2')
    
    Workbooks('бук1').Activate
    Range('D4').Activate
1:
3:  If (IsEmpty(ActiveCell.Value) = True) Then
        ActiveCell.Offset(1, 0).Select
        GoTo 3
    End If
    If (IsEmpty(ActiveCell.Value) = False) Then i = ActiveCell.Value
    
    
    If ActiveCell.Value = 'end' Then GoTo 2
    
    'i = ActiveCell.Value
    
    Workbooks('бук2').Activate
    Cells.Find(What:=i, After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False).Activate
        
   On Error GoTo 4
   
    ActiveCell.Offset(0, 7).Select
    j = ActiveCell.Value
    Application.CutCopyMode = False
    
    'Selection.Copy
    Application.ScreenUpdating = False
    
    Workbooks('бук1').Activate
    Cells.Find(What:=i, After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False).Activate
    ActiveCell.Offset(0, 7).Select
    ActiveCell.Value = j
    'Range('K4').Select
    'ActiveSheet.Paste
    
    ActiveCell.Offset(1, -7).Select
    
GoTo 1
4:
    Workbooks('бук1').Activate
    Cells.Find(What:=i, After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False).Activate
    ActiveCell.Offset(1, 0).Select
    GoTo 3
 
2:
End Sub
0
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
25.05.2010, 15:31 7
<как сделать так, что бы в бук1 эта ячейка пометилась например красным и дальше продолжилось>

Внося изменения в код, чтобы продемонстрировать ответ, увидел у себя
опечатку: конечно же MyRange2 - это ПЕРВЫЙ столбец диапазона CurrentRegion.
В остальном всё без изменений.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub Exemple()
Dim MyRange1 As Range, MyRange2 As Range, MyFlag As Range, lngRows1 As Long
 
Set MyRange1 = ThisWorkbook.Worksheets(1).Cells(1, 1).CurrentRegion
Set MyRange2 = ThisWorkbook.Worksheets(1).Cells(12, 1).CurrentRegion.Columns(1)
 
lngRows1 = MyRange1.Rows.Count
 
For i = 1 To lngRows1
    Set MyFlag = MyRange2.Find(What:=MyRange1(i, 1), LookIn:=xlValues, LookAt:=xlWhole)
    If Not MyFlag Is Nothing Then
        If Not MyFlag.Offset(, columnOffset:=1) Is Nothing Then _
            MyRange1(i, 2) = MyFlag.Offset(, columnOffset:=1)
    Else
        MyRange1(i, 1).Interior.ColorIndex = 3 'Заливка ячейки красным цветом
 
    End If
Next i
End Sub
Чем не устраивает?

Для пропуска пустых ячеек можно использовать цикл Do-While со счётчиком
строк. Например:
Visual Basic
1
2
3
Do
  i=i+1
Loop While IsEmpty(Cells(i,1))
0
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 7
25.05.2010, 17:24  [ТС] 8
написал вот это, не обрабатываеться ошибка..почему не пойму, помогите найти
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
58
59
60
Sub price_copy()
    Dim i As String
    Dim j As String
    
    Workbooks.Open ('2.xls')
    
    Workbooks('1.xls').Activate
    Range('D4').Activate
1:
3:  If (IsEmpty(ActiveCell.Value) = True) Then
        ActiveCell.Offset(1, 0).Select
        GoTo 3
    End If
    If (IsEmpty(ActiveCell.Value) = False) Then i = ActiveCell.Value
    
    
    If ActiveCell.Value = 'end' Then GoTo 2
    
    Workbooks('2.xls').Activate
    Columns('A:A').Select
    
    Selection.Find(What:=i, After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False).Activate
    On Error GoTo 4
   
    ActiveCell.Offset(0, 7).Select
    j = ActiveCell.Value
    Application.CutCopyMode = False
    
    Application.ScreenUpdating = False
    
    Workbooks('1.xls').Activate
    Columns('D:D').Select
    Selection.Find(What:=i, After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False).Activate
    ActiveCell.Offset(0, 7).Select
    ActiveCell.Value = j
    ActiveCell.Offset(1, -7).Select
    
GoTo 1
 
2:
 
Exit Sub
4:
    
    Workbooks('1.xls').Activate
    Columns('D:D').Select
    Selection.Find(What:=i, After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False).Activate
    ActiveCell.Interior.ColorIndex = 3
    ActiveCell.Offset(1, 0).Select
    Err.Clear
    'Resume Next
    GoTo 3
    
End Sub
0
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 7
25.05.2010, 17:26  [ТС] 9
выдаёт ошибку Object variable or With block variable not set (Error 91)
0
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
26.05.2010, 13:20 10
<Посмотрите, плиз, что не так, подскажите как правильно...>

Неправильно вместо управляющих структур For - Next, Do - Loop, For Each - Next,
т.е. операторов условного перехода, использовать GoTo - оператор безусловного перехода.
0
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 7
26.05.2010, 13:56  [ТС] 11
я бы сказал....некарсиво, но не неправильно. Согласен, что переделать бы неплохо .
выяснил причину возникновения ошибки, если первого значения из бук1 нет в бук2, то вываливает ошибку (например а1=12, а в бук2 нет ячейки с таким значением), если же первое в бук1 есть в бук2 то всё ок, дальше работает нормально. Почему так - не пойму.
0
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
26.05.2010, 14:32 12
Неоправданное применение GoTo - признак дурного тона в программировании.
Это общепринятое мнение: код с GoTo трудночитаем и воспринимаем.
Если хочешь, чтобы с твоим кодом работали другие люди, прислушайся
к совету - максимально сократи кол-во GoTo. Кстати, 'другим'
программистом можешь стать ты сам, попытавшись разобраться в своём
проекте через какое-то время.
0
26.05.2010, 14:32
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.05.2010, 14:32
Помогаю со студенческими работами здесь

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

Проблема с копированием изображения в буфер обмена
Все привет. Пытаюсь поместить часть изображения в буфер обмена, но при извлечении из него...

Проблема с копированием базы на другой сервер
Добрый день! Выдаётся ошибка (Invalid universal id) на строке: Set ParentDoc =...

делаю БД копированием из другой. Проблема с высвечиваемым названием.
Оно - старое. В свойствах базы данных (меню ФАЙЛ) все переправлено. Название самого файла - тоже....


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­­­­­­­­­­­­­х­р­о­н­­н­­­ы­­й счётчик с управляющим сигналом зад
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru