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

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

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

Студворк — интернет-сервис помощи студентам
задача следующая.
есть файл (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 sender, EventArgs e) { ...

11
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
24.05.2010, 20:15
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  [ТС]
спасибо, работает, но до первой пустой ячейки, как только в бук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  [ТС]
vlth у тебя красивей , ещё раз спасибо, я VBA начал рюхать только вчера утром
0
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
25.05.2010, 13:33
<как только в бук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  [ТС]
это я понял, а как сделать так, что если ячейка пуста то вниз на одну и так далее, пока не будет со значением?
ещё, если в ячейке бук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
<как сделать так, что бы в бук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  [ТС]
написал вот это, не обрабатываеться ошибка..почему не пойму, помогите найти
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  [ТС]
выдаёт ошибку Object variable or With block variable not set (Error 91)
0
14 / 14 / 2
Регистрация: 23.03.2010
Сообщений: 635
26.05.2010, 13:20
<Посмотрите, плиз, что не так, подскажите как правильно...>

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru