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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2012, 23:35   #1
manowar_gub
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 21
По умолчанию Открыть книгу Excel в Excel

Подскажите в чём ошибка макроса:

Set app = CreateObject("excel.application")
app.Visible = False
Set wkb = app.Workbooks.Open("C:\test.xls")
wkb.Sheets("Лист1").Range("A1:M700" ).Copy

ThisWorkbook.Sheets("Лист2").Range( "A1").Select
ActiveCell.Paste

цель: из test.xls из листа1 скопировать все данные в лист2 текущего файла...
manowar_gub вне форума Ответить с цитированием
Старый 14.06.2012, 01:12   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ошибка в том, что открываете другой экземпляр Экселя.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 14.06.2012, 07:26   #3
manowar_gub
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Ошибка в том, что открываете другой экземпляр Экселя.
а как сделать по-другому?
manowar_gub вне форума Ответить с цитированием
Старый 14.06.2012, 08:04   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если Вы хотите скопировать данные, чтобы не было видно процесса открытия и закрытия файла-источника, томожно просто запретить обновление экрана. Например, так:
Код:
Sub qq()
    Dim wkb As Workbook: Application.ScreenUpdating = False
    Set wkb = Workbooks.Open("C:\test.xls")
    wkb.Sheets("Лист1").[A1:M700].Copy ThisWorkbook.Sheets("Лист2").[A1]
    wkb.Close: Application.ScreenUpdating = True
End Sub
Если же путь, имя книги, имя листа и диапазон ячеек заведомо известны (как в данном случае), и если достаточно не полное копирование (с форматами, цветами, границами и т. п.), а только значения, то данную задачу можно решить вообще не открывая файл-источник.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 14.06.2012, 09:23   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Или можно так:
Код:
Sub tt()
    With Application
        .ScreenUpdating = False
        With GetObject("C:\test.xls")
            .Sheets("Лист1").[A1:M700].Copy ThisWorkbook.Sheets("Лист2").[A1]
            .Close 0
        End With
        .ScreenUpdating = True
    End With
End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 15.06.2012, 22:36   #6
manowar_gub
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 21
По умолчанию

спасиб!

не понял одно - как сравнить список из 12 тыс значений с 3 стами, причём 12 тыс перебирать по-одному? в стиле RC можно сделать как
PHP код:
=сумм(если(A4="B2:B300");1;0)) 
и протянуть на все 12 тыс но интересует аналогия на VBA... причём с сохранением всех не найденных значений в новый столбец. пробовал через
PHP код:
if sheets("Лист1").cells(x,1).value <> sheets("Лист1").cells.range("B2:B300"then sheets("Лист1").cells(y,3).value sheets("Лист1").cells(x,1).value 
но выдаёт ошибку
manowar_gub вне форума Ответить с цитированием
Старый 15.06.2012, 22:45   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ох...
Бросьте это дело - изучайте сразу код на массивах и словаре.
Тут рядом совсем:
http://www.programmersforum.ru/showthread.php?t=205139
Кстати, сейчас потестю, сколько секунд будет 80000 сравнивать с 50000...
Проверил - 52136<->87531 строк сравнивает 1.5 секунды. Правда в примере всего одно совпадение, так что копировать ничего не приходится
Ну копирование может ещё секунду заняло бы...
Да, так и есть - имитация копирования всего диапазона (т.е.100% совпадение при сверке) добавило чуть меньше секунды.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 15.06.2012 в 22:58. Причина: Поменял Уф на Ох - чтоб с толку не сбивать :)
Hugo121 вне форума Ответить с цитированием
Старый 15.06.2012, 22:51   #8
manowar_gub
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 21
По умолчанию

гыгы, ок, разберусь)

на самом деле это лучче т.к. реально под 10 мин excel шарахал подобные мои коды)
manowar_gub вне форума Ответить с цитированием
Старый 15.06.2012, 23:09   #9
manowar_gub
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 21
По умолчанию

у меня 2 диапазона, т.е. 2 столбца. один я указываю вместо М, второй - вместо b, а что делать с c и bb ?
manowar_gub вне форума Ответить с цитированием
Старый 15.06.2012, 23:15   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Сравниваются диапазоны a и b. В c копируются данные из bb - в данном случае это параллельные массивы, но тут возможны варианты, смотря по задаче.
Главное сам принцип - через массив запоминаем один диапазон в словаре, затем так же через массив проверяем второй диапазон по словарю.
Массивы - не принципиально, можно и напрямую с листом работать, но это в 40 раз медленнее.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 15.06.2012 в 23:21.
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно перевести книгу с макросом из 2007 в 2003 Excel? Алекс7 Microsoft Office Excel 5 15.10.2011 09:21
открыть скриптом файл Excel alvazor Microsoft Office Excel 9 04.06.2010 16:56
Открыть из Delphi файл Excel masterdela Общие вопросы Delphi 5 30.03.2010 10:47
Макрос открывающий книгу Excel. agregator Microsoft Office Word 4 10.07.2009 21:41
Как открыть лист в excel Alexi Общие вопросы Delphi 4 05.07.2009 22:42