Добрый день. Пишу макрос - немогу разобраться как заставить буфер обмена очишаться перед включением макроса. Я искал на форуме и кроме http://www.programmersforum.ru/showpost.php?p=154621&postcount=4 - не нашел - но это почемуто не помогает... Вот код помогите вставить его правильно, а еще я не понял что такое "user32"
Sub KPI_9() ' KPI_9 Макрос ' Расходы_департамента безопастности Application.ScreenUpdating = False ' Путь Workbooks.Open Filename:= _ "http://srv-portal/sites/fin/budg/PL/Безопасность%20и%20Фрод/Расходы_ДБ.xlsx", _ UpdateLinks:=0 ' Киров (КИР) Windows("Расходы_ДБ.xlsx").Activate Sheets("КИР").Select Range("A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14").Select Selection.Copy Windows("Base of PL.xlsm").Activate Sheets("9").Select Range("A103").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveWindow.SelectedSheets.Visible = False ' Скрыть лист Windows("Расходы_ДБ.xlsx").Activate ActiveWindow.Close False ' Закрыт без сохранения (если закрыть с сохранением то ActiveWorkbook.Saved = True) Windows("Base of PL.xlsm").Activate Sheets("Главная").Select Application.ScreenUpdating = True End Sub
Чтобы не чистить буфер обмена - может, попробовать его просто не использовать?
Sub KPI_9() ' Расходы_департамента безопастности Application.ScreenUpdating = False Dim Base_of_PL As Workbook: Set Base_of_PL = ActiveWorkbook ' текущая книга
Ссылка = "http://srv-portal/sites/fin/budg/PL/Безопасность%20и%20Фрод/Расходы_ДБ.xlsx" Dim Расходы_ДБ As Workbook: Set Расходы_ДБ = Workbooks.Open(Ссылка, 0)
Диапазон = "A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14" ' копируем (не через буфер обмена) Расходы_ДБ.Worksheets("КИР").Range(Диапазон).Copy Base_of_PL.Worksheets("9").Range("A103")
Расходы_ДБ.Close False ' закрываем без сохранения Base_of_PL.Sheets("Главная").Activate End Sub
EducatedFool - спасибо за ваш ответ, попровал - действует, но он переносит не только значения но и форматы. (т.к. у меня более 150тыс. значений будет копироваться с разных листов - я бы хотел по максимуму оптимизировать "вес" и поэтому даже лишняя запятая или подкрашенная ячейка - это доп. "вес")
Попробовал вариант Казанского - работает, думаю это лучший вариант в моем случае! Большое вам спасибо уважаемые эксперты.
Быстро и без лишней информации (и без буфера) можно копировать через массив. Только здесь вероятно или через много массивов, или через один много раз. Что-то вроде
{quote}{login=Hugo}{date=16.11.2010 09:53}{thema=}{post}Быстро и без лишней информации (и без буфера) можно копировать через массив. Только здесь вероятно или через много массивов, или через один много раз. Что-то вроде
Sub tt() Dim a a = [a1:b10] [e1:f10] = a End Sub{/post}{/quote}
Как этоприменить к моему макросу, если поможите сократить - буду оч. признателен Вот полный код: Sub KPI_9() ' KPI_9 Макрос ' Расходы_департамента безопастности Application.ScreenUpdating = False Application.StatusBar = "Подождите, выполняется обновление данных..." ' Путь Workbooks.Open Filename:= _ "http://srv-portal/sites/fin/budg/PL/Безопасность%20и%20Фрод/Расходы_ДБ.xlsx", _ UpdateLinks:=0
Этот макрос - сылается на книгу которая лежит на портале, в этой книге есть вкладки УРАЛ, ЕКБ, и т.д. 11 регионов - макрос сначала открывает книгу, далее выбирает диапазон и копирует только значения через спец. вставку. далее открывает след лист с регионом и повторяет операцию...
Как этот длинный код заменить на более короткий или оптимизировать, но с сохранением тех же функций.? или это норм вариант? - как есть...
Примерно так думаю: Sub tt() Sheets("УРАЛ").Select Range("A3:N3,A7:N7,A10:N14,P3:AA3,P7:AA7,P10:AA14,AC3:AN3,AC7:AN7,AC10:AN14").Select Selection.Copy Windows("Base of PL.xlsm").Activate Sheets("9").Visible = True 'Отобразить лист Sheets("9").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub
Sub ttt() Dim a a = Sheets("УРАЛ").[a3:n3] Sheets("9").[a3:n3] = a End Sub
tt меняем на ttt, но конечно это схематично - надо части диапазона копировать отдельно, ещё нужно указать файл, где Sheets("9") находится. И нужно точно просчитать, куда выгружаем массивы, хотя бы первую ячейку каждого, далее можно через Resize Ubound, типа: sh1.[a3].Resize(UBound(Arr2, 1), UBound(Arr2, 2)).Value = Arr2 'выгружаем результат
Прист - оч странно, при копировании он следует по порядку... Копирует урал и т.д. доходит до конца и потом снова возврашается на урал и вставляет туда значения "Кир"