Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2009, 22:15   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Работа с двумя книгами

Еще вопрос к знатокам:
У меня есть ряд тематических книг с исходными данными. В рабочую книги из них выдергиваем ту или иную информацию.

Есть книга с шаблонами оформления таблиц, в рабочую книгу нужно скопировать несколько строй. Алгоритм приблезительно такой (по памяти):
1. Переключаемся на книгу("шаблоны").лист("шаблон1")
2. .range(cells(1,1), cells(3,33)).copy книга("рабочия"). лист("рабочий1").cells(1,1)
3. Переключаемся на книгу("рабочия").лист("рабочий1") для дальнейше работы.

Не удобно то что приходиться переключать на книгу с шаблонами.
Конструкция вида при текущем книгу("рабочия").лист("рабочий1") не работает:
книга("шаблоны").лист("шаблон1").ra nge(cells(1,1), cells(3,33)).copy книга("рабочия"). лист("рабочий1").cells(1,1)

Есть ли способ уменьшить колличество переключений между книгами?
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 04.02.2009, 23:01   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Есть ли способ уменьшить колличество переключений между книгами?
Переключения абсолютно не нужны.

Попробуйте так:

Код:
Sub test()
    Dim Шаблон As Worksheet: Set Шаблон = Workbooks("шаблоны").Worksheets("шаблон1")
    Dim РабочийЛист As Worksheet: Set РабочийЛист = Workbooks("рабочия").Worksheets("рабочий1")

    Шаблон.[a1:an3].Copy РабочийЛист.[a1] ' копируем с одного листа на другой' 
    РабочийЛист.[a1:a45].Copy Шаблон.[e31] ' без всяких переключений'
End Sub
Цитата:
Конструкция вида при текущем книгу("рабочия").лист("рабочий1") не работает:
книга("шаблоны").лист("шаблон1").ra nge(cells(1,1), cells(3,33)).copy книга("рабочия"). лист("рабочий1").cells(1,1)
Причина неработоспособности кода кроется в следующем:
В строке
книга("шаблоны").лист("шаблон1").ra nge(cells(1,1), cells(3,33)).copy
Вы пытаетесь скопировать диапазон из книги шаблоны, в то же время обращаясь к ячейкам активной книги, которой является книга рабочия - cells(1,1), cells(3,33).

То есть, если вместо cells(1,1) Вы бы поставили книга("шаблоны").лист("шаблон1").ce lls(1,1), - то всё бы получилось.
Хотя строка получилась бы достаточно длинной:
книга("шаблоны").лист("шаблон1").Ra nge(книга("шаблоны").лист("шаблон1").Cells(1, 1), книга("шаблоны").лист("шаблон1").Cells(3, 33)).Copy книга("рабочия").лист("рабочий1").C ells(1, 1)


Но гораздо удобнее использовать предложенный мной вариант типа
Шаблон.[a1:an3].Copy РабочийЛист.[a1]
РабочийЛист.Range("a1:a45").Copy Шаблон.Cells(2, 5)

Последний раз редактировалось EducatedFool; 04.02.2009 в 23:06.
EducatedFool вне форума Ответить с цитированием
Старый 04.02.2009, 23:05   #3
КаМММ
Почти "Чайник"
Форумчанин
 
Аватар для КаМММ
 
Регистрация: 09.06.2008
Сообщений: 134
По умолчанию

Если известны адрес файла и расположение в нём данных, то сам файл даже не обязательно открывать.
Достаточно прописать ссылку на его содержимое.
например как это рекомендовано в этом коде:
Код:
Range("A1").Formula = "='" & iPath & "[" & iFile & "]" & iList & "'!" & "A1" 
Range("A1") = Range("A1") 
Bonus : извлечение данных из 100 ячеек  
Range("A1:A100").Formula = "='" & iPath & "[" & iFile & "]" & iList & "'!" & "A1" 
Range("A1:A100") = Range("A1:A100").Value
iFile - это название файла - донора
Скачано отсюда:http://www.msoffice.nm.ru/faq/macros.htm
КаМММ вне форума Ответить с цитированием
Старый 05.02.2009, 12:06   #4
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Причина неработоспособности кода кроется в следующем:
Спасибо, за разъяснения.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Но гораздо удобнее использовать предложенный мной вариант типа
Шаблон.[a1:an3].Copy РабочийЛист.[a1]
РабочийЛист.Range("a1:a45").Copy Шаблон.Cells(2, 5)
Буду пользоваться этим способом.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 05.02.2009, 12:10   #5
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от КаМММ Посмотреть сообщение
Если известны адрес файла и расположение в нём данных, то сам файл даже не обязательно открывать.
Достаточно прописать ссылку на его содержимое.
например как это рекомендовано в этом коде:
Код:
Range("A1").Formula = "='" & iPath & "[" & iFile & "]" & iList & "'!" & "A1" 
Range("A1") = Range("A1") 
Bonus : извлечение данных из 100 ячеек  
Range("A1:A100").Formula = "='" & iPath & "[" & iFile & "]" & iList & "'!" & "A1" 
Range("A1:A100") = Range("A1:A100").Value
iFile - это название файла - донора
Но при этом используется ячейка, что ИМХО не очень хорошо.

Цитата:
Сообщение от КаМММ Посмотреть сообщение
Скачано отсюда:http://www.msoffice.nm.ru/faq/macros.htm
ОЧЕНЬ хороший сайт... А есть это в текстовом виде? А то в офисе пока нет доступа к инету, да и искать информацию стало бы легче.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 05.02.2009, 22:35   #6
КаМММ
Почти "Чайник"
Форумчанин
 
Аватар для КаМММ
 
Регистрация: 09.06.2008
Сообщений: 134
По умолчанию

Цитата:
Но при этом используется ячейка, что ИМХО не очень хорошо
Не понял, что в этом не есть хорошо.
Если данные сразу-же в нужные ячейки получать?
КаМММ вне форума Ответить с цитированием
Старый 06.02.2009, 09:21   #7
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от КаМММ Посмотреть сообщение
Не понял, что в этом не есть хорошо.
Если данные сразу-же в нужные ячейки получать?
Сегодня подробно расмотрю на работе. До конца механизм пока не понял.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 06.02.2009, 18:34   #8
КаМММ
Почти "Чайник"
Форумчанин
 
Аватар для КаМММ
 
Регистрация: 09.06.2008
Сообщений: 134
По умолчанию

Суть метода такая:
Если в ячейке А1 сделать ссылку на ячейку другой книги, а потом эту книгу закрыть, то останется формула ссылающяяся на закрытый файл.
Если данные в том файле изменить (не важно каким способом) то после нажатия в нашей книге Правка-связи-обновить получим новое значение в ячейке А1
При этом файл содержащий информацию остаётся закрытым.

Остаётся только макросом записать в ячейки (куда нужно вставлять информацию) формулы содержащие связь с нужным файлом.
Range("A1").Formula = "='" & iPath & "[" & iFile & "]" & iList & "'!" & "A1"

И приравнять например Range("A1") = Range("A1")
При этом в ячейку запишется число вычисленное по формуле находящейся в ячейке. (тоесть вместо ссылки будет цифра или текст)
Ну а значения пути (iPath), названия файла( iFile), и названия листа (iList)
Нужно присвоить заранее. (переменные можно обозвать и по другому)
Соответственно и место вставки тоже может тбыть произвольным а не именно Range("A1") главное что .Formula = ....
Короче всё очень просто.
При проверке лучше Range("A1") = Range("A1") пропустить, чтобы если что, то ошибку было видно
Вот запись из действующего файла:
СтрОтгр = [Заказчики!Z1].Value - 99
If СтрОтгр < 2 Then СтрОтгр = 2
Range("Заказчики!Z2:Z101").Formula = "='\\Klimat-server\менеджеры\расчет воздуховодов\1\[Отгрузка.xls]Лист1'!$A" & СтрОтгр
Данный код получает текущюю информацию (100 ячеек) из файла находящегося в сети (на другой машине) не открывая сам файл

Последний раз редактировалось КаМММ; 06.02.2009 в 18:44.
КаМММ вне форума Ответить с цитированием
Старый 09.02.2009, 22:25   #9
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

<...>
Спасибо!
Цитата:
Сообщение от КаМММ Посмотреть сообщение
Вот запись из действующего файла:
СтрОтгр = [Заказчики!Z1].Value - 99
If СтрОтгр < 2 Then СтрОтгр = 2
Range("Заказчики!Z2:Z101").Formula = "='\\Klimat-server\менеджеры\расчет воздуховодов\1\[Отгрузка.xls]Лист1'!$A" & СтрОтгр
Данный код получает текущюю информацию (100 ячеек) из файла находящегося в сети (на другой машине) не открывая сам файл
Испробовал этот метод. Результат понрачился по скорости и удобству, но есть проблемы. Не много поясню: в шаблоных содержиться оформление довольно сложных таблиц, и ширина колонки равна 2 - для удобства создания сложного форматирования. То есть в шалонах постоянно встречаются объединеные ячейки, и широко использую оформление ячеек (границы двойные/одинарные, шрифт жирный/ и т.п., выравнивание текста). При указаном выше методе это все пропадает. Можно ли копировать этим методом оформление и объединения ячеек?
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 09.02.2009, 22:32   #10
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Но гораздо удобнее использовать предложенный мной вариант типа
Шаблон.[a1:an3].Copy РабочийЛист.[a1]
РабочийЛист.Range("a1:a45").Copy Шаблон.Cells(2, 5)
Этот код, не работат (( Где я опять что-то не так сделал?
Sub test()

Dim Шаблон As Worksheet: Set Шаблон = Workbooks("шаблон.xls").Worksheets( "таб.3")
Dim РабочийЛист As Worksheet: Set РабочийЛист = Workbooks("тест-28.xls").Worksheets("temp")

Шаблон.Range(Cells(1, 1), Cells(16, 33)).Copy РабочийЛист.Cells(1, 1)
End Sub
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
dll с двумя exe'шниками С# TaTT DoGG Общие вопросы .NET 24 25.11.2008 21:19
Работа с TDBCtrlGrid и двумя таблицами из БД kiber0net0 БД в Delphi 4 02.10.2008 00:10
Уравнение с двумя неизвестными sds Помощь студентам 4 23.04.2008 23:13
Соединение можеду двумя ПК Killer_djon Общие вопросы Delphi 3 02.05.2007 12:14
работа с двумя книгами Реланиум Microsoft Office Excel 2 23.11.2006 16:37