Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
ValentynaK
3 / 3 / 1
Регистрация: 21.11.2012
Сообщений: 31
1

Программный переход между книгами Exel

21.11.2012, 18:29. Просмотров 3160. Ответов 7
Метки нет (Все метки)

Подскажите, пожалуйста, в решении одного вопроса. Есть 2 открытые книги Exel. Нужно скопировать диапазон ячеек одной книги и вставить в нужный лист другой книги (программно). В Книге1 создала командную кнопку, т.е. процедура пишется в Книге1, вставку нужно сделать в книге2. Заранее благодарна.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2012, 18:29
Ответы с готовыми решениями:

Переключение между книгами
Открыты 2 книги. Одна - источник данных (название всегда разное). Другая -...

Копирование данных листов между разными книгами
Еще раз здравствуйте. Заканчивается моя работа с VBA. Остался последний...

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

Run-time error 438 при копировании между книгами
Вот прям в двух словах: Set bdbook = Workbooks("BD_" & _ name & ".xlsb")...

Работа с Word и Exel через макрос, который запускается в Exel
Есть задача: проводятся расчеты в Эксель и из него открывается документ...

7
mc-black
2760 / 695 / 102
Регистрация: 04.02.2011
Сообщений: 1,421
21.11.2012, 18:39 2
В модуль листа с кнопкой свтавить код:
Visual Basic
1
2
3
Private Sub CommandButton1_Click()
    Me.[B2:E5].Copy Workbooks("Книга2.xls").Worksheets("Лист1").[B2].Paste
End Sub
1
Скрипт
5446 / 1127 / 49
Регистрация: 15.09.2012
Сообщений: 3,420
21.11.2012, 19:08 3
Пример использования объектных переменных. Может будет удобнее.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub Procedure_1()
 
    Dim bkBook_1 As Excel.Workbook
    Dim bkBook_2 As Excel.Workbook
    
    'Даём имена книгам. Через эти имена можно обращаться к книгам.
    Set bkBook_1 = ActiveWorkbook
    Set bkBook_2 = Workbooks(2)
 
    bkBook_1.Worksheets(1).Range("A1").Copy Destination:=bkBook_2.Worksheets(1).Range("A1")
 
End Sub
1
Romas654
116 / 30 / 2
Регистрация: 16.11.2012
Сообщений: 65
22.11.2012, 08:27 4
Лучший ответ Сообщение было отмечено как решение

Решение

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

Visual Basic
1
2
3
4
5
6
7
8
9
'Это в начало модуля
Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
 
'Это после вашего кода
OpenClipboard Application.hWnd
EmptyClipboard
CloseClipboard
можно перенести данные без использования буфера обмена, просто перебором:

Visual Basic
1
2
3
4
5
6
7
8
9
Workbooks.Open (ThisWorkbook.Path & "\2.xls") ' открываем вторую книгу
 
For x = 1 To 20 ' перебираем ячейки в первой книге и заполняем их значения во вторую
    For y = 1 To 20
    Workbooks("2.xls").Sheets(1).Cells(x, y) = ThisWorkbook.Sheets(1).Cells(x, y)
    Next
Next
 
Workbooks("2.xls").Close True ' закрываем вторую книгу с сохранением
3
Казанский
14355 / 5961 / 1583
Регистрация: 24.09.2011
Сообщений: 9,394
22.11.2012, 10:45 5
Цикл тут не нужен
Visual Basic
1
2
Workbooks("2.xls").Sheets(1).Cells(1,1).resize(20,20).value = _
    ThisWorkbook.Sheets(1).range("A1:T20").value
В примере использованы разные способы определения диапазона.
2
ValentynaK
3 / 3 / 1
Регистрация: 21.11.2012
Сообщений: 31
22.11.2012, 13:14  [ТС] 6
Спасибо форумчанам за варианты решения. Воспользовалась советом Скрипта. Есть еще одна тонкость, о которой сразу не догадалась, а именно: содержание копируемого диапазона ячеек представляет собой формулы, но вставить нужно значения. В ручном режиме это действие делается: Специальная вставка - Вставить значения. А у меня вставляются формулы. Привожу неполный текст процедуры.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub CommandButton1_Click()
   ...
    Dim isk As Variant
    'isk-Выбранная в календаре дата
    isk = Left(Range("F1"), 5)
    Dim bkBook_1 As Excel.Workbook
    Dim bkBook_2 As Excel.Workbook
    Set bkBook_1 = ThisWorkbook
    Set bkBook_2 = Workbooks("Анализ работы мобильных терминалов за " & n_mm & ".xls")
    bkBook_2.Worksheets(2).Activate
    ActiveWorkbook.Sheets.Item(2).Select
    For i = 0 To 32
    ' Перебираю ячейки с датами
        s = ActiveWorkbook.Sheets.Item(2).Range("F3").Offset(0, i).Value
        If s = isk Then ' если совпадает, делаю вставку данных в нужный столбец
          bkBook_1.Worksheets(1).Range("D1:D122").Copy Destination:=bkBook_2.Worksheets(2).Range("F4").Offset(0, i)
          Exit For
        End If
    Next i
    bkBook_1.Worksheets(5).Range("A1:H100").ClearContents
   
End Sub
0
Скрипт
5446 / 1127 / 49
Регистрация: 15.09.2012
Сообщений: 3,420
22.11.2012, 13:42 7
Использование копирования для переноса данных:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub Procedure_1()
 
    Worksheets(1).Range("A1").Copy
    
    Worksheets(2).Range("A1").PasteSpecial xlPasteValues
    
    'Отключение режима копирования
    '(в режиме копирования пунктирные границы вокруг копироуемых ячеек).
    Application.CutCopyMode = False
    
End Sub
Примечание: чтобы узнать больше о команде PasteSpecial, в VBA в коде поставьте курсор на PasteSpecial и нажмите клавишу F1. Появится справка по данной команде.


Перенос данных без использования копирования:

Если нужно просто перенести данные, например, без форматирования (без учёта размера шрифта, цвета шрифта и т.д.), то надо вот так данные переносить:
Visual Basic
1
2
3
4
5
Sub Procedure_1()
 
    Worksheets(2).Range("A1").Value = Worksheets(1).Range("A1").Value
 
End Sub
1
ValentynaK
3 / 3 / 1
Регистрация: 21.11.2012
Сообщений: 31
22.11.2012, 14:01  [ТС] 8
Спасибо за помощь! Попробовала вариант Казанского и Скрипта, работает и тот и другой вариант.
0
22.11.2012, 14:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2012, 14:01

Как сделать переход между textbox?
У меня есть 5 textbox и есть массив из 5 элементов. Нужно занести программно в...

Как сделать автоматический переход между ТекстБоксами
Как мне сделать автоматический переход между 4х TextBox(ов)? В каждом...

Переход на следующую страницу(между ними скрытая )
Подскажите, пожалуйста, у меня есть ComboBox, в котором содержится 8 элементов....


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru