Страницы: 1
RSS
Обращение к Workbooks.worksheets.range из другой книги
 
Ребят, владею VBA на уровне макрорекордера, поэтому даже элементарных вещей не могу сам осилить.
Поискал через поисковик похожие запросы, но понятного мне ответа не нашел.
Вопрос такой: почему VBA ругается, когда я хочу совершить действие с диапазоном, находящимся в другой книге (в данном случае очистить диапазон), через такое обращение (указание книги, листа и диапазона):
Код
Workbooks("Книга1").worksheets("Лист1").range("A1:B2", Cells.End(xlDown)).ClearContents


Если вначале активировать Книгу1, то ругаться не будет:
Код
workbooks("Книга1").activate
worksheets("Лист1").range("A1:B2", Cells.End(xlDown)).ClearContents


Но ведь как то же можно эту простую команду записать одной строкой, не активируя предварительно книгу, а сразу к ней обращаясь для дальнейших действий?
Как это сделать?


Во вложении пример.
Откройте пример, создайте новую книгу и скопируйте туда кнопки 1 и 2.
При запуске из новой книги Кнопка1 НЕ будет работать (при запуске из родной книги работает).
Кнопка2 работает из любой книги, т.к. в ней стоит предварительная активация нужной книги.
Кнопка3 создана для удобства, чтоб можно было очищенный диапазон восстановить для новых тестов.

Хочу понять, как обратиться к книге "Пример" из другой книги одной строкой, предварительно не используя "Пример".Activate
 
Код
Sub Макрон_1_1()
With Workbooks("Пример.xlsm").Worksheets("Лист1")
.Range("A2:I2", .Cells.End(xlDown)).Clear
End With
End Sub

или одной строкой:
Код
Sub Макрон_1_3()
Workbooks("Пример.xlsm").Worksheets("Лист1").Range("A2:I2", Workbooks("Пример.xlsm").Worksheets("Лист1").Cells.End(xlDown)).Clear
End Sub
Изменено: k61 - 06.07.2020 19:01:46
 
K61, спасибо за ответ, но через with мне понятно как делать.
А можно ли это сделать одной строчкой?

Просто в оригинале код у меня выглядит примерно так (фрагмент):
Цитата
Workbooks("Книга1").Worksheets("1").Range("A5:C5", Cells.End(xlDown)).Copy
   Workbooks("Книга2").Worksheets("блаблабла").Range("A4").PasteSpecial _
   Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

   Workbooks("Книга1").Worksheets("1").Range("E5:K5", Cells.End(xlDown)).Copy
   Workbooks("Книга2").Worksheets("блаблабла").Range("D4").PasteSpecial _
   Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

   Workbooks("Книга1").Worksheets("1").Range("D5", Cells.End(xlDown)).Copy
   Workbooks("Книга2").Worksheets("блаблаблаI").Range("K4").PasteSpecial _
   Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Т.е. многократный перенос данных из Книги1 в Книгу2 значениями.
И каждый раз перед каждой командой активировать книги или делать With не хочется.

Хочется понять, как обращение к соответствующему диапазону на каком-либо листе другой книги можно записать в одну строку, чтоб было как в коде выше (он как раз не работает из за такого обращения к книгам).
Изменено: VasiliY_Seryugin - 06.07.2020 19:08:37
 
Цитата
k61 написал:
или одной строкой:

Ага, это то что нужно!
Я понял чего не так делаю. Спасибо!
 
А еще подскажете, если мне, например, просто нужно выделить этот диапазон, т.е. команда select на конце, вместе Clear, то оно уже почему-то не работает.
Код
Sub Макрон_1_3()
Workbooks("Пример.xlsm").Worksheets("Лист1").Range("A2:I2", Workbooks("Пример.xlsm").Worksheets("Лист1").Cells.End(xlDown)).Select
End Sub


Селектом как к диапазону чужой книги обратиться?

Чтобы, допустим, потом через With selection шрифт поменять, формат ячеек, выравнивание ячеек и т.п.
Изменено: VasiliY_Seryugin - 06.07.2020 19:24:26
 
Для того чтобы в неактивной книге поменять шрифт, селект не нужен.
 
А чтоб сделать селект - нужно этот лист активировать! Но для работы с With никакяа активация и селекты не нужны, с чего Вы это взяли?
 
Спасибо. Т.е. обращение селектом к диапазону, находящемуся в другой книге, без Activate не написать получается?
Изменено: VasiliY_Seryugin - 06.07.2020 20:17:34
 
Пишите без селекта, на кой он нужен?
 
Я понял, что я не правильно обращаюсь к диапазону, чтоб его очистить.
Можно ли одной строкой написать код, который будет выделять начальный диапазон "A3:I3", потом выделять все до конца вниз (End(exlDown)), и это дело удалять.

Вот эта красная конструкция у меня не правильная, выявлено опытным путем:
Workbooks("Пример.xlsm").Worksheets("Лист1").Range("A3:I3", Cells.End(xlDown)).Copy

Если в примере, который я скидывал выше, добавить вверх одну пустую строку (т.е. таблица будет начинаться не с A1, а с A2), то такое выделение диапазона вниз от заданного горизонтального диапазона оказывается не работает.

Вкладываю пример. Если не сложно, помогите сделать чтоб выделялся диапазон с A3:I3 и до конца вниз.

Опять же - одной строкой кода. Макрорекордером можно сделать так:
Код
Range("A3:I3).select
Range(selection, Selection.End(xlDown)).clear

А вот эти все selectы и selection на одну строчку обращения можно заменить?
 
VasiliY_Seryugin, лист можно активировать, диапазон можно выделить, но не нужно - это очень замедляет выполнение макроса.
 
Так вот я как раз и не хочу активировать лист и выделать несколько раз диапазон селектом.
У меня есть Книга1, в которой есть макрос.
Нужно чтоб при запуске этого макроса он обращался к Книге2, листу1, выделял на этом листе диапазон "A3:I3", затем через Ctrl+Shift+вниз выделял весь диапазон до конца вниз, и затем очищал выделенное (или копировал, допустим). Вот как это можно максимально коротко записать в коде?
 
Вам пишут, что выделять (ВЫДЕЛЯТЬ!) необязательно, а Вы опять за своё:
Цитата
VasiliY_Seryugin написал:
...выделял на этом листе диапазон
 
Все ребят, я видимо не так объясняю.
В любом случае спасибо за помощь, с ней я разобрался чего не так делаю.

Вот это не работает:
Код
Workbooks("Пример.xlsm").Worksheets("Лист1").Range("A3:I3", Cells.End(xlDown)).Copy

Но вот так работает:
Код
Workbooks("Пример.xlsm").Worksheets("Лист1").Range(Cells(3, 1), Cells(3, 9).End(xlDown)).Copy

Просто синтаксиса не знаю, отсюда и все проблемы.
 
Почитайте эту статью.
 
Цитата
VasiliY_Seryugin написал: ...я видимо не так объясняю
Нет, все таки при запуске из другой книги не работает все равно без предварительного Activate книги "Пример"  :sceptic:

P.S.
Юрий, вы правы. Иногда стоит еще раз очень внимательно все перечитать снова и снова, и тогда, вероятно, с какого-то раза станет все-таки понятно :)

Вот как мой код должен выглядеть:
Код
Workbooks("Пример.xlsm").Worksheets("Лист1").Range(Workbooks("Пример.xlsm").Worksheets("Лист1").Cells(3, 1), Workbooks("Пример.xlsm").Worksheets("Лист1").Cells(3, 9).End(xlDown)).ClearContents

Всем спасибо!
 
Цитата
VasiliY_Seryugin написал: Вот как... код должен выглядеть
Код
With Workbooks("Пример.xlsm").Worksheets("Лист1")
        .Range(.Cells(3, 1), .Cells(3, 9).End(xlDown)).ClearContents
End With
 
VasiliY_Seryugin, а именно в одну строку - это самоцель? Ведь длиннее запись получится и не очень читаема. А если с одним диапазоном нужно произвести несколько действий? Конструкция With - Ebd with очень удобная вещь.
 
В первом же ответе и был ответ, и ведь сказали что понятно. Оказываете лукавите? :)
Страницы: 1
Наверх