Если в макросе не указано слева ничего, то обращение идет к подобъекту активного объекта. Например,
Код |
---|
Cells(Rows.Count, 2).End(xlUp).Row |
В этом случае обращение идет к ячейкам. Они — подобъект листа. Значит, обращение пойдет к ячейкам активного листа. Чтобы обратиться к ячейкам листа, который не является активным, то нужно указать его явно:
Код |
---|
Sheets("имя Вашего листа").Cells(Rows.Count, 2).End(xlUp).Row |
Чтобы укоротить запись можно вставить блок With. У Вас он использован. Внутри этого блока ко всему, что начинается с точки, применяется тот объект, который в строке с With.
Переменным можно присваивать объекты. В приведенном Вами макросе это тоже использовано, тогда можно обращаться к ячейкам неактивного листа еще и так:
Можно работать и с неактивной в данный момент книгой:
Код |
---|
Workbooks("Имя Вашей книги").Sheets("имя Вашего листа").Cells(15, 2) |
Обращение с явным указанием возможно и для активного объекта…
Привет, Народ!
У меня совсем нет опыта в написании макросов, поэтому прошу помощи.
Ситуация следующая: у меня есть книга Excel с несколькими листами. На одном из листов есть табличка с исходными данными, к ней написан (путем записи макроса) макрос, который автообновляет данные в табличке (получает их из интернета) и форматирует их так, как мне нужно.
При создании командной кнопки (к который я этот амкрос привязываю) на другом листе книги, макрос работать отказывается и в ошибке указывает вторую строчку, в которой указан диапазон моей таблички.
Вопрос: как оптимизировать код макроса, чтобы по нажатию кнопки, созданной на любом листе этой книги он запускался именно на нужном, с исходной табличкой?
И еще вопрос: как сделать, чтобы вышеуказанный макрос работал в фоновом режиме по моему нажатию на кнопку (т.е. без видимого перехода на лист с исходной табличкой, если я напрмер работаю в другом листе) и выдавал всплывающее сообщение, что работа макроса закончена?
Путей к вершине — множество. Этот один из многих!
Цитата: GWolf от 25.03.2009, 11:09
А эту книжку вы не могли бы выложить
Вот пример книги, в приложенном файле. В ней (книге) две страницы: «Титульный лист» и «Исходные данные».
Записан макрос (Котировки_получение_и_обработка), который работает по нажатию на кнопку «Обновить» на странице «Исходные данные», и не работает по нажатию кнопки «Кнопка1» на странице «Титульный лист».
Хотелось бы, чтобы макрос действовал по нажатию на кнопку на любой из страниц книги. А также — см. мой первый пост
Путей к вершине — множество. Этот один из многих!
Надеюсь GWolf не обидется, что я «встрял»
ultravirus,
Во-первых, не используйте Select в Вашем макросе, т.е. замените строки
Range("C2:O2").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
на:
with Range("C2:O2")
.Borders(xlDiagonalDown).LineStyle = xlNone
end with
и второе,
что бы обращение было к конкретному листу конкретной книги используйте абсолютную ссылку, т.е.
конкретную книгу — Workbooks(«Пример.xls») и конкретный лист — Worksheets(«Исходные данные»)
with Workbooks("Пример.xls").Worksheets("Исходные данные").Range("C2:O2")
.Borders(xlDiagonalDown).LineStyle = xlNone
end with
и всё наладится
Цитата: boa от 26.03.2009, 00:09
Надеюсь GWolf не обидется, что я «встрял»ultravirus,
Во-первых, не используйте Select в Вашем макросе, т.е. замените строки
Range("C2:O2").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
на:
with Range("C2:O2")
.Borders(xlDiagonalDown).LineStyle = xlNone
end with
и второе,
что бы обращение было к конкретному листу конкретной книги используйте абсолютную ссылку, т.е.
конкретную книгу — Workbooks(«Пример.xls») и конкретный лист — Worksheets(«Исходные данные»)with Workbooks("Пример.xls").Worksheets("Исходные данные").Range("C2:O2")
.Borders(xlDiagonalDown).LineStyle = xlNone
end with
и всё наладится
необижусь абсолютно …
with Workbooks(«Пример.xls»).Worksheets(«Исходные данные»)
.Range(«C2:O2»)’ — что дает такая запись, в отличии от предложенной boa? См. Прим.
.Borders(xlDiagonalDown).LineStyle = xlNone
end with
Прим.
В пределах With … End with теперь можно указывать через точку, любой диапазон принадлежащий книге и (или, если в With указан только лист) листу указанному в With
И еще:
— если Вам нужно задать на выполнение макросом заранее неизвестный диапазон, так научите макрос его (этот диапазон) определять! Например, так:
Sub Proba()
Dim nRwEnd As Long ' - для занятых строк
Dim nClEnd As Long ' - для занятых столбцов
With ThisWorkbook.ActiveSheet
nRwEnd = .Cells(1, 1).CurrentRegion.Rows.Count
nClEnd = .Cells(1, 1).CurrentRegion.Columns.Count
End With
End Sub
Путей к вершине — множество. Этот один из многих!
Сделал все как написано выше — не получается так, чтобы при нажатии на кнопку на другом листе, макрос работал бы на заданном
При нажатии на кнопку выводится сообщение от VBA: «Run-time error ‘1004’: Application-defined or object-defined error» и при нажатии в сообщении на кнопку Debug выводит ошибку на первую же строку исполняемого кода макроса:
Selection.QueryTable.Refresh BackgroundQuery:=False
Что делать?
Вот что написано в справке:
The following example creates a connection to a SharePoint site and publishes the ListObject object named List1 to the server. A reference to the QueryTable object for the list object is created and the MaintainConnection property of the QueryTable object is set to True so that the connection to the SharePoint site is maintained between trips to the server.
(Следующий пример создает подключение с сайтом SharePoint и издает объект ListObject по имени List1 на сервер. Справочная информация на объект QueryTable для объекта списка создана, и MaintainConnection <xlproMaintainConnection.htm> свойство объекта QueryTable установлен в Истину так, чтобы подключение с сайтом SharePoint было поддержано между поездками в сервер.)
Dim wrksht As Worksheet
Dim objListObj As ListObject
Dim objQryTbl As QueryTable
Dim prpQryProp As pro
Dim arTarget(4) As String
Dim strSTSConnection As String
Set wrksht = ActiveWorkbook.Worksheets(«Sheet1»)
Set objListObj = wrksht.ListObjects(1)
arTarget(0) = «0»
arTarget(1) = «http://myteam/project1»
arTarget(2) = «1»
arTarget(3) = «List1»
strSTSConnection = objListObj.Publish(arTarget, True)
Set objQryTbl = objListObj.QueryTable
objQryTbl.MaintainConnection = True
может в этом проблема — объект незадан явно?
Я с объектом QueryTable не работал. Небыло таких задач.
Путей к вершине — множество. Этот один из многих!
Я не большой спец. Но я обычно создаю переменную типа Range и потом пользуюсь оператором Set. Можно и к другой странице, и к другой книге…
Так… Насчет кнопки на другой странице разобрался — нужно было все лишь вставить строку
Worksheets(«Лист с таблицей»).Activate
в начало кода, и строку
Worksheets(«Титульный лист»).Activate
(названия введены для простоты понятия о чем говорю).
Однако теперь встает другой вопрос — как заставить макрос работать в фоновом режиме, чтобы в фоне по нажатию кнопки происходила работа макроса, но без активного прыгания по страничкам?
Может, кто-то знает?
Цитата: ultravirus от 26.03.2009, 15:28
Однако теперь встает другой вопрос — как заставить макрос работать в фоновом режиме, чтобы в фоне по нажатию кнопки происходила работа макроса, но без активного прыгания по страничкам?Может, кто-то знает?
в начале:
Application.ScreenUpdating = False
Ваш код
Application.ScreenUpdating = True
в конце
Путей к вершине — множество. Этот один из многих!
Ур-р-р-р-я-а-а-а-а!!!!!! Заработало!!!! Спасибо всем откликнувшимся и не совсем
Рад! Чертовски рад!
P.S. Как предложение: выкладывать те решения, которые «заработали»! Может кому еще пригодится! Но это только предложение.
Путей к вершине — множество. Этот один из многих!
Добрый день.
в VBA не силен, поэтому обращаюсь к вам.
У меня есть макрос который делает фигуру прозрачной по значению в ячейке.
Мне необходимо чтоб название фигуры и значение находились на другом листе,
ну допустим Лист2 ячейка F10.
Соответственно в макросе должна быть ссылка на конкретный лист и ячейку.
К сожалению сделать самому не получилось подскажите вы пожалуйста.
Пример кода.
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
lr = Cells(Rows.Count, 2).End(xlUp).Row
arr = Range(Cells(10, 1), Cells(lr, 3)).Value
For Each Shape In ActiveSheet.Shapes
For i = 1 To UBound(arr)
If Shape.Name = arr(i, 1) Then
If arr(i, 2) = 1 Then Shape.Fill.Transparency = 1
If arr(i, 2) = 2 Then Shape.Fill.Transparency = 0
End If
Next
Next
End Sub
[/vba]
Make a particular worksheet visible using a macro in Excel.
This is called activating a worksheet and is rather easy to do.
Sections:
Activate Worksheet by Name
Activate Worksheet by Index Number
Notes
Activate Worksheet by Name
Let’s navigate to, activate, the worksheet called «Sheet2».
Worksheets("Sheet2").Activate
Worksheets(«Shee2») is how we reference the sheet to which we want to navigate.
Sheet2 is the name of the sheet to which we want to navigate. Make sure to surround it with double quotation marks.
Activate is what actually takes the user to that worksheet.
Putting it all together, we get: Worksheets(«Sheet2»).Activate
It’s as simple as that.
Activate Worksheet by Index Number
This time, let’s navigate to the second worksheet using its index number.
All we do is to replace «Sheet2» from the last example with 2.
Worksheets(2).Activate
2 is the index number of the desired worksheet and Activate is what takes us to the desired worksheet.
This example can be confusing if you are not used to using index numbers, but index numbers are really helpful when you have to do something like loop through all of the worksheets in the workbook.
Notes
Basically, just reference the desired worksheet, however you want, and then type .Activate after it.
You should not use the Activate feature to navigate to a worksheet so that you can get data from it or put data into it. This is very bad Macro/VBA design and it will make your life hell later on. To get data from separate worksheets, read this tutorial: Select Data from Separate Worksheets with Macros VBA in Excel.
This feature should be used when you want the user to end up on a specific worksheet.
Make sure to download the sample file attached to this tutorial so that you can see this macro in Excel and work with it.
Similar Content on TeachExcel
Copy and Paste Data using Macro VBA in Excel
Tutorial: How to copy and paste data using a Macro in Excel. I’ll show you multiple ways to do this,…
Select Data from Separate Worksheets with Macros VBA in Excel
Tutorial: Select data from other worksheets with Macros and VBA without navigating to those workshee…
Get the Last Row using VBA in Excel
Tutorial:
(file used in the video above)
How to find the last row of data using a Macro/VBA in Exce…
Login to a Website using a Macro
: Connect and login to a website using a macro in Excel.
This allows you to open a website a…
Get the Name of a Worksheet in Macros VBA in Excel
Tutorial: How to get the name of a worksheet in Excel using VBA and Macros and also how to store tha…
Guide to Creating Charts with a Macro in Excel
Tutorial: How to add, edit, and position charts in Excel using VBA.
This tutorial covers what to do …
Subscribe for Weekly Tutorials
BONUS: subscribe now to download our Top Tutorials Ebook!
- Что делает макрос
- Код макроса
- Как работает макрос
- Как использовать
- Скачать файл
Ссылка на это место страницы:
#zadacha
Помогает открыть Excel-книгу на нужном листе. С этим макросом Ваши пользователи будут сразу оказываться в конкретном месте файла. Этот код запускается по событию рабочей книги (Open— при открытии файла) и делает активным нужный лист.
Ссылка на это место страницы:
#formula
Private
Sub
Workbook_Open()
Sheets(
"Отчёт"
).
Select
End
Sub
Ссылка на это место страницы:
#kak
Макрос открывает книгу Excel на нужном листе, определяя этот лист перед запуском.
Ссылка на это место страницы:
#touse
Для реализации этого макроса, вам нужно скопировать и вставить его в код события Workbook_Open.
Размещение макроса здесь позволяет запускать макрос сразу при открытии Excel- файла.
1. Активируйте редактор Visual Basic, нажав ALT + F11.
2. В окне проекта найдите свой проект/имя рабочей книги и нажмите на знак плюс рядом с ним в чтобы увидеть все листы и модуль ЭтаКнига.
3. Правой кнопкой мыши нажмите на модуле ЭтаКнига и выберите View Code
4. В левой верхней части окна выберите объект WorkBook (Excel автоматом предложит написать макрос для события Workbook_Open, если нет, то выполните п.5
5. В правом верхнем выпадающем списке выберите событие Open
Ссылка на это место страницы:
#file
Файлы статей доступны только зарегистрированным пользователям.
1. Введите свою почту
2. Нажмите Зарегистрироваться
3. Обновите страницу
Вместо этого блока появится ссылка для скачивания материалов.
Привет! Меня зовут Дмитрий. С 2014 года Microsoft Cretified Trainer. Вместе с командой управляем этим сайтом. Наша цель — помочь вам эффективнее работать в Excel.
Изучайте наши статьи с примерами формул, сводных таблиц, условного форматирования, диаграмм и макросов. Записывайтесь на наши курсы или заказывайте обучение в корпоративном формате.
Подписывайтесь на нас в соц.сетях: