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

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

24.05.2010, 17:32. Показов 1966. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2010, 14:32
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru