Если в макросе не указано слева ничего, то обращение идет к подобъекту активного объекта. Например,
Код |
---|
Cells(Rows.Count, 2).End(xlUp).Row |
В этом случае обращение идет к ячейкам. Они — подобъект листа. Значит, обращение пойдет к ячейкам активного листа. Чтобы обратиться к ячейкам листа, который не является активным, то нужно указать его явно:
Код |
---|
Sheets("имя Вашего листа").Cells(Rows.Count, 2).End(xlUp).Row |
Чтобы укоротить запись можно вставить блок With. У Вас он использован. Внутри этого блока ко всему, что начинается с точки, применяется тот объект, который в строке с With.
Переменным можно присваивать объекты. В приведенном Вами макросе это тоже использовано, тогда можно обращаться к ячейкам неактивного листа еще и так:
Можно работать и с неактивной в данный момент книгой:
Код |
---|
Workbooks("Имя Вашей книги").Sheets("имя Вашего листа").Cells(15, 2) |
Обращение с явным указанием возможно и для активного объекта…
Добрый день.
в 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]
Создание гиперссылки в VBA Excel методом Hyperlinks.Add для перехода на другой лист, на интернет-сайт, для открытия любого файла в программе по умолчанию.
Hyperlinks.Add — это метод, который добавляет новую гиперссылку к указанному объекту Range (диапазону, ячейке) или объекту Shape (фигуре).
Синтаксис
Expression.Add (Anchor, Address, SubAddress, ScreenTip, TextToDisplay) |
Expression — выражение (переменная), возвращающее объект Hyperlinks.
Параметры
Параметр | Описание |
---|---|
Anchor | Объект Range или объект Shape, к которому привязывается (добавляется) новая гиперссылка. Обязательный параметр. Тип данных — Object. |
Address | Адрес гиперссылки. Обязательный параметр. Тип данных — String. |
SubAddress | Субадрес гиперссылки. Необязательный параметр. Тип данных — Variant. |
ScreenTip | Всплывающая подсказка, отображаемая при наведении указателя мыши на текст гиперссылки. Необязательный параметр. Тип данных — Variant. |
TextToDisplay | Текст гиперссылки. Необязательный параметр. Тип данных — Variant. |
Если текст гиперссылки (TextToDisplay) не указан, будет отображен текст параметров Address и SubAddress.
Создание гиперссылки на рабочий лист другой книги:
ActiveSheet.Hyperlinks.Add Anchor:=Range(«A4»), Address:=«C:UsersEvgeniyDesktopКнига2.xlsx», _ SubAddress:=«Лист3!D5», ScreenTip:=«Гиперссылка на Лист3!D5 в Книга2», TextToDisplay:=«Книга2 — Лист3!D5» |
Создание гиперссылки на другой лист текущей книги:
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:=«», _ SubAddress:=«Лист4!D6», TextToDisplay:=«Эта книга — Лист4!D6» |
Создание гиперссылки на другую ячейку того же листа:
Worksheets(«Лист1»).Hyperlinks.Add Anchor:=Range(«A1»), Address:=«», _ SubAddress:=«Лист1!D6», TextToDisplay:=«Перейти к D6» |
Создание гиперссылки на документ Word:
ActiveSheet.Hyperlinks.Add Anchor:=Range(«A1»), Address:=«C:UsersEvgeniyDocumentsДокумент 1.docx», _ TextToDisplay:=«Ссылка на Документ 1» |
Создание гиперссылки на точечный рисунок:
ActiveSheet.Hyperlinks.Add Anchor:=Range(«A1»), Address:=«C:UsersEvgeniyDocumentsРисунок 1.bmp», _ TextToDisplay:=«Ссылка на Рисунок 1» |
Пример добавления гиперссылки на рубрику «VBA Excel» сайта «Время не ждёт»:
ActiveSheet.Hyperlinks.Add Anchor:=Range(«A1»), Address:=«https://vremya-ne-zhdet.ru/category/vba-excel/», _ TextToDisplay:=«Рубрика VBA Excel» |
Поиск первой ячейки с гиперссылкой в заданном диапазоне:
Sub Primer() Dim myRange As Range, n As Integer, i As Integer, s As String ‘Задаем диапазон поиска Set myRange = Range(«A1:G10») ‘Вычисляем количество ячеек в заданном диапазоне n = myRange.Cells.Count ‘Ищем первую ячейку с гиперссылкой For i = 1 To n If myRange.Cells(i).Hyperlinks.Count > 0 Then s = myRange.Cells(i).Address Exit For End If Next MsgBox s End Sub |
Для поиска последней ячейки с гиперссылкой в заданном диапазоне следует заменить строку
For i = 1 To n
на
For i = n To 1 Step -1
.
Привет, Народ!
У меня совсем нет опыта в написании макросов, поэтому прошу помощи.
Ситуация следующая: у меня есть книга 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. Как предложение: выкладывать те решения, которые «заработали»! Может кому еще пригодится! Но это только предложение.
Путей к вершине — множество. Этот один из многих!
Вставка гиперссылок на листы в Excel макрос
Добрый день уважаемые читатели блога! После небольшого перерыва возобновляю работу по Excel. Вопросов накопилось довольно много — буду отвечать на них по очереди.
Сегодня речь пойдёт о гиперссылках в Excel, точнее об их автоматической вставке на лист. Представим ситуацию, когда в нашей книге листов огромное количество, бухгалтерские расчёты, к примеру.
Вставить вручную гиперссылки можно, пусть для этого и понадобится чуть больше времени. Обычно мы вставляем гиперссылки через вкладку «Вставка» и кнопку «Гиперссылка», а затем переходим на пункт «Место в документе».
Видите, уже сложнее. Проделать такую операцию с точки зрения лени времени будет слишком затратно. Поэтому напишем небольшой макрос.
Вставим в наш документ новый модуль:
- Вкладка «Разработчик», блок кнопок «Код», кнопка «Visual Basic»;
- Далее «Insert» — > «Module».
Поместим в поле кода следующий текст:
Sub SheetNamesAsHyperLinks()
Dim sheet As Worksheet
Dim cell As Range
With ActiveWorkbook
‘ Для каждого листа (имени) создадим свою ссылку
For Each sheet In ActiveWorkbook.Worksheets
Set cell = Worksheets(1).Cells(sheet.Index, 1)
.Worksheets(1).Hyperlinks.Add Anchor:=cell, Address:=»», _
SubAddress:=» » & sheet.Name & «!A1»
cell.Formula = sheet.Name
Next
End With
End Sub
Немного подробностей:
- у нас есть две переменные «sheet» и «cell», лист и ячейка;
- «With activeWorkbook» — показывает, что макрос будет оперировать пространством всей книги;
- «For Each sheet In ActiveWorkbook.Worksheets
Set cell = Worksheets(1).Cells(sheet.Index, 1)
.Worksheets(1).Hyperlinks.Add Anchor:=cell, Address:=»», _
SubAddress:=» » & sheet.Name & «!A1» « » — для каждого листа в рабочей книге мы будем использовать первую ячейку (А1); - «cell.Formula = sheet.Name» — формула для макроса будет помещение в ячейку A1 названия первого листа книги, далее в A2 второго и т.д.
Таким образом, мы экономим себе время на переходах, так как не отвлекаемся на нижнюю часть экрана с именами листов, а имеем список листов в виде гиперссылок. Понаблюдаем за результатами работы. Нажимаем сочетание клавиш ALT+F8 или переходим на вкладку «Разработчик», нажимаем кнопку «Макросы», у нас единственная строка «SheetNamesAsHyperLinks», нажимаем «Выполнить».
На листе «Оглавление» появится список всех существующих листов в нашей рабочей книге.
Теперь мы можем просто щёлкать ячейку с именем листа для перехода.
Если что-то было непонятно, посмотрите наше видео!
Вас может заинтересовать урок — Поменять строки местами.