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


Содержание

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

Представленная ниже страница, лишь часть огромного сайта посвященного различной компьютерной документации, на сайте собрано более 800 мб информации. Если Вы не нашли в этой статье, то что Вы ищите попробуте посмотреть здесь, cпросить на форуме или поискать необходимую Вам информацию в нашем каталоге ссылок сайтов компьтерной тематики.

Если же Вы хотите приобрести бумажную копию представленных здесь
материалов, обращайтесь в наш книжный магазин.

С уважением,
команда разработчиков eManual.ru

Excel VBA: Приёмы программирования.

eManual.ru — электронная документация

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

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 )
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 + for create new file
‘ instead of + !
End Sub

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

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
. Face > .OnAction = «OnButton1_Click»
.TooltipText = «My tooltip message!»
End With
‘ 2) Добавляем ещё кнопку
Set ctlNewBtn = .Controls.Add(Type:=msoControlButton)
With ctlNewBtn
.Face > .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

Н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 как отменить выделение диапазона ячеек ?

Application.Goto Range(«B5»)
Application.Goto Reference:=Range(«B5»)
Application.Goto Reference:=Range(«Дата»)
Application.Goto «Дата»
Application.Goto [Дата]
Application.Goto Reference:=»Дата»
Application.Goto Reference:=[Дата]

Range(Names!Дата).Select
Range(ThisWorkbook.Names!Дата).Select
Range(Application.Names!Дата).Select

Range(Names(«Дата»)).Select
Range(ThisWorkbook.Names(«Дата»)).Select
Range(Application.Names(«Дата»)).Select

Names!Дата.RefersToRange.Select
ThisWorkbook.Names!Дата.RefersToRange.Select
Application.Names!Дата.RefersToRange.Select

Names(«Дата»).RefersToRange.Select
ThisWorkbook.Names(«Дата»).RefersToRange.Select
Application.Names(«Дата»).RefersToRange.Select

Range(«B5:B10»).Item(1).Select
Range(«B5:B10»).Item(1, 1).Select
Range(«A5:CM5»).Item(1, 2).Select
Range(«B1:B10»).Item(5).Select
Range(«B1:B10»).Item(5, 1).Select
Range(«C1:D10»).Item(5, 0).Select
Range(«D1:H50»).Item(5, -1).Select
Range(«A17:E15»).Item(-9, 2).Select
Range(«D10:E15»).Item(-4, -1).Select

Range(«B5:B10»)(1).Select
Range(«B5:B10»)(1, 1).Select
Range(«D1:H50»)(5, -1).Select
Range(«A17:E15»)(-9, 2).Select
Range(«D10:E15»)(-4, -1).Select

Range(«B5:B10»).Cells(1).Select
Range(«B5:B10»).Cells(1, 1).Select
Range(«A5:CM5»).Cells(1, 2).Select
Range(«B1:B10»).Cells(5).Select
Range(«B1:B10»).Cells(5, 1).Select
Range(«C1:D10»).Cells(5, 0).Select
Range(«D1:H50»).Cells(5, -1).Select
Range(«A17:E15»).Cells(-9, 2).Select
Range(«D10:E15»).Cells(-4, -1).Select

Range(«B:B»).Item(5).Select
Range(«B:B»).Cells(5).Select
Range(«B:B»).Rows(5).Select
Range(«B:B»).Rows(«5:5»).Select

Range(«5:5»).Item(2).Select
Range(«5:5»).Cells(2).Select
Range(«5:5»).Columns(2).Select
Range(«5:5»).Columns(«B»).Select
Range(«5:5»).Columns(«B:B»).Select

Range(«B:B 5:5»).Select
Range(«B:B» & » » & «5:5»).Select

Range(«B1»).Offset(4).Select
Range(«C1»).Offset(4, -1).Select
Range(«C10»).Offset(-5, -1).Select

[B5:B5].Select
[B5.B5].Select
Range(«B5.B5»).Select
Range(«B5:B5»).Select
Range(«B5:B5:B5»).Select
Range(«B5», «B5»).Select
Range(«$B$5», «$B$5»).Select
Range(«B5», Range(«B5»)).Select
Range(Range(«B5»), «B5»).Select
Range(Range(«B5»), Range(«B5»)).Select

Range(Cells(1026), Cells(1026)).Select
Range(Cells(5, 2), Cells(5, 2)).Select
Range(Cells(5, «B»), Cells(5, «B»)).Select
Range(Cells(5, «B:B»), Cells(5, «B:B»)).Select

Cells(5, 2).Select
Cells(5, «B»).Select
Cells(5, «B:B»).Select
Cells(1026).Select

Rows(5).Cells(2).Select
Rows(5).Columns(2).Select
Rows(5).Columns(«B»).Select
Rows(5).Columns(«B:B»).Select
Rows(«5:5»).Columns(«B»).Select
Rows(«5:5»).Columns(«B:B»).Select

Columns(2).Cells(5).Select
Columns(2).Rows(5).Select
Columns(2).Rows(«5:5»).Select
Columns(«B»).Cells(5).Select
Columns(«B»).Rows(5).Select
Columns(«B»).Rows(«5:5»).Select
Columns(«B:B»).Cells(5).Select
Columns(«B:B»).Rows(5).Select
Columns(«B:B»).Rows(«5:5»).SelectПримечание :

  • — Во всех примерах выделяется ячейка «B5»
  • — Для реализации примера № 3, 6, 13-29 ячейка должна быть именованной (Дата)
    [Как присвоить имя ячейке средствами VBA]
    [Как присвоить имя ячейке стандартными средствами]
  • — Пример № 67 нужно использовать для работы с несмежными ячейками и/или диапазоном.
  • — Примеры № 68-81 нужно использовать для работы с диапазоном ячеек.

    Комментарий : Выделение ячейки используется только для наглядности, в действительности же, реальная необходимость в активации и выделении, возникает крайне редко.


    Ответ :

  • Если известен номер строки, столбца или его буквенное обозначение, то : Rows(2).H >Rows(«3:4»).H >
    Columns(2).H >Columns(«C»).H >Columns(«E:F»).H >
  • Если известен только адрес ячейки, то : Range(«A2»).EntireRow.H >Range(«B3:D4»).EntireRow.H >
    Range(«C3»).EntireColumn.H >Range(«E2:F5»).EntireColumn.H >
  • Для того, чтобы отобразить строку или столбец, нужно изменить значение с True на False
  • Ответ :

    Для того, чтобы добавить целую строку/столбец достаточно использовать метод Insert об’екта Range , т.е. если нам известен номер строки, столбца или его буквенное обозначение, то : Rows(5).Insert
    Range(«5:5»).Insert

    Columns(3).Insert
    Columns(«C»).Insert
    Range(«C:C»).Insert
    Если известен только адрес ячейки, то : Range(«A5»).EntireRow.Insert

    Range(«F1»).EntireColumn.Insert Если же возникнет необходимость в добавлении нескольких строк/столбцов, то в таком случае можно воспользоваться следующим вариантом : Rows(«5:7»).Insert
    Range(«5:7»).Insert

    Columns(«C:D»).Insert
    Range(«C:D»).Insert К сожалению, на практике чаще требуется добавить несколько строк/столбцов относительно некой ячейки, поэтому рекомендую запомнить такой синтаксис, где номер строки и столбца исходной ячейки, а также количество добавляемых строк/столбцов — удобно указывать в виде переменной : Cells(5, 2).EntireRow.Resize(3).Insert

    Cells(10, 5).EntireColumn.Resize(, 3).InsertОбратите внимание на то, что применение свойства Resize , применительно к ячейкам несмежного диапазона, вызовет ошибку, которой можно избежать, если просто использовать цикл.
    Ответ :

    Для того, чтобы добавить строку или столбец в «умную» таблицу (список) достаточно использовать метод Add об’ектов ListRows и ListColumns соответственно. ActiveSheet.ListObjects(1).ListRows.AddActiveSheet.ListObjects(1).ListColumns.AddПримечание : Обратите внимание на две вещи. Во-первых, этот метод возвращает об’ект Range, т.е. Вы можете сразу использовать новую строку/столбец. Во-вторых, этот метод имеет один необязательный аргумент Position, использование которого позволяет указать позицию новой строки/столбца. Например, если указать 1, то новая строка/столбец станет первой, а если указать несуществующую позицию *, то возникнет ошибка. * Position — это число от 1 до кол-во строк/столбцов в «умной» таблице (списке)
    Ответ :iFirstRow = 3: iLastRow = 300

    For iRow = iFirstRow To iLastRow Step 3

    Set iCellOne = Cells(iRow, 1) ‘ Столбец «A»

    If iRow = iFirstRow Then
    Set iCellTwo = Union(iCellOne, iCellOne)
    Else
    Set iCellTwo = Union(iCellOne, iCellTwo)
    End If

    iCellTwo.Select Управляющую инструкцию If Then Else можно заменить на функцию IIf : iFirstRow = 3: iLastRow = 300

    For iRow = iFirstRow To iLastRow Step 3

    Set iCellOne = Cells(iRow, 1) ‘ Столбец «A»
    Set iCellTwo = Union(iCellOne, _
    IIf(iRow = iFirstRow, iCellOne, iCellTwo))

    iCellTwo.Select Иногда, можно обойтись без проверки, например : iFirstRow = 3: iLastRow = 300

    Set iCells = Cells(iFirstRow, 1) ‘ Столбец «A»

    For iRow = iFirstRow To iLastRow Step 3
    Set iCells = Union(iCells, Cells(iRow, 1))
    Next

    iCells.Select

    Set iCells = Cells(3, 1) ‘ Столбец «A»

    For iRow = 6 To 300 Step 3
    Set iCells = Union(iCells, Cells(iRow, 1))
    Next

    iCells.SelectКомментарий : Выделение ячеек используется только для наглядности, в действительности же, реальная необходимость в активации и выделении, возникает весьма редко.

  • Ответ : Вопрос выбран посетителями Application.Goto Reference:=Worksheets(3).Range(«A1») Application.Goto Reference:=Worksheets(«Manager»).Range(«A1»)Используя этот метод, мы также можем выделить диапазон ячеек, в том числе и несмежных : Application.Goto Reference:=Worksheets(3).Range(«A1:C10»)
    Application.Goto Reference:=Worksheets(3).Range(«A1,C3,D5:F10») Application.Goto Reference:=Worksheets(«Manager»).Range(«A1:C10»)
    Application.Goto Reference:=Worksheets(«Manager»).Range(«A1,C3,D5:F10»)Предполагается, что :
  • 3 — это индекс рабочего листа
  • Manager — это имя рабочего листа

    Также допускается выделение ячеек неактивной рабочей книги : Application.Goto _
    Reference:=Workbooks(«Report.xls»).Worksheets(«Sales»).Range(«M13») Application.Goto _
    Reference:=Workbooks(«Report.xls»).Worksheets(1).Range(«M13») Application.Goto _
    Reference:=Workbooks(2).Worksheets(«Sales»).Range(«M13») Application.Goto _
    Reference:=Workbooks(2).Worksheets(1).Range(«M13»)Предполагается, что :

  • 2 — это индекс открытой рабочей книги
  • Report.xls — это имя открытой рабочей книги
  • 1 — это индекс рабочего листа
  • Sales — это имя рабочего листа

    Также допускается выделение именованных ячеек и диапазонов : Application.Goto Reference:=Range(«Дата»)
    Application.Goto «Дата»
    Application.Goto [Дата]
    Application.Goto Reference:=»Дата»
    Application.Goto Reference:=[Дата]Предполагается, что :
    Дата — это имя ячейки или диапазона ячеек уровня рабочей книги

    Для выделения именованных ячеек уровня рабочего листа, необходимо : либо добавить ссылку на рабочий лист, либо указать полное имя Application.Goto _
    Reference:=Worksheets(3).Range(«Дата»)
    Application.Goto _
    Reference:=Worksheets(«Manager»).Range(«Дата»)

    Application.Goto Reference:=Range(«Manager!Дата»)
    Application.Goto [Manager!Дата]
    Application.Goto Reference:=»Manager!Дата»Для выделения именованных ячеек неактивной рабочей книги, нужно добавить ссылку на эту книгу.

    Совет : Используя свойство .PreviousSelections можно узнать диапазон, который был выделен перед применением метода .GoTo
    With Application
    If IsArray(.PreviousSelections) = True Then
    For Each iSelection In .PreviousSelections
    MsgBox iSelection.Address(External:=True)
    Next
    End If
    End With
    Ответ :

    Вариант I. Range(«A1,C5:D10,H15»).SelectВариант II. Union(Range(«A1»), Range(«C5:D10»), Range(«H15»)).SelectКомментарий : Выделение несмежных диапазонов используется исключительно для наглядности, в действительности же, реальная необходимость в активации и выделении, возникает крайне редко.
    Ответ :

    Вариант I. iCountAreas = Selection.Areas.Count
    MsgBox «Количество несмежных ячеек/диапазонов — » & iCountAreas Вариант II. iCountAreas = ExecuteExcel4Macro(«AREAS(SELECTION())»)
    MsgBox «Количество несмежных ячеек/диапазонов — » & iCountAreas Примечание : Не забудьте предварительно проверить является ли выделенный об’ект диапазоном [см. ниже]

    Комментарий : Используя первый способ можно определить количество несмежных ячеек/диапазонов в любом диапазоне, при этом, выделять его специально, конечно же, необязательно.
    Ответ :

    Вариант I. If TypeOf Selection Is Range Then
    MsgBox «Выделен именно об’ект «»Range»»»
    Else
    MsgBox «Выделен : » & TypeName(Selection)
    End IfВариант II. If TypeName(Selection) = «Range» Then
    MsgBox «Выделен именно об’ект «»Range»»»
    Else
    MsgBox «Выделен : » & TypeName(Selection)
    End If
    Ответ :For iRow = 2 To 12
    iSum = iSum + Cells(iRow, 1)
    Next

    MsgBox «Сумма ячеек :» & iSumПредполагается, что :

  • 1 — это столбец «A»
  • iRow — это строки с 2 по 12
  • iSum — это Сумма ячеек

    Примечание : Если в любой ячейке будут данные отличные от числовых, то Вы получите ошибку. Однако об’единив этот пример с одним из предыдущих вопросов можно написать следующий код :
    For iRow = 2 To 12
    ) ‘Cells(iRow, 1)
    If IsNumeric( > iSum = iSum + iData
    End If
    Next
    MsgBox «Сумма ячеек :» & iSumПредполагается, что :

  • «A» — это столбец «A»
  • iRow — это строки с 2 по 12
  • iData — это данные из ячейки

  • iSum — это Сумма ячеек Данный способ подсчёта суммы почти незаменим, если необходимо задать несколько условий проверки : If IsNumeric( Then
  • Ответ :iRangeText = ActiveCell.Text

    iRangeText = Cells(1).Text
    iRangeText = Range(«A1»).Text ‘ и т.д.Примечание : Если существует вероятность, что ширина столбца может повлиять на корректность отображения данных, то в этом случае нужно : With Range(«A1»)
    If Not IsError(.Value) Then
    MsgBox Application.Text(.Value, .NumberFormat)
    Else
    MsgBox «Ячейка содержит значение ошибки»
    End If
    End WithКомментарий : В некоторых случаях * результаты могут различаться.
    Ответ :

    Вариант I-IV. iSelectionAddress = Selection.Address
    iSelectionAddress = Excel.Selection.Address
    iSelectionAddress = Application.Selection.Address
    iSelectionAddress = ActiveWindow.Selection.Address
    MsgBox iSelectionAddress Примечание : Если в момент исполнения будет выделен графический об’ект, то Вы получите ошибку, которую можно избежать, если использовать соответствующую проверку или следующий вариант.

    Вариант V. iSelectionAddress = ActiveWindow.RangeSelection.Address
    MsgBox iSelectionAddressКомментарий : Отличие RangeSelection от Selection заключается в том, что при выделенных графических об’ектах это свойство возвращает диапазон, который был выделен перед выделением графического об’екта.
    Ответ :
    iVisibleRange = ActiveWindow.VisibleRange.Address
    iVisibleRange = Excel.ActiveWindow.VisibleRange.Address
    iVisibleRange = Application.ActiveWindow.VisibleRange.Address

    MsgBox «Сейчас виден, в т.ч. и частично, диапазон : » & iVisibleRange Комментарий : Если активное окно было разделено или имеет закреплённые области (меню Окно ), то вышеприведённое свойство будет применяться только к последней области. Если это недопустимо, то получить весь видимый диапазон можно с помощью нижеопубликованного кода, который, кстати, является универсальным, т.к. его можно использовать в обоих случаях.
    Dim iScreen As Range, iCount%

    With ActiveWindow.Panes
    Set iScreen = .Item(1).VisibleRange
    For iCount = 2 To .Count
    Set iScreen = Union(iScreen, .Item(iCount).VisibleRange)
    Next
    End With

    MsgBox «Сейчас виден, в т.ч. и частично, диапазон : » & iScreen.Address

  • Ответ :iAddress = ActiveCell.Address
    MsgBox iAddressДля того чтобы убрать значение абсолютной ссылки $A$1 на строку и столбец нужно : iAddress = ActiveCell.Address(RowAbsolute:=False, ColumnAbsolute:=False)
  • Ответ :

    Вариант I. With Range(«F5:J153»)
    iF_Address = .Item(1).Address
    iL_Address = .Item(.Count).Address
    End With
    MsgBox «Адрес первой ячейки : » & iF_Address & _
    vbCrLf & «Адрес последней ячейки : » & iL_AddressВариант II. With Range(«B3:Q742»)
    iF_Address = .Cells(1).Address
    iL_Address = .Cells(.Count).Address
    End With
    MsgBox «Адрес первой ячейки : » & iF_Address & _
    vbCrLf & «Адрес последней ячейки : » & iL_Address
    Ответ :iUsedRangeAddress = ActiveSheet.UsedRange.Address
    MsgBox iUsedRangeAddress

    Set iUsedRange = ActiveSheet.UsedRange
    MsgBox iUsedRange.Address

  • Ответ :With ActiveSheet.UsedRange
    iRow = .Row + .Rows.Count — 1
    iClm = .Column + .Columns.Count — 1
    End WithWith Worksheets(1).UsedRange
    iRow = .Row + .Rows.Count — 1
    iClm = .Column + .Columns.Count — 1
    End WithWith Worksheets(«Лист1»).UsedRange
    iRow = .Row + .Rows.Count — 1
    iClm = .Column + .Columns.Count — 1
    End With
    Существуют и другие способы определения последней заполненной ячейки [Подробнее]
    Обратите внимание на следующие инструкции, которые помогут определить количество строк и столбцов в об’екте UsedRange iCountRow = ActiveSheet.UsedRange.Rows.Count
    iCountClm = ActiveSheet.UsedRange.Columns.Count
  • Ответ :

    Вариант I, II, III (исходя из адреса ячейки) iClmIndex = ActiveCell.Column
    iAddress = ActiveCell.Address

    iColumn = Mid(iAddress, 2, IIf(iClmIndex > 26, 2, 1)) iClmIndex = ActiveCell.Column
    iAddress = ActiveCell.Address(RowAbsolute:=False, ColumnAbsolute:=False)

    iColumn = Left(iAddress, IIf(iClmIndex > 26, 2, 1)) iAddress = ActiveCell.EntireColumn.Address(ColumnAbsolute:=False)
    iPosition = InStr(iAddress, «:») — 1

    iColumn = Left(iAddress, iPosition) Вариант IV. (исходя из номера столбца) iClmIndex = ActiveCell.Column

    Select Case iClmIndex
    Case 1 To 26
    iColumn = Chr(64 + iClmIndex)
    Case 27 To 256
    iColumn = Chr(64 + (iClmIndex \ 26)) & _
    Chr(64 + iClmIndex — (iClmIndex \ 26) * 26)
    End Select iClmIndex = ActiveCell.Column

    If iClmIndex Примечание :

  • — Активная ячейка использована исключительно в качестве примера
  • Ответ :

    Вариант I, II, III If IsEmpty(Range(«A1»)) = True Then
    MsgBox «Ячейка пустая»
    Else
    MsgBox «Ячейка непустая»
    End IfIf VarType(Range(«A1»)) = vbEmpty Then
    MsgBox «Ячейка пустая»
    Else
    MsgBox «Ячейка непустая»
    End IfIf TypeName(Range(«A1»).Value) = «Empty» Then
    MsgBox «Ячейка пустая»
    Else
    MsgBox «Ячейка непустая»
    End If

    Совет : Если Вы хотите получить корректный результат проверки, то не используйте сравнение, типа = «» или = Empty, так как ячейка может содержать, например, формулу которая возвращает «»
    Сравнение же с пустой строкой <> «» можно использовать, если Вам необходимо проверить содержит ли ячейка значение, отличное от «»

    Ответ :

    Вариант I. iText = Rows(3).Text
    If iText = «» Then
    MsgBox «Строка пустая»
    Else
    MsgBox «Строка непустая»
    End If Вариант II. iCount = Application.CountA(Rows(5))
    If iCount = 0 Then
    MsgBox «Строка пустая»
    Else
    MsgBox «Строка непустая»
    End If iCount = Application.CountA(Columns(2))
    If iCount = 0 Then
    MsgBox «Столбец пустой»
    Else
    MsgBox «Столбец непустой»
    End If With Worksheets(1).Rows(10)
    iCount = Application.CountA(.Cells)
    If iCount = 0 Then
    MsgBox «Строка № » & .Row & » пустая»
    Else
    MsgBox «Строка № » & .Row & » непустая»
    End If
    End With With Worksheets(1).Columns(3)
    iCount = Application.CountA(.Cells)
    If iCount = 0 Then
    MsgBox «Столбец № » & .Column & » пустой»
    Else
    MsgBox «Столбец № » & .Column & » непустой»
    End If
    End With Вариант III. With Worksheets(1).Rows(1)
    iCount = Application.CountBlank(.Cells)
    If iCount = .Cells.Count Then
    MsgBox «Строка № » & .Row & » пустая»
    Else
    MsgBox «Строка № » & .Row & » непустая»
    End If
    End With With Worksheets(1).Columns(4)
    iCount = Application.CountBlank(.Cells)
    If iCount = .Cells.Count Then
    MsgBox «Столбец № » & .Column & » пустой»
    Else
    MsgBox «Столбец № » & .Column & » непустой»
    End If
    End With Вариант IV. If Rows(4).Find(What:=»*») Is Nothing Then
    MsgBox «Строка пустая»
    Else
    MsgBox «Строка непустая»
    End If If Columns(1).Find(What:=»*») Is Nothing Then
    MsgBox «Столбец пустой»
    Else
    MsgBox «Столбец непустой»
    End If Вариант V. On Error Resume Next

    iCountFormulas = Rows(20).SpecialCells(xlFormulas).Count
    iCountConstants = Rows(20).SpecialCells(xlConstants).Count
    iCountCells = iCountFormulas + iCountConstants

    If iCountCells = 0 Then
    MsgBox «Строка пустая»
    Else
    MsgBox «Строка непустая»
    Еnd If On Error Resume Next

    iCountFormulas = Columns(10).SpecialCells(xlFormulas).Count
    iCountConstants = Columns(10).SpecialCells(xlConstants).Count
    iCountCells = iCountFormulas + iCountConstants

    Выбор ячеек и диапазонов с помощью процедур Visual Basic в Excel

    Корпорация Майкрософт предоставляет примеры программирования только в целях демонстрации без явной или подразумеваемой гарантии. Данное положение включает, но не ограничивается этим, подразумеваемые гарантии товарной пригодности или соответствия отдельной задаче. Эта статья предполагает, что пользователь знаком с представленным языком программирования и средствами, используемыми для создания и отладки процедур. Специалисты службы поддержки Майкрософт могут объяснить возможности конкретной процедуры, но они не изменяют эти примеры, чтобы предоставить дополнительные функции или создать процедуры для удовлетворения конкретных требований. В примерах, приведенных в этой статье, используются методы Visual Basic, приведенные в следующей таблице.

    В примерах, приведенных в этой статье, используются свойства, указанные в таблице ниже.

    Выбор ячейки на активном листе

    Чтобы выбрать ячейку D5 на активном листе, можно использовать любой из следующих примеров:

    Выбор ячейки на другом листе в той же книге

    Чтобы выбрать ячейку E6 на другом листе той же книги, можно использовать любой из следующих примеров:

    Вы также можете активировать лист, а затем использовать метод 1, чтобы выбрать ячейку:

    Выбор ячейки на листе в другой книге

    Чтобы выбрать ячейку F7 на листе в другой книге, можно использовать любой из следующих примеров:

    Вы также можете активировать лист, а затем использовать метод 1, чтобы выбрать ячейку:

    Выбор диапазона ячеек на активном листе

    Чтобы выбрать диапазон C2: D10 на активном листе, можно использовать любой из следующих примеров:

    Выбор диапазона ячеек на другом листе в той же книге

    Чтобы выбрать диапазон D3: E11 на другом листе той же книги, можно использовать любой из следующих примеров:

    Вы также можете активировать лист, а затем использовать способ 4 выше, чтобы выбрать диапазон:

    Выбор диапазона ячеек на листе в другой книге

    Чтобы выбрать диапазон E4: F12 на листе в другой книге, можно использовать любой из следующих примеров:

    Вы также можете активировать лист, а затем использовать способ 4 выше, чтобы выбрать диапазон:

    Выбор именованного диапазона на активном листе

    Чтобы выбрать именованный диапазон «Test» на активном листе, можно использовать любой из следующих примеров:

    Выбор именованного диапазона на другом листе в той же книге

    Чтобы выбрать именованный диапазон «Test» на другом листе той же книги, можно использовать следующий пример:

    Вы также можете активировать лист, а затем использовать метод 7 выше для выбора именованного диапазона:

    Выбор именованного диапазона на листе в другой книге

    Чтобы выбрать именованный диапазон «Test» на листе в другой книге, можно использовать следующий пример:


    Вы также можете активировать лист, а затем использовать метод 7 выше для выбора именованного диапазона:

    Выбор ячейки относительно активной ячейки

    Чтобы выделить ячейку с пятью строками ниже и четырьмя столбцами слева от активной ячейки, можно использовать следующий пример:

    Чтобы выделить ячейку с двумя строками выше и тремя столбцами справа от активной ячейки, можно использовать следующий пример:

    При попытке выбрать ячейку, которая находится в состоянии «не на листе», произойдет ошибка. В первом примере, приведенном выше, возвращается сообщение об ошибке, если активная ячейка находится в столбцах A-D, так как при перемещении четырех столбцов влево активная ячейка будет иметь недопустимый адрес ячейки.

    Выбор ячейки относительно другой (неактивной) ячейки

    Чтобы выделить ячейку с пятью строками ниже и четырьмя столбцами справа от ячейки C7, можно использовать любой из следующих примеров:

    Выбор диапазона смещения ячеек в указанном диапазоне

    Чтобы выбрать диапазон ячеек, размер которых совпадает с именованным диапазоном «Test», но с последующим сдвигом на четыре строки вниз и тремя столбцами вправо, можно использовать следующий пример:

    Если именованный диапазон находится на другом (неактивном) листе, сначала активируйте этот лист, а затем выберите диапазон, используя следующий пример:

    Выбор указанного диапазона и изменение размера выделенного фрагмента

    Для выбора именованного диапазона «Database» и последующего расширения выделенного фрагмента на пять строк можно использовать следующий пример:

    Выбор указанного диапазона, его смещение и изменение его размера

    Чтобы выбрать диапазон четыре строки ниже и три столбца справа от именованного диапазона «база данных» и включить две строки и один столбец больше, чем именованный диапазон, можно использовать следующий пример:

    Выбор объединения двух или более указанных диапазонов

    Чтобы выбрать объединение (то есть область объединения) двух именованных диапазонов «Test» и «Sample», можно использовать следующий пример:

    чтобы этот пример работал, оба диапазона должны находиться на одном листе. Кроме того, обратите внимание на то, что метод Union не работает на разных листах. Например, эта строка работает нормально.

    Возвращает сообщение об ошибке:

    Сбой метода Union класса приложения

    Как выбрать пересечение двух или более указанных диапазонов

    Чтобы выбрать пересечение двух именованных диапазонов «Test» и «Sample», можно использовать следующий пример:

    Обратите внимание, что для работы этого примера оба диапазона должны находиться на одном листе.

    В примерах, описанных в этой статье 17-21, описывается следующий пример набора данных. В каждом примере указывается диапазон ячеек в выбранном образце данных.

    Выбор последней ячейки столбца с непрерывными данными

    Чтобы выбрать последнюю ячейку в непрерывном столбце, используйте следующий пример:

    Если этот код используется с образцом таблицы, будет выбрана ячейка A4.

    Как выделить пустую ячейку в нижней части столбца непрерывных данных

    Чтобы выделить ячейку под диапазоном смежных ячеек, используйте следующий пример:

    Если этот код используется с образцом таблицы, будет выбрана ячейка A5.

    Выбор всего диапазона смежных ячеек в столбце

    Чтобы выбрать диапазон смежных ячеек в столбце, используйте один из следующих примеров:

    Если этот код используется с образцом таблицы, будут выбраны ячейки a1 — A4.

    Выбор всего диапазона несмежных ячеек в столбце

    Чтобы выбрать диапазон ячеек, которые не являются смежными, используйте один из следующих примеров:

    Если этот код используется с образцом таблицы, он выберет ячейки с a1 по A6.

    Выбор прямоугольного диапазона ячеек

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

    В этом коде будут выделены ячейки A1 — C4. В других примерах ниже показано, как выбрать один и тот же диапазон ячеек:

    В некоторых случаях может потребоваться выделить ячейки a1 — C6. В этом примере метод CurrentRegion не будет работать из-за пустой строки на строке 5. В приведенных ниже примерах будут выбраны все ячейки:

    Выбор нескольких несмежных столбцов различной длины

    Чтобы выбрать несколько несмежных столбцов различной длины, используйте следующий пример таблицы и макроса:

    При использовании этого кода с образцом таблицы ячейки a1: A3 и C1: C6 будут выбраны.

    Примечания к примерам

    Обычно свойство Активешит можно опустить, так как оно подразумевает, что конкретный лист не является именем. Например, вместо

    Вы можете использовать следующие компоненты:

    Также можно опустить свойство Активеворкбук. Если не указана конкретная книга, подразумевается активная книга.

    При использовании метода Application. goto, если вы хотите использовать два метода Cell в методе Range, если указанный диапазон находится на другом (неактивном) листе, необходимо включить объект Sheets каждый раз. Пример:

    Для любого элемента в кавычках (например, именованного диапазона «Test») можно также использовать переменную, значение которой является строкой текста. Например, вместо

    Как отменить выбор ячейки Excel с помощью сочетания клавиш?

    Можно выделить несколько ячеек Excel (либо смежно, либо нет) с помощью сочетания клавиш Ctrl + Click.

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

    3 ответа

    Используя клавиши SHIFT и / или CTRL, вы можете выбрать непересекающиеся диапазоны. Однако, если вы выбрали ячейку или область по ошибке, нет встроенного способа удалить это из выделения, не теряя весь выбор и начинать заново. Эта страница описывает процедуры VBA, UnSelectActiveCell и UnSelectCurrentArea, которые удаляют активную ячейку или область, содержащую активную ячейку, из текущий выбор. Все остальные ячейки в списке выбора будут сохранены.

    Лучше всего добавить их в свою личную книгу Macro, чтобы они доступны для всех открытых книг в Excel.

    Эта процедура удалит активную ячейку из выделения .

    Эта процедура удалит область, содержащую активную ячейку, из выделения.


    Более надежный способ отмены выделения нескольких ячеек описан в этом статья ExtendOffice . Он включает дополнительную подсказку, но вы можете отменить выбор произвольного количества ячеек / выборов сразу (вместо отмены выбора только активной ячейки или области)

    Я размещаю скрипт здесь с небольшим улучшением удобства (условно удалив избыточное первое приглашение из исходного сообщения):

    Чтобы использовать его, сделайте выделение, вызовите макрос DeselectCells (который лучше всего сохранить в вашей личной макрокоманде и присвоен ярлыку) и выберите ячейки de выбранный в появившемся всплывающем окне:

    Теперь можно отменить выбор с помощью CTRL ячейки, выбранной по ошибке. Это новая встроенная функция в Office 365 или последние версии. Наконец-то!

    VBA Excel. Выделенный диапазон ячеек (адрес, выбор, строки)

    Определение адреса выделенного диапазона ячеек на листе Excel с помощью кода VBA. Определение номера первой и последней строки. Программное выделение диапазона.

    Адрес выделенного диапазона

    Для определения адреса выделенного диапазона ячеек в VBA Excel используется свойство Address объекта Selection.

    Объект Selection — это совокупность всех выделенных ячеек на листе Excel. Это может быть одна ячейка, смежный или несмежный диапазон ячеек, представляющий совокупность смежных диапазонов. Если выделение состоит из несмежного диапазона, адреса смежных диапазонов, из которых он состоит, будут перечислены через запятую.

    Стоит отметить: несмотря на то, что в выделенном диапазоне может содержаться много ячеек, активной может быть только одна. Она представлена объектом ActiveCell. Для определения ее адреса в коде VBA Excel также используется свойство Address.

    Скопируйте и запустите код на выполнение. В результате получите что-то вроде этого, зависящее от того, какие диапазоны вы выберите:

    Определение адресов выделенного диапазона и активной ячейки

    Выделение ячеек и диапазонов

    Выделить несмежный диапазон ячеек можно следующим образом:

    Как видно из примера, в адресной строке объекта Range перечисляются адреса смежных диапазонов, составляющих общий несмежный диапазон, через запятую. Выделение осуществляется методом Select объекта Range.

    Определение номеров первой и последней строки

    Чтобы вычислить номера первой и последней строки выделенного диапазона, будем исходить из того, что первая ячейка смежного диапазона находится на первой строке, а последняя — на последней строке выделенного диапазона.

    Результат будет таким, зависит от выделенного диапазона:

    Номера первой и последней строки выделенного смежного диапазона

    Таким же образом можно вычислить номера первого и последнего столбцов выделенного диапазона, которые можно использовать для обработки информации по столбцам.

    Обратите внимание, что для несмежных диапазонов этот пример не работает.

    На практике я использовал определение номеров первой и последней строк по выделенному диапазону для формирования файла загрузки данных держателей дисконтных карт на сервис отправки СМС-сообщений. Оказалось, что базу данных клиентов заполнять в таблице Excel намного удобнее, чем на портале сервиса, а для загрузки в сервис достаточно сформировать несложный файл. Заполнил новые строки, выделил их по любому столбцу, нажал кнопку и файл готов.

    Макрос для выборочного выделения ячеек на листе Excel

    В данном примере мы VBA код который позволяет найти и выделить ячейку макросом. Выделение ячеек с учетом нестандартных условий может оказаться весьма непростой задачей в Excel. В этом примере описано как легко решается данный тип задач с использованием макроса.

    Выделение несмежных диапазонов с помощью макроса

    У нас иметься таблица уровней расходов отделов по отношению к расходам труда, произведенного в отдельных отделах за первое полугодие. Часть ячеек, для которых неопределенны показатели содержат значение «нд».

    Нам необходимо экспонировать ячейки, которые содержат значение «нд» выделив их серым цветом заливки фона. В таблице на десятки тысяч строк сложно искать все эти ячейки. А если редактировать каждую ячейку вручную, тогда потребуется много сил и времени. Без условно можно воспользоваться инструментом «Условное форматирование». Но иногда для автоматизированного решения данной задачи лучше написать свой собственный макрос. Дело в том, что несмотря на широкие возможности условного форматирования – макрос является более гибким инструментом. Его потом можно применять разным способом. Ведь в основе его принципа действия лежит выделение ячеек с определенным значением. После того как ознакомившись с нашей версией макроса вы сможете его легко изменять, придавая ему все новые функциональные возможности. В результате чего вас будет ограничивать только высота полета вашей фантазии.

    Откройте редактор: «РАЗРАБОТЧИК»-«Код»-«Visual Basic» (ALT+F11):

    В редакторе создайте новый модуль выбрав инструмент: «Insert»-«Module» и введите в него следующий VBA-код макроса:

    Sub PoiskZnach()
    Dim i As Long
    Dim znach As Variant
    Dim diapaz1 As Range
    Dim diapaz2 As Range
    znach = InputBox( «Введите исходное значение» )
    If znach = «» Then Exit Sub
    If IsNumeric(znach) Then znach = znach * 1
    Set diapaz1 = Application.Intersect(Selection, ActiveSheet.UsedRange)
    If diapaz1 Is Nothing Then
    MsgBox «Сначала выделите диапазон!»
    Exit Sub
    Else
    For i = 1 To diapaz1.Count
    If diapaz1(i) = znach Then
    If diapaz2 Is Nothing Then
    Set diapaz2 = diapaz1(i)
    Else
    Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
    End If
    End If
    Next
    End If
    If diapaz2 Is Nothing Then
    Else
    diapaz2. Select
    End If
    End Sub

    Теперь если мы хотим выделить все ячейки которые содержать значение «нд» в таблице отчета уровня расходов по отделам и присвоить им серый фон, тогда выделите диапазон B2:F12 выберите инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«PoiskZnach»-«Выполнить».

    В результате скачала появиться диалоговое окно, в котором следует ввести исходное значение для поиска «нд» и нажать ОК:

    После чего макрос выполнит все инструкции, описанные в его коде на языке программирования VBA. Он автоматически и самостоятельно выделит все ячейки в выделенном диапазоне, которые содержат значение «нд»:

    Результат автоматического выделения макросом группы ячеек соответствующие критерию поиска.

    В начале кода объявлены 4 переменные:

    1. i – счетчик цикла.
    2. znach – значение которое должна содержать ячейка.
    3. diapaz1 – адрес проверяемого диапазона.
    4. diapaz2 – адрес для несмежного диапазона, соответствующий критериям пользователя.

    Внимание! Понятие несмежный диапазон ячеек подразумевает то, что этот диапазон состоит из нескольких отдельных областей ячеек. Выделение нескольких диапазонов ячеек можно реализовать вручную с нажатой клавишей CTRL на клавиатуре при выделении мышкой разных областей на листе.

    После декларации переменных вызываем окно для ввода критериев поиска необходимого значения и передаем эти же критерии в переменную znach. Сразу в коде описываем инструкцию для проверки на пустые критерии. Если пользователь оставил поле ввода пустым или нажал на кнопку «Отмена», тогда работа макроса будет прервана остановкой с помощью вызова соответствующей инструкции:

    Также проверяется: если пользователь ввел текст похожий на числовое значение, тогда преобразовываем критерий поиска в числовые значения с помощью умножения его на число 1.

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

    1. адрес выделенного диапазона ячеек.
    2. адрес используемого диапазона рабочего листа Excel.

    Внимание! Используемый диапазон рабочего листа получаем с помощью свойства UsedRange. Это адрес диапазона, который охватывает все ячейки с любыми значениями или измененные форматом на текущем рабочем листе Excel:

    Set diapaz1 = Application.Intersect(Selection, ActiveSheet.UsedRange)

    Поэтому если предварительно не был выделен диапазон ячеек в области используемого диапазона рабочего листа Excel, тогда объект для переменной diapaz1 будет пустым (без ссылки). И дальнейшая работа макроса – не возможна. Поэтому следует проверить не является ли пустым объект в переменной diapaz1:

    If diapaz1 Is Nothing Then ‘проверяем пустой ли объект Range в переменной diapaz1

    Если перед выполнением макроса не был выделен диапазон в используемой области листа – объект пустой, тогда выводиться соответствующее сообщение с помощью функции:

    MsgBox «Сначала выделите диапазон!»

    И выполнение кода снова прерывается функцией Exit Sub. Если же пользователь сделал все верно, тогда дальше беспрепятственно выполняется следующая строка в коде макроса.

    В следующей части VBA-макроса создан цикл, внутри которого по очереди все ячейки в диапазоне определенным переменной diapaz1 проверяются на наличие искомого значения:

    For i = 1 To diapaz1.Count
    If diapaz1(i) = znach Then
    If diapaz2 Is Nothing Then
    Set diapaz2 = diapaz1(i)
    Else
    Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
    End If
    End If
    Next

    Если диапазон переменной diapaz1 содержит ячейку с таким же значением, как и в переменной znach, тогда несмежный диапазон ячеек в переменной diapaz2 увеличивается на один адрес для включения этой ячейки. Таким образом несмежный диапазон в переменной diapaz2 включая в себя все адреса найденных ячеек. Реализовывается увеличение несмежного диапазона в переменной diapaz2 с помощью свойства Union, оно позволяет создавать несмежные диапазоны.

    В конце макроса выполняется одно из двух условий: или выделяются все найденные ячейки, или же выводиться сообщение:

    MsgBox «Не найдено исходное значение»

    Макрос для пересчета выделенной области

    Теперь вы самостоятельно можете модифицировать макрос. гибко настраивая его под самые привередливые потребности. Например, добавим новую возможность. Макрос будет сообщать нам о количестве найденных ячеек, соответствующих критерию поиска. Для этого в конце макроса после строки diapaz2.Select следует добавить новую строчку кода:


    MsgBox «Найдено: » & diapaz2.Count & » ячеек!»

    После выполнения макроса и выделения ним ячеек мы будем получать сообщение о их количестве:

    Чтобы макрос умел работать с ключами поиска для многозначных значений (например, звездочка «*» – для всех символов), тогда следует изменить соответствующий оператор в коде. Перейдите на строку макроса №15 где указана инструкция для проверки соответствия значений просматриваемых ячеек в диапазоне со значением переменной znach. Затем измените оператор сравнение на оператор Like:

    If diapaz1(i) Like znach Then

    Теперь после такой модификации кода макроса в критерии поиска можно использовать ключ звездочку «*» (для всех символов). Например, если мы в поле ввода введем значение «н*» макрос будет учитывать все ячейки, значение которых начинается с символа буквы «н».

    В Excel можно использовать только 2 ключа многозначного значения запроса в поиске:

    1. «*» – символ звездочки (любые другие символы).
    2. «?» – вопросительный знак (отдельный символ) например, так:

    Если нужно сделать так, чтобы макрос не был чувствителен к регистру вводимых текстовых символов? Если макрос должен одинаково находит значения не зависимо большая или маленькая буква в критерии поиска и выдавать один и тот же результат? Тогда в строке №15 , где проверяется значение ячейки используйте функцию LCase следующим образом:

    If LCase(diapaz1(i)) Like LCase(znach) Then

    Задача функции LCase замена всех символов в тексте на нижний регистр (маленькие буквы):

    Полная новая версия кода модифицированного макроса для выделения ячеек выглядит так:

    Sub PoiskZnach()
    Dim i As Long
    Dim znach As Variant
    Dim diapaz1 As Range
    Dim diapaz2 As Range
    znach = InputBox( «Введите исходное значение» )
    If znach = «» Then Exit Sub
    If IsNumeric(znach) Then znach = znach * 1
    Set diapaz1 = Application.Intersect(Selection, ActiveSheet.UsedRange)
    If diapaz1 Is Nothing Then
    MsgBox «Сначала выделите диапазон!»
    Exit Sub
    Else
    For i = 1 To diapaz1.Count
    If LCase(diapaz1(i)) Like LCase(znach) Then
    If diapaz2 Is Nothing Then
    Set diapaz2 = diapaz1(i)
    Else
    Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
    End If
    End If
    Next
    End If
    If diapaz2 Is Nothing Then
    MsgBox «Не найдено исходное значение»
    Else
    diapaz2. Select
    MsgBox «Найдено: » & diapaz2.Count & » ячеек!»
    End If
    End Sub

    Изучая возможности языка программирования VBA, вы можете самостоятельно совершенствовать свой макрос подобным способом как приведено в данном примере.

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

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

    Прежде чем изменить значение или формат ячейки или нескольких ячеек, пользователь должен их выделить. Однако в 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 «Невозможно определить тип выделения!»

    Как установить выделение в Nothing при программировании Excel с помощью VBA?

    Когда я создаю график после использования range.copy и range.paste, он оставляет выбранный диапазон палитр, а затем, когда я создаю график несколькими строками позже, он использует выделение в качестве первой серии на графике. Я могу удалить серию, но есть ли более элегантный способ сделать это? Я попробовал

    но это не позволит мне установить выделение. Я также попробовал selection.clear, но это просто очистило последние ячейки, которые были выбраны, и по-прежнему добавили дополнительную серию в сюжет.

    Он перенесет вас в ячейку A1, тем самым отменив существующий выбор.

    тем самым отменив ваш выбор.

    Выберите любую ячейку и выключите cutcopymode.

    Существует способ ВЫБРАТЬ НИЧЕГО, чтобы решить вашу проблему.

    • Создать форму (один прямоугольник)
    • Назовите его в Shapes Database → > например: «Ready»
    • Обратитесь к нему MYDOC.Shapes( «Ready» ) и измените видимость на False

    Если вы хотите, чтобы Excel SELECT NOTHING выполнял это:

    Это СКРЫТЬ выбор и в вашем окне ничего еще не выбран PLUS: Слово «Готов» отображается в левом верхнем углу листа.

    Я не думаю, что это можно сделать. Вот код, скопированный без изменений с сайта Chip Pearson: http://www.cpearson.com/excel/UnSelect.aspx.

    Эта процедура удалит активную ячейку из списка.

    Эта процедура удалит область, содержащую активную ячейку, из выделения.

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

    Application.Goto Range(«B5»)
    Application.Goto Reference:=Range(«B5»)
    Application.Goto Reference:=Range(«Дата»)
    Application.Goto «Дата»
    Application.Goto [Дата]
    Application.Goto Reference:=»Дата»
    Application.Goto Reference:=[Дата]

    Range(Names!Дата).Select
    Range(ThisWorkbook.Names!Дата).Select
    Range(Application.Names!Дата).Select

    Range(Names(«Дата»)).Select
    Range(ThisWorkbook.Names(«Дата»)).Select
    Range(Application.Names(«Дата»)).Select

    Names!Дата.RefersToRange.Select
    ThisWorkbook.Names!Дата.RefersToRange.Select
    Application.Names!Дата.RefersToRange.Select


    Names(«Дата»).RefersToRange.Select
    ThisWorkbook.Names(«Дата»).RefersToRange.Select
    Application.Names(«Дата»).RefersToRange.Select

    Range(«B5:B10»).Item(1).Select
    Range(«B5:B10»).Item(1, 1).Select
    Range(«A5:CM5»).Item(1, 2).Select
    Range(«B1:B10»).Item(5).Select
    Range(«B1:B10»).Item(5, 1).Select
    Range(«C1:D10»).Item(5, 0).Select
    Range(«D1:H50»).Item(5, -1).Select
    Range(«A17:E15»).Item(-9, 2).Select
    Range(«D10:E15»).Item(-4, -1).Select

    Range(«B5:B10»)(1).Select
    Range(«B5:B10»)(1, 1).Select
    Range(«D1:H50»)(5, -1).Select
    Range(«A17:E15»)(-9, 2).Select
    Range(«D10:E15»)(-4, -1).Select

    Range(«B5:B10»).Cells(1).Select
    Range(«B5:B10»).Cells(1, 1).Select
    Range(«A5:CM5»).Cells(1, 2).Select
    Range(«B1:B10»).Cells(5).Select
    Range(«B1:B10»).Cells(5, 1).Select
    Range(«C1:D10»).Cells(5, 0).Select
    Range(«D1:H50»).Cells(5, -1).Select
    Range(«A17:E15»).Cells(-9, 2).Select
    Range(«D10:E15»).Cells(-4, -1).Select

    Range(«B:B»).Item(5).Select
    Range(«B:B»).Cells(5).Select
    Range(«B:B»).Rows(5).Select
    Range(«B:B»).Rows(«5:5»).Select

    Range(«5:5»).Item(2).Select
    Range(«5:5»).Cells(2).Select
    Range(«5:5»).Columns(2).Select
    Range(«5:5»).Columns(«B»).Select
    Range(«5:5»).Columns(«B:B»).Select

    Range(«B:B 5:5»).Select
    Range(«B:B» & » » & «5:5»).Select

    Range(«B1»).Offset(4).Select
    Range(«C1»).Offset(4, -1).Select
    Range(«C10»).Offset(-5, -1).Select

    [B5:B5].Select
    [B5.B5].Select
    Range(«B5.B5»).Select
    Range(«B5:B5»).Select
    Range(«B5:B5:B5»).Select
    Range(«B5», «B5»).Select
    Range(«$B$5», «$B$5»).Select
    Range(«B5», Range(«B5»)).Select
    Range(Range(«B5»), «B5»).Select
    Range(Range(«B5»), Range(«B5»)).Select

    Range(Cells(1026), Cells(1026)).Select
    Range(Cells(5, 2), Cells(5, 2)).Select
    Range(Cells(5, «B»), Cells(5, «B»)).Select
    Range(Cells(5, «B:B»), Cells(5, «B:B»)).Select

    Cells(5, 2).Select
    Cells(5, «B»).Select
    Cells(5, «B:B»).Select
    Cells(1026).Select

    Rows(5).Cells(2).Select
    Rows(5).Columns(2).Select
    Rows(5).Columns(«B»).Select
    Rows(5).Columns(«B:B»).Select
    Rows(«5:5»).Columns(«B»).Select
    Rows(«5:5»).Columns(«B:B»).Select

    Columns(2).Cells(5).Select
    Columns(2).Rows(5).Select
    Columns(2).Rows(«5:5»).Select
    Columns(«B»).Cells(5).Select
    Columns(«B»).Rows(5).Select
    Columns(«B»).Rows(«5:5»).Select
    Columns(«B:B»).Cells(5).Select
    Columns(«B:B»).Rows(5).Select
    Columns(«B:B»).Rows(«5:5»).SelectПримечание :

  • — Во всех примерах выделяется ячейка «B5»
  • — Для реализации примера № 3, 6, 13-29 ячейка должна быть именованной (Дата)
    [Как присвоить имя ячейке средствами VBA]
    [Как присвоить имя ячейке стандартными средствами]
  • — Пример № 67 нужно использовать для работы с несмежными ячейками и/или диапазоном.
  • — Примеры № 68-81 нужно использовать для работы с диапазоном ячеек.

    Комментарий : Выделение ячейки используется только для наглядности, в действительности же, реальная необходимость в активации и выделении, возникает крайне редко.
    Ответ :

  • Если известен номер строки, столбца или его буквенное обозначение, то : Rows(2).H >Rows(«3:4»).H >
    Columns(2).H >Columns(«C»).H >Columns(«E:F»).H >
  • Если известен только адрес ячейки, то : Range(«A2»).EntireRow.H >Range(«B3:D4»).EntireRow.H >
    Range(«C3»).EntireColumn.H >Range(«E2:F5»).EntireColumn.H >
  • Для того, чтобы отобразить строку или столбец, нужно изменить значение с True на False
  • Ответ :

    Для того, чтобы добавить целую строку/столбец достаточно использовать метод Insert об’екта Range , т.е. если нам известен номер строки, столбца или его буквенное обозначение, то : Rows(5).Insert
    Range(«5:5»).Insert

    Columns(3).Insert
    Columns(«C»).Insert
    Range(«C:C»).Insert
    Если известен только адрес ячейки, то : Range(«A5»).EntireRow.Insert

    Range(«F1»).EntireColumn.Insert Если же возникнет необходимость в добавлении нескольких строк/столбцов, то в таком случае можно воспользоваться следующим вариантом : Rows(«5:7»).Insert
    Range(«5:7»).Insert

    Columns(«C:D»).Insert
    Range(«C:D»).Insert К сожалению, на практике чаще требуется добавить несколько строк/столбцов относительно некой ячейки, поэтому рекомендую запомнить такой синтаксис, где номер строки и столбца исходной ячейки, а также количество добавляемых строк/столбцов — удобно указывать в виде переменной : Cells(5, 2).EntireRow.Resize(3).Insert

    Cells(10, 5).EntireColumn.Resize(, 3).InsertОбратите внимание на то, что применение свойства Resize , применительно к ячейкам несмежного диапазона, вызовет ошибку, которой можно избежать, если просто использовать цикл.
    Ответ :

    Для того, чтобы добавить строку или столбец в «умную» таблицу (список) достаточно использовать метод Add об’ектов ListRows и ListColumns соответственно. ActiveSheet.ListObjects(1).ListRows.AddActiveSheet.ListObjects(1).ListColumns.AddПримечание : Обратите внимание на две вещи. Во-первых, этот метод возвращает об’ект Range, т.е. Вы можете сразу использовать новую строку/столбец. Во-вторых, этот метод имеет один необязательный аргумент Position, использование которого позволяет указать позицию новой строки/столбца. Например, если указать 1, то новая строка/столбец станет первой, а если указать несуществующую позицию *, то возникнет ошибка. * Position — это число от 1 до кол-во строк/столбцов в «умной» таблице (списке)
    Ответ :iFirstRow = 3: iLastRow = 300

    For iRow = iFirstRow To iLastRow Step 3

    Set iCellOne = Cells(iRow, 1) ‘ Столбец «A»

    If iRow = iFirstRow Then
    Set iCellTwo = Union(iCellOne, iCellOne)
    Else
    Set iCellTwo = Union(iCellOne, iCellTwo)
    End If

    iCellTwo.Select Управляющую инструкцию If Then Else можно заменить на функцию IIf : iFirstRow = 3: iLastRow = 300

    For iRow = iFirstRow To iLastRow Step 3

    Set iCellOne = Cells(iRow, 1) ‘ Столбец «A»
    Set iCellTwo = Union(iCellOne, _
    IIf(iRow = iFirstRow, iCellOne, iCellTwo))

    iCellTwo.Select Иногда, можно обойтись без проверки, например : iFirstRow = 3: iLastRow = 300

    Set iCells = Cells(iFirstRow, 1) ‘ Столбец «A»

    For iRow = iFirstRow To iLastRow Step 3
    Set iCells = Union(iCells, Cells(iRow, 1))
    Next

    iCells.Select

    Set iCells = Cells(3, 1) ‘ Столбец «A»

    For iRow = 6 To 300 Step 3
    Set iCells = Union(iCells, Cells(iRow, 1))
    Next

    iCells.SelectКомментарий : Выделение ячеек используется только для наглядности, в действительности же, реальная необходимость в активации и выделении, возникает весьма редко.

  • Ответ : Вопрос выбран посетителями Application.Goto Reference:=Worksheets(3).Range(«A1») Application.Goto Reference:=Worksheets(«Manager»).Range(«A1»)Используя этот метод, мы также можем выделить диапазон ячеек, в том числе и несмежных : Application.Goto Reference:=Worksheets(3).Range(«A1:C10»)
    Application.Goto Reference:=Worksheets(3).Range(«A1,C3,D5:F10») Application.Goto Reference:=Worksheets(«Manager»).Range(«A1:C10»)
    Application.Goto Reference:=Worksheets(«Manager»).Range(«A1,C3,D5:F10»)Предполагается, что :
  • 3 — это индекс рабочего листа
  • Manager — это имя рабочего листа

    Также допускается выделение ячеек неактивной рабочей книги : Application.Goto _
    Reference:=Workbooks(«Report.xls»).Worksheets(«Sales»).Range(«M13») Application.Goto _
    Reference:=Workbooks(«Report.xls»).Worksheets(1).Range(«M13») Application.Goto _
    Reference:=Workbooks(2).Worksheets(«Sales»).Range(«M13») Application.Goto _
    Reference:=Workbooks(2).Worksheets(1).Range(«M13»)Предполагается, что :

  • 2 — это индекс открытой рабочей книги
  • Report.xls — это имя открытой рабочей книги
  • 1 — это индекс рабочего листа
  • Sales — это имя рабочего листа

    Также допускается выделение именованных ячеек и диапазонов : Application.Goto Reference:=Range(«Дата»)
    Application.Goto «Дата»
    Application.Goto [Дата]
    Application.Goto Reference:=»Дата»
    Application.Goto Reference:=[Дата]Предполагается, что :
    Дата — это имя ячейки или диапазона ячеек уровня рабочей книги

    Для выделения именованных ячеек уровня рабочего листа, необходимо : либо добавить ссылку на рабочий лист, либо указать полное имя Application.Goto _
    Reference:=Worksheets(3).Range(«Дата»)
    Application.Goto _
    Reference:=Worksheets(«Manager»).Range(«Дата»)


    Application.Goto Reference:=Range(«Manager!Дата»)
    Application.Goto [Manager!Дата]
    Application.Goto Reference:=»Manager!Дата»Для выделения именованных ячеек неактивной рабочей книги, нужно добавить ссылку на эту книгу.

    Совет : Используя свойство .PreviousSelections можно узнать диапазон, который был выделен перед применением метода .GoTo
    With Application
    If IsArray(.PreviousSelections) = True Then
    For Each iSelection In .PreviousSelections
    MsgBox iSelection.Address(External:=True)
    Next
    End If
    End With
    Ответ :

    Вариант I. Range(«A1,C5:D10,H15»).SelectВариант II. Union(Range(«A1»), Range(«C5:D10»), Range(«H15»)).SelectКомментарий : Выделение несмежных диапазонов используется исключительно для наглядности, в действительности же, реальная необходимость в активации и выделении, возникает крайне редко.
    Ответ :

    Вариант I. iCountAreas = Selection.Areas.Count
    MsgBox «Количество несмежных ячеек/диапазонов — » & iCountAreas Вариант II. iCountAreas = ExecuteExcel4Macro(«AREAS(SELECTION())»)
    MsgBox «Количество несмежных ячеек/диапазонов — » & iCountAreas Примечание : Не забудьте предварительно проверить является ли выделенный об’ект диапазоном [см. ниже]

    Комментарий : Используя первый способ можно определить количество несмежных ячеек/диапазонов в любом диапазоне, при этом, выделять его специально, конечно же, необязательно.
    Ответ :

    Вариант I. If TypeOf Selection Is Range Then
    MsgBox «Выделен именно об’ект «»Range»»»
    Else
    MsgBox «Выделен : » & TypeName(Selection)
    End IfВариант II. If TypeName(Selection) = «Range» Then
    MsgBox «Выделен именно об’ект «»Range»»»
    Else
    MsgBox «Выделен : » & TypeName(Selection)
    End If
    Ответ :For iRow = 2 To 12
    iSum = iSum + Cells(iRow, 1)
    Next

    MsgBox «Сумма ячеек :» & iSumПредполагается, что :

  • 1 — это столбец «A»
  • iRow — это строки с 2 по 12
  • iSum — это Сумма ячеек

    Примечание : Если в любой ячейке будут данные отличные от числовых, то Вы получите ошибку. Однако об’единив этот пример с одним из предыдущих вопросов можно написать следующий код :
    For iRow = 2 To 12
    ) ‘Cells(iRow, 1)
    If IsNumeric( > iSum = iSum + iData
    End If
    Next
    MsgBox «Сумма ячеек :» & iSumПредполагается, что :

  • «A» — это столбец «A»
  • iRow — это строки с 2 по 12
  • iData — это данные из ячейки
  • iSum — это Сумма ячеек Данный способ подсчёта суммы почти незаменим, если необходимо задать несколько условий проверки : If IsNumeric( Then
  • Ответ :iRangeText = ActiveCell.Text

    iRangeText = Cells(1).Text
    iRangeText = Range(«A1»).Text ‘ и т.д.Примечание : Если существует вероятность, что ширина столбца может повлиять на корректность отображения данных, то в этом случае нужно : With Range(«A1»)
    If Not IsError(.Value) Then
    MsgBox Application.Text(.Value, .NumberFormat)
    Else
    MsgBox «Ячейка содержит значение ошибки»
    End If
    End WithКомментарий : В некоторых случаях * результаты могут различаться.
    Ответ :

    Вариант I-IV. iSelectionAddress = Selection.Address
    iSelectionAddress = Excel.Selection.Address
    iSelectionAddress = Application.Selection.Address
    iSelectionAddress = ActiveWindow.Selection.Address
    MsgBox iSelectionAddress Примечание : Если в момент исполнения будет выделен графический об’ект, то Вы получите ошибку, которую можно избежать, если использовать соответствующую проверку или следующий вариант.

    Вариант V. iSelectionAddress = ActiveWindow.RangeSelection.Address
    MsgBox iSelectionAddressКомментарий : Отличие RangeSelection от Selection заключается в том, что при выделенных графических об’ектах это свойство возвращает диапазон, который был выделен перед выделением графического об’екта.
    Ответ :
    iVisibleRange = ActiveWindow.VisibleRange.Address
    iVisibleRange = Excel.ActiveWindow.VisibleRange.Address
    iVisibleRange = Application.ActiveWindow.VisibleRange.Address

    MsgBox «Сейчас виден, в т.ч. и частично, диапазон : » & iVisibleRange Комментарий : Если активное окно было разделено или имеет закреплённые области (меню Окно ), то вышеприведённое свойство будет применяться только к последней области. Если это недопустимо, то получить весь видимый диапазон можно с помощью нижеопубликованного кода, который, кстати, является универсальным, т.к. его можно использовать в обоих случаях.
    Dim iScreen As Range, iCount%

    With ActiveWindow.Panes
    Set iScreen = .Item(1).VisibleRange
    For iCount = 2 To .Count
    Set iScreen = Union(iScreen, .Item(iCount).VisibleRange)
    Next
    End With

    MsgBox «Сейчас виден, в т.ч. и частично, диапазон : » & iScreen.Address

  • Ответ :iAddress = ActiveCell.Address
    MsgBox iAddressДля того чтобы убрать значение абсолютной ссылки $A$1 на строку и столбец нужно : iAddress = ActiveCell.Address(RowAbsolute:=False, ColumnAbsolute:=False)
  • Ответ :

    Вариант I. With Range(«F5:J153»)
    iF_Address = .Item(1).Address
    iL_Address = .Item(.Count).Address
    End With
    MsgBox «Адрес первой ячейки : » & iF_Address & _
    vbCrLf & «Адрес последней ячейки : » & iL_AddressВариант II. With Range(«B3:Q742»)
    iF_Address = .Cells(1).Address
    iL_Address = .Cells(.Count).Address
    End With
    MsgBox «Адрес первой ячейки : » & iF_Address & _
    vbCrLf & «Адрес последней ячейки : » & iL_Address
    Ответ :iUsedRangeAddress = ActiveSheet.UsedRange.Address
    MsgBox iUsedRangeAddress

    Set iUsedRange = ActiveSheet.UsedRange
    MsgBox iUsedRange.Address

  • Ответ :With ActiveSheet.UsedRange
    iRow = .Row + .Rows.Count — 1
    iClm = .Column + .Columns.Count — 1
    End WithWith Worksheets(1).UsedRange
    iRow = .Row + .Rows.Count — 1
    iClm = .Column + .Columns.Count — 1
    End WithWith Worksheets(«Лист1»).UsedRange
    iRow = .Row + .Rows.Count — 1
    iClm = .Column + .Columns.Count — 1
    End With
    Существуют и другие способы определения последней заполненной ячейки [Подробнее]
    Обратите внимание на следующие инструкции, которые помогут определить количество строк и столбцов в об’екте UsedRange iCountRow = ActiveSheet.UsedRange.Rows.Count
    iCountClm = ActiveSheet.UsedRange.Columns.Count
  • Ответ :

    Вариант I, II, III (исходя из адреса ячейки) iClmIndex = ActiveCell.Column
    iAddress = ActiveCell.Address

    iColumn = Mid(iAddress, 2, IIf(iClmIndex > 26, 2, 1)) iClmIndex = ActiveCell.Column
    iAddress = ActiveCell.Address(RowAbsolute:=False, ColumnAbsolute:=False)

    iColumn = Left(iAddress, IIf(iClmIndex > 26, 2, 1)) iAddress = ActiveCell.EntireColumn.Address(ColumnAbsolute:=False)
    iPosition = InStr(iAddress, «:») — 1

    iColumn = Left(iAddress, iPosition) Вариант IV. (исходя из номера столбца) iClmIndex = ActiveCell.Column

    Select Case iClmIndex
    Case 1 To 26
    iColumn = Chr(64 + iClmIndex)
    Case 27 To 256
    iColumn = Chr(64 + (iClmIndex \ 26)) & _
    Chr(64 + iClmIndex — (iClmIndex \ 26) * 26)
    End Select iClmIndex = ActiveCell.Column

    If iClmIndex Примечание :

  • — Активная ячейка использована исключительно в качестве примера
  • Ответ :

    Вариант I, II, III If IsEmpty(Range(«A1»)) = True Then
    MsgBox «Ячейка пустая»
    Else
    MsgBox «Ячейка непустая»
    End IfIf VarType(Range(«A1»)) = vbEmpty Then
    MsgBox «Ячейка пустая»
    Else
    MsgBox «Ячейка непустая»
    End IfIf TypeName(Range(«A1»).Value) = «Empty» Then
    MsgBox «Ячейка пустая»
    Else
    MsgBox «Ячейка непустая»
    End If

    Совет : Если Вы хотите получить корректный результат проверки, то не используйте сравнение, типа = «» или = Empty, так как ячейка может содержать, например, формулу которая возвращает «»
    Сравнение же с пустой строкой <> «» можно использовать, если Вам необходимо проверить содержит ли ячейка значение, отличное от «»

    Ответ :

    Вариант I. iText = Rows(3).Text
    If iText = «» Then
    MsgBox «Строка пустая»
    Else
    MsgBox «Строка непустая»
    End If Вариант II. iCount = Application.CountA(Rows(5))
    If iCount = 0 Then
    MsgBox «Строка пустая»
    Else
    MsgBox «Строка непустая»
    End If iCount = Application.CountA(Columns(2))
    If iCount = 0 Then
    MsgBox «Столбец пустой»
    Else
    MsgBox «Столбец непустой»
    End If With Worksheets(1).Rows(10)
    iCount = Application.CountA(.Cells)
    If iCount = 0 Then
    MsgBox «Строка № » & .Row & » пустая»
    Else
    MsgBox «Строка № » & .Row & » непустая»
    End If
    End With With Worksheets(1).Columns(3)
    iCount = Application.CountA(.Cells)
    If iCount = 0 Then
    MsgBox «Столбец № » & .Column & » пустой»
    Else
    MsgBox «Столбец № » & .Column & » непустой»
    End If
    End With Вариант III. With Worksheets(1).Rows(1)
    iCount = Application.CountBlank(.Cells)
    If iCount = .Cells.Count Then
    MsgBox «Строка № » & .Row & » пустая»
    Else
    MsgBox «Строка № » & .Row & » непустая»
    End If
    End With With Worksheets(1).Columns(4)
    iCount = Application.CountBlank(.Cells)
    If iCount = .Cells.Count Then
    MsgBox «Столбец № » & .Column & » пустой»
    Else
    MsgBox «Столбец № » & .Column & » непустой»
    End If
    End With Вариант IV. If Rows(4).Find(What:=»*») Is Nothing Then
    MsgBox «Строка пустая»
    Else
    MsgBox «Строка непустая»
    End If If Columns(1).Find(What:=»*») Is Nothing Then
    MsgBox «Столбец пустой»
    Else
    MsgBox «Столбец непустой»
    End If Вариант V. On Error Resume Next

    iCountFormulas = Rows(20).SpecialCells(xlFormulas).Count
    iCountConstants = Rows(20).SpecialCells(xlConstants).Count
    iCountCells = iCountFormulas + iCountConstants

    If iCountCells = 0 Then
    MsgBox «Строка пустая»
    Else
    MsgBox «Строка непустая»
    Еnd If On Error Resume Next

    iCountFormulas = Columns(10).SpecialCells(xlFormulas).Count
    iCountConstants = Columns(10).SpecialCells(xlConstants).Count
    iCountCells = iCountFormulas + iCountConstants

    EXCEL-VBA Как отменить выбор столбца из диапазона?

    Я написал макрос, который отсортирован мой стол и удалил повторяющиеся строки так:

    Как вы можете видеть, « test1 строка» дублируется , поскольку й Macro считает , что по — другому из — за даты, которая не является тем же самым . Существует одна строка «test1» с 30/03/2020 , а другой с 27/03/2020

    Как я могу сделать мой макрос игнорировать столбец Дата создания Дата размещения (только этот столбец) , чтобы объединить test1 (27/03/2020) с test1 (30/03/2020) .. которые принимают большее значение даты .

    В этот момент мой макрос:

    (Моя таблица начинается в «B3»)

    Вы можете отсортировать данные в порядке убывания даты, а затем удалить дубликаты на основе первых трех столбцов.

    Проверьте, если этот код делает то, что вы хотите.

    На простом языке: если выбранная ячейка имеет то же значение, что и одна над ней, он проверяет дату в столбце D. Если дата в текущей строке более поздняя дата в драгоценной строке изменяется. Независимо от результатов этого теста, текущая строка удаляется, если он имеет то же самое значение в колонке А, как один над ним.

    Илон Маск рекомендует:  Что такое код ini_restore
  • Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL