Elettracompany.com

Компьютерный справочник
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba excel снять выделение

Vba excel снять выделение

Здравствуйте, DreamWeaver, Вы писали:

DW> Есть выделенный объект (textBox). Мне нужно сделать активной основную страницу. Как это сделать? Пытался методом Collapse — не помогает

Снять выделение очень просто — например так: Selection.End = Selection.Start.
Непонятно что вы понимаете под «сделать активной основную страницу». Либо я просто не въехал в чем состоит контекст вопроса.

Вообще — вы очень странно формулируете ваши вопросы. Только посмотрев ваши последние несколько сообщений, можно понять, что вы пытаетесь сделать что-то с помощью VBA, скорее всего — в Word’е. Можно было бы указать это и в самом сообщении.

Здравствуйте, nzeemin, Вы писали:

N>Здравствуйте, DreamWeaver, Вы писали:

DW>> Есть выделенный объект (textBox). Мне нужно сделать активной основную страницу. Как это сделать? Пытался методом Collapse — не помогает

N>Снять выделение очень просто — например так: Selection.End = Selection.Start.
N>Непонятно что вы понимаете под «сделать активной основную страницу». Либо я просто не въехал в чем состоит контекст вопроса.

N>Вообще — вы очень странно формулируете ваши вопросы. Только посмотрев ваши последние несколько сообщений, можно понять, что вы пытаетесь сделать что-то с помощью VBA, скорее всего — в Word’е. Можно было бы указать это и в самом сообщении.
Я пишу прогу под VC++. С VB до этого дело не приходилось иметь. Мне нужно реализовать экспорт в Word. У меня есть таблица (в ListView) (пусть в ней для определенности 5 столбцов). В таблице 7 строк с данными. Мне нужно создать документ Word с 7-ью страницами, на каждой из которых располагались бы TextBox (по 5 штук на каждой странице). Таким образом вся информация из списка будет перенесена в документ. (Каждая строка из ListVIew отображается на отдельной странице в соответствующих TextBox-ах)
Я написал 5 макросов (вызываю их из VC++ через COM методом Run):
1) Создание TextBox-а. Передается позиция x ,y, ширина, высота текстбокса. В зависимости от дополнительного параметра скрывается рамка.

1-ый макрос создает шаблон

2) Копирует весь шаблон в буфер обмена

3) Я определяю сколько строк из ListVIew нужно экспортировать и создаю нужное количество страниц, затем перемещаюсь на самое начало документа

4) Затем в цикле прохожу по всем строкам ListView моего приложения и для каждой вызываю макросы 4 и 5
Этот макрос вставляет содержимое буфера обмена (в нем содержится шаблон формы), а затем переходит на следующую страницу

5) Этот макрос устанавливает для только что вставленного шаблона новые имена. Изменяется не только текст на TextBox-ах, но и имена этих текстбоксов.

А вот теперь проблема: я вставил из буфера обмена несколько TextBox-ов (шаблон), я знаю их имена. Выделяю по отдельности каждый из них и устанавливаю нужный текст. Затем в программе на VC++ начинается новый цикл и снова вставляется из буфера обмена шаблон. Но проблема в том, что у меня уже выделен TextBox и шаблон вставляется в этот выделенный TextBox, а не в основную страницу. Точно не знаю как она называется, но я имею в виду большой белый лист, который отображается на экране. ВОт мне и нужно снять выделение с TextBox-а. Ваш способ Selection.End = Selction.Start не работает.
ЕЩе странность в том, что если поставить на запись макрос, то нет возможности снять выделение с TextBox-а. Как такое может быть?

Vba excel снять выделение

По материалам эхоконференции RU.EXCEL (за июль-сентябрь 1997 года) Collected by Kirienko Andrew, 2:5020/239.21@fidonet

Cодержание

Как определить последнюю запись в таблице Excel?

Q: Необходимо найти последнюю запись вэлектронной таблице. Какой функцией VB это можно было бы организовать.

A: Первое что вспомнилось: Application.SpecialCells(xlLastCell)

Как отменить выделение диапазона ячеек?

Q: Как управиться с такой болячкой:

После прекращения работы макроса диапазон остается выделенным. Как это выделение убрать?

A: Попробуй вот как: Selection.Cells(1).Select Фокус ввода попадёт после этого на первую ячейку ранее выделенного диапазона.

Как из макроса Excel программно создать таблицу Access?

Q: Подскажите, пожалуйста, как из под Excel программно создать таблицу Access

A: Вот фрагмент кода, который создаёт таблицу «BalanceShifr» базе данных MS Access:

Нint: Не забудьте выставить в Excel ссылки на объекты DAO!
[VBA] Tools/References/Available References/ [x] MicroSoft DAO. Library ‘ Function CreateTable ‘ Create temporary table «BalanceShifr» into temporary database

Public Function CreateTable(ByVal dbTemp As Database) As Boolean

Dim tdfTemр As TableDef
Dim idx As Index
Dim fld As Field

On Error GoTo errhandle

CreateTable = True
‘ CREATE TABLE «BalanceShifr»
Set tdfTemp = dbTemp.CreateTableDef(«BalanceShifr»)
Set fld = tdfTemp.CreateField(«ConditionId», dbLong)
fld.Required = True
tdfTemp.Fields.Append fld
Set fld = tdfTemp.CreateField(«Account», dbText, 4)
tdfTemp.Fields.Append fld
Set fld = tdfTemp.CreateField(«SubAcc», dbText, 4)
tdfTemp.Fields.Append fld
Set fld = tdfTemp.CreateField(«Shifr», dbLong)
tdfTemp.Fields.Append fld
Set fld = tdfTemp.CreateField(«Date», dbDate)
fld.Required = True
tdfTemp.Fields.Append fld
Set fld = tdfTemp.CreateField(«SaldoDeb», dbCurrency)
tdfTemp.Fields.Append fld
Set fld = tdfTemp.CreateField(«SaldoKr», dbCurrency)
tdfTemp.Fields.Append fld
dbTemp.TableDefs.Append tdfTemp

‘ CREATE INDEX «BalanceShifr»
Set tdfTemp = dbTemp.TableDefs(«BalanceShifr»)
Set idx = tdfTemp.CreateIndex(«ForeignKey»)
Set fld = idx.CreateField(«ConditionId»)
idx.Fields.Append fld
tdfTemp.Indexes.Append idx
Exit Function

errHandle:
MsgBox «Table creating error!», vbExclamation, «Error»
CreateTable = False
End Function

Удаление листов в зависимости от даты

Q: Как удалить рабочие листы листов в зависимости от даты?

A: Вот код функции на Excel VBA, который решает данную проблему:

‘ Function DelSheetByDate
‘ Удаляет рабочий лист sSheetName в активной рабочей книге,
‘ если дата dDelDate уже наступила
‘ В случае успеха возвращает True, иначе — False

Public Function DelSheetByDate(sSheetName As String, _
dDelDate As Date) As Boolean
On Error GoTo errHandle

DelSheetByDate = False
‘ Проверка даты
If dDelDate

Подавление «горячих» клавиш.

Q:Как подавить доступ по «горячим» клавишам, имеется ввиду предопределенные в Excel клавиши типа Ctrl-O и т.д.?

A:Вот малюсенький исходник на Excel VB, который решает такую проблему. 🙂

Public Sub Auto_Open()
‘ Overrride standard accelerators
With Application
.OnKey «^o», «Dummy»
.OnKey «^s», «NewAction»
.OnKey «^р», «» ‘ Kill hotkey !
End With
End Sub

‘ ——
Public Sub Dummy()
MsgBox «This hotkey redefined!»
End Sub

‘ ——
Public Sub NewAction()
SendKeys «^n» ‘ Press + for create new file
‘ instead of + !
End Sub

Читать еще:  Excel если пусто то

Hint: Отлажено в MS Excel ’97 !

Подсказки к Toolbar

Q: Как сделать к «само нарисованным» кнопочкам на Toolbar’е подсказки? (Ну, те, что после 2-х секунд молчания мышки появляются)

A: Сделать можно вот как: (Пример реализации на Excel’97 VBA )

‘ Cоздаем тулбар
Рublic Sub InitToolBar()
Dim cmdbarSM As CommandBar
Dim ctlNewBtn As CommandBarButton

Set cmdbarSM = CommandBars.Add(Name:=»MyToolBar»,
Position:=msoBarFloating, _
temporary:=True)
With cmdbarSM
‘ 1) Добавляем кнопку
Set ctlNewBtn = .Controls.Add(Type:=msoControlButton)
With ctlNewBtn
. FaceId = 26
.OnAction = «OnButton1_Click»
.TooltipText = «My tooltip message!»
End With
‘ 2) Добавляем ещё кнопку
Set ctlNewBtn = .Controls.Add(Type:=msoControlButton)
With ctlNewBtn
.FaceId = 44
.OnAction = «OnButton2_Click»
.TooltipText = «Another tooltip message!»
End With
.Visible = True
End With
End Sub

Hint: На VBA для Excel’95 это делается несколько иначе!

Как определить адрес активной ячейки

Q: Как в макросе узнать и использовать текущее положение курсора (не мышиного, естественно)?

A: Очень просто! 🙂
ActiveCell.Row и ActiveCell.Column — покажут координаты активной ячейки.

Подсчет комментариев на рабочем листе

Q: Как узнать есть ли хоть один Notes (комментарий) в рабочем листе, кроме как перебором по всем ячейкам? . Без этого не работает:

A: В Excel’97 эта проблема может быть решена вот как:

‘ Function IsCommentsPresent
‘ Возвращает TRUE, если на активном рабочем листе имеется хотя бы
‘ одна ячейка с комментарием, иначе возвращает FALSE

Public Function IsCommentsPresent() As Boolean
IsCommentsPresent = ( ActiveSheet.Comments.Count <> 0 )
End Function

Подсказки к Toolbar (Excel’95)

Q: Как сделать свой собственный Toolbar с tooltip’ами на кнопках в Excel’95?

A: Вот фрагмент кода для Excel’95, который создаёт toolbar с одной кнопкой с пользовательским tooltiр’ом. Нажатие кнопки приводит к выполнению макроса NothingToDo() .


‘ This example creates a new toolbar, adds the Camera button
‘ (button index number 228) to it, and then displays the new toolbar.

Public Sub CreateMyToolBar()
Dim myNewToolbar As Toolbar
On Error GoTo errHandle:

Set myNewToolbar = Toolbars.Add(Name:=»My New Toolbar»)
With myNewToolbar
.ToolbarButtons.Add Button:=228, StatusBar:=»Statusbar help string»
.Visible = True
With .ToolbarButtons(1)
.OnAction = «NothingToDo»
.Name = «My custom tooltiр text!»
End With
End With
Exit Sub
errНandle:
MsgBox «Error number » & Err & «: » & Error(Err)
End Sub


‘ Toolbar button on action code

Рublic Sub NothingToDo()
MsgBox «Nothing to do!», vbInformation, «Macro running»
End Sub

Нint: В Excel’97 этот код тоже работает!

Запуск Excel с поиском ячейки

Q: Как запустить Excel, чтобы оказаться на ячейке содержимое которой известно заранее?

A:Вот как я решил бы твою задачу:

‘ Sub GotoFixedCell:
‘ Делает активной ячейку, содержащую значение vVariant на
‘ рабочем листе sSheetName в активной рабочей книге.

‘ Note: Содержимое ячеек интерпретируется как ‘значение’!

Public Sub GotoFixedCell(vValue As Variant, sSheetName As String)
Dim c As Range, cStart As Range, cForFind As Range
Dim i As Integer

On Error GoTo errhandle:

Set cForFind = Worksheets(sSheetName).Cells ‘ Диапазон поиска
With cForFind
Set c = .Find(What:=vValue, After:=ActiveCell, LookIn:=xlValues, _
LookAt:= xlРart, SearchOrder:=xlByRows,_
SearchDirection:=xlNext, MatchCase:=False)
Set cStart = c
While Not c Is Nothing
Set c = .FindNext(c)
If c.Address = cStart.Address Then
c.Select
Exit Sub
End If
Wend
End With
Exit Sub
errНandle:
MsgBox Err.Descriрtion, vbExclamation, «Error #» & Err.Number
End Sub

Нint: Достаточно выполнить этот код из макроса Auto_Oрen()!

Нint: Протестировано и отлажено в Excel’97.

ThisWorkBook или ActiveWorkBook?

Q: На листе модулей открытой рабочей книги присутствует процедура, которая копирует некий лист из другой (не активной) рабочей книги. В этом листе в некоторых ячейках находятся определенные пользователем формулы. Процедура работает без проблем.
Из workbook, содержащей эту процедуру, я делаю надстройку (.xla) и подключаю ее к Excel 95. При вызове вышеописанной процедуры она выдает сообщение:
Run time error 424 object required
Kак можно избежать это сообщение?

A:Вот что я тебе посоветую:
Посмотри ещё разок код модулей рабочей книги и исправь все ссылки вида ActiveWorkbook.WorkSheets(«.. на ссылки вида ThisWorkBook.WorkSheets(«..

Дело в том, что когда выполняется код надстройки активной книгой в Excel’е является _не_ сама надстройка! Конструкция ThisWorkbook позволяет сослаться на книгу, в которой в настоящий момент выполняется код Excel VBA.

Нint: Это общий принцип создание надстроек Excel!

Как задать имя листу, который будет вставлен?

Q:Хочy через Excel VBA задать имя листу, который будет вставлен. Но у команды Sheets.Add нет такого параметра ! Как бороться?

A: Очень просто.

‘ Sub CreateSheet
‘ Вставляет активную рабочую книгу в рабочий лист с именем sSName.
‘ Note: Если параметр bVisible имеет значение False, этот лист становится скрытым.

Рublic Sub CreateSheet(sSName As String, bVisible As Boolean)
Dim wsNewSheet As WorkSheet

On Error GoTo errНandle

Set wsNewSheet = ActiveWorkBook.Worksheets.Add
With wsNewSheet
.Name = sSName
.Visible = bVisible
End With
Exit Sub
errНandle:
MsgBox Err.Descriрtion, vbExclamation, «Error #» & Err.Number
End Sub

Как проверить существует ли лист?

Q: А как проверить существует ли лист?

A: Я бы поступил вот как:

‘ Function IsWorkSheetExist
‘ Проверяет, имеется ли в активной рабочей книге лист с именем sSName.
‘ В случае успеха возвращает True, иначе — False

Рublic Function IsWorkSheetExist(sSName As String) As Boolean
Dim c As Object

On Error GoTo errНandle:
Set c = sheets(sName)
‘ Альтернативный вариант :
Worksheets(sSName).Cells(1, 1) = Worksheets(sSName).Cells(1, 1)
IsWorkSheetExist = True
Exit Function
errНandle:
IsWorkSheetExist = False
End Function

Нint: Отлажено и протестировано в Excel’97.

Как обратиться к ячейке по ее имени?

Q: Как обратиться к ячейки по ее имени? Т.е. есть Лист1 и в нем ячейки с именем Дебет и Кредит. Хочy подсчитать Дебет-Кредит средствами Excel VBA. Попробовал Range(Дебет)-Range(Кредит), ругается, что не описаны переменные.

A: Если я правильно тебя понял, нужно разыменовать ячейку из кода Excel VBA. Вот фрагмент кода, который решает такую задачу:

‘ Function ValueOfNamedCell
‘ Возвращает значение ячейки с именем sCellName. в активной рабочей книге.
‘ Note: Если ячейка с именем sCellName не существует — функцией возвращается
‘ значение Emрty.

Рublic Function ValueOfNamedCell(sCellName As String) As Variant
On Error GoTo errНandle
ValueOfNamedCell = ActiveWorkbook.Names(sCellName).RefersToRange.Value
Exit Function
errНandle:
ValueOfNamedCell = Emрty
End Function

Читать еще:  Vba excel перенос строки

Нint: Отлажено и протестировано в Excel’97.

Можно ли из программы на Visual Basic создать рабочую книгу Excel?

Q: Можно ли из программы на Visual Basic создать рабочую книгу Excel?

Пример того, как из Visual Basic’a через OLE запустить Excel, и создать рабочую книгу.

‘ CreateXlBook
‘ Вызывает MS Excel, создает рабочую книгу с именем sWbName с одним
‘ единственным рабочим листом. Рабочая книга будет сохранена в каталоге
‘ sDirName. В случае успеха возвращает True, в противном случае — False.

Public Function CreateXlBook(sWbName As String, sDirName) As Boolean

‘ MS Excel hidden instance
Dim objXLApp As Object
Dim objWbNewBook As Object

Set objXLApp = CreateObject(«Excel.Application»)
If objXLApp Is Nothing Then Exit Function

‘ В новой рабочей книге создавать только один рабочий лист
objXLApp.SheetsInNewWorkbook = 1

Set objWbNewBook = objXLApp.Workbooks.Add
If objWbNewBook Is Nothing Then Exit Function

‘ Сохраняем книгу
If vbNullString = Dir(sDirName, vbDirectory) Then Exit Function

objWbNewBook.SaveAs (sDirName + «» + sWbName + «.xls»)
CreateXlBook = True

‘ Освобождение памяти
Set objWbNewBook = Nothing
objXLApp.Quit
Set objXLApp = Nothing
CreateXlBook = True

Hint: Tested and approved with MS Visual Basic 4.0 Enterprise Edition

Excel VBA кнопки выбора опций — как вы снимаете их выделение?

Я пытаюсь снять выделение с radio buttons и не могу понять, как это сделать. Моя последняя попытка выглядит так:

Где имя radio button — это STCT04 (или 05, или 06, или. вы получаете шаблон), а числовая часть имени хранится в строковой переменной. Я тоже пробовал это

не повезло. Я погуглил довольно много, и в 32 случаях комментаторы предлагают один из двух упомянутых выше, и плакат с вопросом всегда говорит, что это сработало. Но это не для меня.

Что же мне тогда делать?

Редактировать: У меня есть список вариантов на выбор, у каждого есть назначенная кнопка. У меня есть около 10 вариантов, но пользователь иногда должен быть в состоянии выбрать только из 5 из этих 10. (Это зависит от других вещей в моей рабочей тетради.) В этих случаях (если опция не применяется) я хотел бы установить свойство «value» или «enabled» кнопки в False. Когда я делаю это (изменяю одно из двух свойств), это также отменяет выделение всех ранее существовавших выделений. (Как будто была нажата кнопка вызова макрокоманды.) Я надеюсь, что это имеет смысл.

Пример: допустим, выбран вариант 2. решение еще не окончательное, но я его уже выбрал. Затем что-то меняется и исключает вариант 3 из списка опций. Когда я изменяю одно из двух вышеупомянутых свойств Button3, опция 2 также меняется на unselected.

1 Ответ

Используйте свойство Value .

По кнопке опции ActiveX:

По кнопке выбора формы:

Похожие вопросы:

Я ищу простой макрос, который я мог бы активировать с помощью кнопки управления формой, которая очистила бы все кнопки управления формой на моем листе. У меня есть списки вариантов спецификаций.

У меня есть сценарий VBA в Excel, который замораживает области листа Excel, но мне любопытно посмотреть, возможно ли это без предварительного выбора диапазона. Вот код, который застывает строк с 1.

Мое приложение имеет интерфейс Excel. Я использую VBA, чтобы вызвать мой C/C++ dll, который делает все число хруст. VBA используется для передачи данных между Excel и мой C++ dll, и создает сюжеты и.

Немного информации о моей цели. У меня есть электронная таблица для оценки рисков, которая должна быть автоматизирована, я использую кнопки опций, чтобы дать стандартные да нет вариантов для.

на моем UserForm я создал кнопки опций рядом с темой, которую я хочу, чтобы мои пользователи выбрали, т. е. если они выбирают mechanical engineering, то справа от него есть кнопка опции yes или.

Когда я нажимаю кнопки VBA в Excel 2007, я перехожу в режим редактирования. Но когда я пытаюсь изменить их inExcel 2011-я нажимаю на него, и он щелкает! Но как переключить командный режим и режим.

Вот один для Джоэла. Я ищу способы продемонстрировать пользователю Excel (без опыта программирования), как изучение некоторых Excel VBA может немного облегчить их жизнь, работая с Excel.

Я хочу добавить много кнопок выбора на рабочий лист excel (а не на форму VBA) и хочу сгруппировать их по строкам. Результат должен выглядеть примерно так: Вот код, который я использую до сих пор.

Я пытаюсь сделать некоторые анкеты в excel (да, я знаю, что есть лучшие способы сделать это 😉 У меня есть несколько листов в нем, и каждый из них содержит некоторые кнопки выбора ActiveX (Да /.

У меня есть функция Word VBA, которую я пытаюсь построить в Excel VBA (причина этого выбора исходит из этого вопроса ), и я застрял в следующей проблеме: Функция Word VBA широко использует.

Как запустить макрос без снятия выделения с объектов?

Программирование

Вообщем нужно запустить макрос с кнопки на панели, чтобы выделенние с объектов не снималось. Т.е. чтобы макрос мог с ними работать.

чего то я не понимаю 🙂
есть у меня макрос на VBA с формой, а на панельке кнопка с запуском макроса: _-vbarun «podp.dvb!ThisDrawing.ааа»
нажимаю на кнопку,
появляется форма и все выделение снимается.
А если этот же макрос запускать из под редактора VBA, нажимаю на кнопочку RUN, то появляется форма и выделение не снимается.

^C^C я убрал не помогло

Сообщение от :
в макросе исползовать опцию _p (Previous), тогда команды будут работать с последним выделением на чертеже.

извините за глупый вопрос: это куда вставлять?

Krieger, макрос добавляет ко всему выделенному тексту цифры по порядку выглядит это примерно так, и нужно чтоб текст оставался выделенным, чтобы все это работало:


Private Sub CommandButton1_Click()
Dim pfSS As AcadSelectionSet
Dim object As AcadEntity
Dim tip As String
Dim i As Integer
Dim step As Integer
Dim p As Variant
i = Val(Me.txtI)
step = Val(Me.txtS)
Set pfSS = ThisDrawing.PickfirstSelectionSet

For Each object In pfSS
tip = object.ObjectName
If tip = «AcDbText» Then
If Me.obK.Value = True Then
object.TextString = object.TextString & «-» & i
Else
object.TextString = i & object.TextString
End If
object.Update
i = i + step
End If
Next object

Читать еще:  Формулы факторный анализ в excel пример

Сообщение от Автон:
С-но сабж

Вообщем нужно запустить макрос с кнопки на панели, чтобы выделенние с объектов не снималось. Т.е. чтобы макрос мог с ними работать.

Вот не помню, где подсмотрел:
(vla-runmacro (vlax-get-acad-object) «ThisDrawing.MACRONAME»)
У меня работает.

Сообщение от Автон:
С-но сабж

Вообщем нужно запустить макрос с кнопки на панели, чтобы выделенние с объектов не снималось. Т.е. чтобы макрос мог с ними работать.

Очевидно, тебе нужно выделить отредактированные объекты после прохода макроса..
Если так, то вот здесь найдешь:
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=22820VI

B2Slow, спасибо за

vla-runmacro (vlax-get-acad-object) «ThisDrawing.MACRONAME»

думаю это то что нужно, однако это по-моему для LISP`а
а вот для VBA это не работает

Сообщение от :
Если нужно оперировать объектами, выделенными до запуска макроса именно в VBA, используй PickFirstSelectionSet.

Сообщение от :
vla-runmacro (vlax-get-acad-object) «ThisDrawing.MACRONAME»

думаю это то что нужно, однако это по-моему для LISP`а
а вот для VBA это не работает

— это не для лиспа, это нужно повесить на кнопку, а всместо «ThisDrawing.MACRONAME» напишешь свой макрос. После этого можно будет выделить объекты, запустить этот самый макрос, и в нем получить доступ к этим объектам через ActiveSelectionSet. И это еще как работает, — проверено!

Сообщение от :
Цитата:

Если нужно оперировать объектами, выделенными до запуска макроса именно в VBA, используй PickFirstSelectionSet.

а можно поподробнее

Так это ж у тебя в коде есть:

Сообщение от :
есть у меня макрос на VBA с формой, а на панельке кнопка с запуском макроса: _-vbarun «podp.dvb!ThisDrawing.ааа»
нажимаю на кнопку,
появляется форма и все выделение снимается.
А если этот же макрос запускать из под редактора VBA, нажимаю на кнопочку RUN, то появляется форма и выделение не снимается.

🙂 да не за что.

Сообщение от :
Никогда не обращал внимания на то, что после запуска из под VBE, выделение остается..
А тебе оно, собственно, для чего. Во время выполнения макроса от него ни холодно, ни жарко

PFSS мог пустеть только если на кнопке перед -vbarun стояло ^C^C (аналогия нажатия Escape). Если этого не было, все выделение должно передаваться в макрос нормально..

Работа с выделениями

Работа с выделениями

Прежде чем изменить значение или формат ячейки или нескольких ячеек, пользователь должен их выделить. Однако в VBA выделение ячеек не требуется, так как для идентификации ячеек, над которыми должны проводиться определенные действия, можно использовать объекты Range. Но в VBA есть инструменты, связанные с выделением; они используются для реализации двух возможностей — код способен определить, какие ячейки выделены пользователем, и код может показать пользователю место на рабочем листе, где происходит что-то важное.

Во многих случаях пользовательский код должен воздействовать на выбранные ячейки, как это делают встроенные команды Excel. Для доступа к выделенному пользователем диапазону используется свойство Selection (Выделение) объекта Application или Window. Свойство Selection объекта Application возвращает диапазон, выделенный на рабочем листе, активном в данный момент. Следующие два оператора идентичны:

Selection.Value =2 0

Для того чтобы удостовериться в том, что ссылка всегда относится к определенному окну, независимо оттого, какое окно активно в текущий момент, необходимо использовать свойство окна Selection. В следующем примере продемонстрирована данная техника; также здесь показано, как установить объектную ссылку на диапазон, представляющий текущее выделение для повторного использования того же диапазона в дальнейшем:

Dim Sel Range As Range

Set SelRange = Windows(«Инвентаризация игрушек.xls»>.Selection

Когда VBA-программа вносит изменения в рабочий лист и необходимо, чтобы пользователь их заметил, следует воспользоваться методом Select (Выделить) для перемещения выделения на нужный диапазон, диаграмму или что-либо другое. Метод Select можно применять фактически к любому существующему в Excel объекту, в том числе к объектам Chart (Диаграмма) и всем их компонентам (каждая часть диаграммы является отдельным VBA-объектом). к объектам Shape (Форма) и, конечно же, к объектам Range.

Для выделения диапазона необходимо сначала активизировать рабочий лист, на котором диапазон находится, а затем использовать метод Select для объекта Range, как показано в данном примере:

.Activate .Range(«Разбитые сердца»).Select

Кстати, метод Select для объектов Worksheet, очевидно, не выполняет ничего, кроме активизации указанного рабочего листа, и не изменяет в нем существующее выделение. Другими словами, он эквивалентен методу рабочего листа Activate. Подобным образом методы Activate и Select можно использовать для активизации листа диаграммы, но ни один из методов в действительности не выделяет диаграмму. Вот пример;

Chart s(«Места жительства клиентов»).Select

Для того чтобы выделить компонент диаграммы или внедренную диаграмму, используйте метод Select для интересующего вас объекта.

Чтобы сделать ячейку активной для ввода, к данной ячейке используется метод Activate (Активизировать) объекта Range. Если активизированная ячейка находится в пределах текущего выделения, весь диапазон остается выделенным. Именно таким образом работает следующий пример:

Если активизированная ячейка находится за пределами выделения, оно перемещается на активизированную ячейку.

Код для работы с выделенными ячейками, вероятно, приведет к возникновению ошибки, если его применить к диаграмме. Вот почему, прежде чем выполнять какие-либо операции с выделением, обычно следует убедиться, что выделение содержит тот тип объектов, который ожидается в коде. VBA-функция TypeName возвращает строку, содержащую тип объекта

выделения. С помощью структур If. . .Then или Case. . .Select можно определить, какое из возможных действий проводить над выделенным объектом.

В приведенном ниже примере выражение TypeName ( Selection) в операторе Select (вторая строка кода) возвращает строку, содержащую тип объекта текущего выделения. Данная строка затем проверяется рядом операторов Case, является ли выделение диапазоном (в таком случае его значение устанавливается равным 2 001), областью диаграммы (в таком случае устанавливается красный цвет выделения), когда же выделение не сделано, пользователь видит сообщение об отсутствии выделения. Также предусмотрен вывод соответствующего сообщения для случая, когда выделение не принадлежит ни одному из перечисленных типов:

Select Case TypeName(Selection)

.Interior.Colorlndex = 3 ‘ 3 = bright red

MsgBox «Ничего не выделенно»

MsgBox «Невозможно определить тип выделения!»

Ссылка на основную публикацию
Adblock
detector