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


Содержание

Чтение и запись значения ячейки в VBA

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

Обращение к конкретной ячейке

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

Полный путь к ячейке A1 в Книге1 на Листе1 можно записать двумя вариантами:

  • С помощью Range
  • С помощью Cells

Пример 1: Обратиться к ячейке A3 находящейся в Книге1 на Листе1

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

Пример 2: Обратиться к ячейке A1 в текущей книге на активном листе

Если всё же путь к книге или листу необходим, но не хочется его писать при каждом обращении к ячейкам, можно использовать конструкцию With End With. При этом, обращаясь к ячейкам, необходимо использовать в начале «.» (точку).

Пример 3: Обратиться к ячейке A1 и B1 в Книге1 на Листе2.

Так же, можно обратиться и к активной (выбранной в данный момент времени) ячейке.

Пример 4: Обратиться к активной ячейке на Листе3 текущей книги.

Чтение значения из ячейки

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

  • Value2 — базовое значение ячейки, т.е. как оно хранится в самом Excel-е. В связи с чем, например, дата будет прочтена как число от 1 до 2958466, а время будет прочитано как дробное число. Value2 — самый быстрый способ чтения значения, т.к. не происходит никаких преобразований.
  • Value — значение ячейки, приведенное к типу ячейки. Если ячейка хранит дату, будет приведено к типу Date. Если ячейка отформатирована как валюта, будет преобразована к типу Currency (в связи с чем, знаки с 5-го и далее будут усечены).
  • Text — визуальное отображение значения ячейки. Например, если ячейка, содержит дату в виде «число месяц прописью год», то Text (в отличие от Value и Value2) именно в таком виде и вернет значение. Использовать Text нужно осторожно, т.к., если, например, значение не входит в ячейку и отображается в виде «#####» то Text вернет вам не само значение, а эти самые «решетки».

По-умолчанию, если при обращении к ячейке не указывать способ чтения значения, то используется способ Value.

Пример 5: В ячейке A1 активного листа находится дата 01.03.2020. Для ячейки выбран формат «14 марта 2001 г.». Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.

Пример 6: В ячейке С1 активного листа находится значение 123,456789. Для ячейки выбран формат «Денежный» с 3 десятичными знаками. Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.

При присвоении значения переменной или элементу массива, необходимо учитывать тип переменной. Например, если оператором Dim задан тип Integer, а в ячейке находится текст, при выполнении произойдет ошибка «Type mismatch». Как определить тип значения в ячейке, рассказано в следующей статье.

Пример 7: В ячейке B1 активного листа находится текст. Прочитать значение ячейки в переменную.

Таким образом, разница между Text, Value и Value2 в способе получения значения. Очевидно, что Value2 наиболее предпочтителен, но при преобразовании даты в текст (например, чтобы показать значение пользователю), нужно использовать функцию Format.

Запись значения в ячейку

Осуществить запись значения в ячейку можно 2 способами: с помощью Value и Value2. Использование Text для записи значения не возможно, т.к. это свойство только для чтения.

Пример 8: Записать в ячейку A1 активного листа значение 123,45

Все три строки запишут в A1 одно и то же значение.

Пример 9: Записать в ячейку A2 активного листа дату 1 марта 2020 года

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

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

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
  • Илон Маск рекомендует:  Что такое код postappmessage
  • Ответ :

    Вариант 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

    11.6 Объект Range, его свойства и методы

    Объект Excel.Range, программная работа с ячейками и диапазонами (наборами) ячеек средствами VBA, создание объекта Excel.Range, свойства, методы и события объекта Excel.Range

    Пожалуй, наиболее часто используемый объект в иерархии объектной модели Excel — это объект Range. Этот объект может представлять одну ячейку, несколько ячеек (в том числе несмежные ячейки или наборы несмежных ячеек) или целый лист. Если в Word вы могли для ввода данных использовать как объект Range, так и объект Selection, то в Excel все сводится к объекту Range:

    • если вам нужно ввести данные в ячейку или отформатировать ее, то вы должны получить объект Range, представляющий эту ячейку;
    • если вы хотите сделать что-то с выделенными вами ячейками, вам необходимо получить объект Range, представляющий выделение;
    • если вам нужно просто что-то сделать с группой ячеек, первое ваше действие — опять-таки получить объект Range, представляющий эту группу ячеек.

    В Microsoft Knowledge Base есть статья под номером 291308, в котором описываются 22 способа получения объекта Range в Excel. Вряд ли вы будете пользоваться всеми эти способами. Мы рассмотрим только самые распространенные:

    • самый простой и очевидный способ — воспользоваться свойством Range. Это свойство предусмотрено для объектов Application, Worksheet и самого объекта Range (если вы решили создать новый диапазон на основе уже существующего). Например, получить ссылку на объект Range, представляющий ячейку A1, можно так:

    Dim oRange As Range

    Set oRange = Worksheets(«Лист1»).Range(«A1»)

    А на диапазон ячеек с A1 по D10 — так:

    Dim oRange As Range

    Set oRange = Worksheets(«Лист1»).Range(«A1:D10»)

    С применением свойства Range самого объекта Range нужно быть очень осторожным. Дело в том, что Excel создает на основе объекта Range виртуальный лист со своей собственной нумерацией. Поэтому такой код:

    Set oRange1 = Worksheets(«Лист1»).Range(«C1»)

    Set oRange2 = oRange1.Range(«B1»)

    пропишет значение 20 не в ячейку B1, как можно было понять из кода, а в ячейку D1 (то есть B1 по отношению к виртуальному листу, начинающемуся с C1).

    • второй способ — воспользоваться свойством Cells. Возможностей у этого свойства меньше — мы можем вернуть диапазон, состоящий только из одной ячейки. Зато мы можем использовать более удобный синтаксис (с точки зрения передачи переменных, перехода в любую сторону на любое количество ячеек и т.п.). Например, для получения ссылки на ячейку D1 можно использовать код вида:

    Dim oRange As Range

    Set oRange = Worksheets(«Лист1»).Cells(1, 4)

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

    Set oRange = Range(Cells(1, 1), Cells(5, 3))

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


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

    oRange.Value = «Мое значение»

    Поскольку объект Range с функциональной точки зрения очень важен, то свойств и методов у него очень много (и для комфортной работы в Excel их нужно знать). Ниже представлены некоторые самые употребимые свойства:

    • Address — позволяет вернуть адрес текущего диапазона, например, для предыдущего примера вернется $A$1:$C$5. Этому свойству можно передать много параметров — для определения стиля ссылки, абсолютного или относительного адреса для столбцов и строк, по отношению к чему этот адрес будет относительным и т.п. Свойство доступно только для чтения. AddressLocal — то же самое, но с поправкой на особенности локализованных версий Excel.

    На практике встречается множество ситуаций, когда адрес ячейки нужно разобрать на части и вернуть из него имя столбца или номер строки. Это очень просто сделать при помощи строковых функций — спасибо знакам доллара. Например, имя столбца для объекта oRange, представляющего одну ячейку, можно вернуть так:

    sColumnName = Mid(oRange.Address, 2, (InStr(2, oRange.Address, «$») — 2))

    sRowNumber = Mid(oRange.Address, (InStr(2, oRange.Address, «$») + 1))

    На первый взгляд кажется сложным, но на самом деле все очень просто — для имени столбца мы просто берем все, что у нас находится между первым знаком доллара (он у нас всегда первый символ) и вторым, а для номера строки бы берем все, что у нас находится после второго знака доллара. Найти этот второй знак доллара можно при помощи встроенной функции InStr(), а взять нужное количество символов начиная с какого либо проще всего при помощи встроенной функции Mid().

    • AllowEdit — это свойство, доступное только для чтения, позволяет определить, сможет ли пользователь править данную ячейку (набор ячеек) на защищенном листе. Используется для проверок.
    • Areas — свойство исключительно важное. Дело в том, что, как уже говорилось, объект Range может состоять из несмежных наборов ячеек. Многие методы применительно к таким диапазонам ведут себя совершенно непредсказуемо или просто возвращают ошибки. Свойство Areas позволяет разбить подобные нестандартные диапазоны на набор стандартных. Созданные таким образом объекты Range будут помещены в коллекцию Areas. Это свойство можно использовать и для проверки «нестандартности» диапазона:

    If Selection.Areas.Count > 1 Then

    Debug.Print «Диапазон с несмежными областями»

    • Borders — возможность получить ссылку на коллекцию Borders, при помощи которой можно управлять рамками для нашего диапазона.
    • Cells — это свойство есть и для объекта Range. Работает оно точно так же, за исключением того, что опять-таки используется своя собственная виртуальная адресация на основе диапазона:

    Dim oRange, oRange2 As Range

    Set oRange = Range(Cells(2, 2), Cells(5, 3))

    Set oRange2 = oRange.Cells(1, 1) ‘Вместо A1 получаем ссылку на B2

    Debug.Print oRange2.Address ‘Так оно и есть

    Точно такие же особенности у свойств Row и Rows, Column и Columns.

    • Characters — это простое с виду свойство позволяет решить непростую задачу: как изменить (текст или формат) части текста в ячейке, не затрагивая остальные данные. Например, чтобы ввести текст в ячейку A1 и изменить цвет первой буквы, можно воспользоваться кодом

    Dim oRange As Range

    Set oRange = Range(«A1»)

    oRange.Value = «Мой текст»

    oRange.Characters(1, 1).Font.Color = vbRed

    Если же вам просто нужно изменить значение, то лучше воспользоваться свойством Value — как в третьей строке примера.

    • Count — возвращает количество ячеек в диапазоне. Может использоваться для проверок.
    • CurrentRegion — очень удобное свойство, которое может пригодиться, например, при копировании/экспорте данных, полученных из внешнего источника (когда сколько будет этих данных, нам изначально неизвестно). Оно возвращает объект Range, представляющий диапазон, окруженный пустыми ячейками (то есть непустую область, в которую входит исходный диапазон/ячейка). Например, чтобы выделить всю непустую область вокруг активной ячейки, можно воспользоваться кодом
    • Dependents — позволяет получить объект Range (скорее всего, включающий несмежные области) которые зависят от ячеек исходного диапазона. Работает только для текущего листа — ссылки во внешних листах этим свойством не отслеживаются. Например, чтобы выделить все ячейки, зависимые от активной, можно использовать код
    • Worksheets(«Лист1»).Activate
    • ActiveCell.Dependents.Select

    Чтобы просмотреть обратную зависимость, можно использовать свойство Precedents. Чтобы просмотреть только первый уровень зависимостей, можно использовать свойства DirectDependents и DirectPrecedents.

    • End — еще одно часто используемое свойство. Оно позволяет получить объект Range, представляющий последнюю ячейку исходного диапазона. В какой стороне будет считаться последняя ячейка, можно определить при помощи передаваемого параметра.
    • Errors — свойство, которое через коллекцию Errors позволяет получить доступ к объектам Error, представляющим обнаруженные ошибки в диапазоне.
    • Font — как и в Word, это свойство позволяет получить доступ к объекту Font, при помощи которого можно настроить особенности оформления текста в ячейке (цвет, шрифт, размер букв и т.п.)
    • FormatConditions — возможность создать собственный объект, представляющий вариант оформления ячеек, который затем можно применять к разным ячейкам и диапазонам.
    • Formula — одно из самых важных свойств объекта Range. Доступно и на чтение, и на запись. Если используется на чтение, то возвращает текст формулы, прописанной в ячейку (а не вычисленное значение), если используется на запись, то позволяет записать формулу в ячейку. Если применить это свойство для диапазона, в который входит несколько ячеек, то формула будет прописана по все ячейки диапазона. Пример применения этого свойства может выглядеть так:
    • Свойство FormulaLocal, как и AddressLocal, позволяет внести поправки на особенности нумерации ячеек в локализованной версии Excel (для русских версий Excel в нем нет необходимости).
    • FormulaHidden — возможность спрятать формулы в диапазоне от пользователя. Работает только на защищенных листах.
    • HasFormula — проверить диапазон на наличие вычисляемых значений (формул).
    • Hidden — спрятать диапазон. Будет работать только в случае, если диапазон включает в себя хотя бы одну строку или столбец целиком, в противном случае вернется ошибка.
    • Interior — еще одно свойство, связанное с форматированием. В основном позволяет покрасить ячейки диапазона.
    • Item — позволяет получить еще один объект Range, который определяется путем смещения исходного диапазона.
    • Locked — это свойство позволяет заблокировать ячейки диапазона при защите листа.
    • Name — возможность получить ссылку на специальный объект именованного диапазона Name. На графическом экране с его возможностями можно познакомиться при помощи меню Вставка ->Имя. Он позволяет обращаться к диапазонам и формулам по именам и несколько напоминает по функциональности объект закладки в Word.
    • Next — перейти на следующую ячейку. Если лист не защищен, то следующей ячейкой будет считаться ячейка справа, если защищен — то следующая незаблокированная ячейка.
    • NumberFormat — возможность установить один из предопределенных форматов для чисел. Соответствует возможностям вкладки Число в меню Формат ->Ячейки на графическом экране.
    • Offset — это свойство позволяет получить новый объект Range с определенным смещением от исходного. Например, чтобы получить ячейку со смещением на три ячейки вверх от сходной и три ячейки влево, можно использовать код
    • свойство Orientation позволяет сориентировать текст в ячейках. Указывается угол наклона в градусах. Например, чтобы расположить текст по диагонали, можно использовать код
    • PageBreak — это свойство обычно используется для программной вставки разрывов страницы. Его применение может выглядеть так:
    • все свойства, которые начинаются на Pivot…, относятся к работе с объектом PivotTable (сводная таблица). Особенности работы с ней будут рассмотрены ниже.
    • QueryTable — это очень важное свойство позволяет получить ссылку на объект QueryTable — полученные с внешнего источника данные. Это свойство для объекта Range позволяет получить ссылку на объект QueryTable, которые находится в данном диапазоне. Подробнее про объект QueryTable будет рассказано ниже.
    • Range — это свойство, как уже говорилось выше, позволяет создать новый диапазон на основе уже существующего. Необходимо помнить про особенности нумерации ячеек в этом случае.
    • Resize — возможность изменить текущий диапазон. Например, увеличение его на один столбец вниз и одну строку вправо может выглядеть так:

    oRange.Resize(oRange.Rows.Count + 1, oRange.Columns.Count + 1).Select

    • ShrinkToFit — это свойство позволяет автоматически настроить размер текста в диапазоне таким образом, чтобы текст умещался в ширину столбца.
    • Style — это свойство позволяет вернуть объект Style, представляющий стиль для указанного диапазона. На графическом экране то, что позволяет сделать объект Style, можно сделать через меню Формат ->Стиль.
    • Text — возможность получить значение первой ячейки диапазона в виде значения типа String. Для объекта Range это свойство доступно только для чтения.
    • Validation — это свойство позволяет вернуть объект Validation, при помощи которого можно настроить проверку вводимых в диапазон данных.
    • Value — наиболее часто используемое свойство объекта Range. Позволяет получить или назначить значение (числовое, текстовое или какое-либо другое) ячейкам диапазона. Точно для той же цели используется свойство Value2, единственное отличие — это свойство не поддерживает типы данных Currency и Date.
    • WrapText — возможность включить/отключить перевод текста на следующую строку в ячейках диапазона.

    Теперь — о методах объекта Range:

    • Activate() — выделяет текущий диапазон и устанавливает курсор ввода на его первую ячейку.
    • AddComment() — возможность добавить комментарий к ячейке. Ячейка будет помечена красным уголком, а текст комментария будет показан в виде всплывающей подсказки. Этот метод можно вызвать только для диапазона, состоящего из одной ячейки. То же самое на графическом экране можно сделать при помощи меню Вставка ->Примечание.
    • AutoFill() — возможность использовать автозаполнение для диапазона (например, если первые две ячейки будут заполнены как 1 и 2, то дальше в автоматическом режиме будет продолжено: 3, 4, 5 и т.п.)
    • AutoFit() — автоматически поменять ширину всех столбцов и высоту всех строк в диапазоне, чтобы туда уместился текст ячеек. Можно применять только к тем диапазонам, которые состоят из набора столбцов (полностью) или набора ячеек (также полностью), иначе будет ошибка.
    • AutoFormat() — возможности использовать один из стилей автоформатирования (то, что на графическом экране доступно через меню Формат ->Автоформат).
    • BorderAround() — возможность поместить диапазон в рамку с выбранными вами параметрами.
    • методы Clear… позволяют очистить содержимое диапазона — от значений, форматирования, комментарий и т.п.
    • Consolidate() — возможность слить данные нескольких диапазонов (в том числе на разных листах) в один диапазон, используя при этом выбранную вами агрегатную функцию.
    • Copy() — возможность скопировать диапазон в другое место. Если место назначения не указано, он копируется в буфер обмена. Аналогично работает метод Cut(), при котором данные исходного диапазона вырезаются.
    • CopyFromRecordset() — очень удобный метод, который позволяет вставить данные из объекта ADO Recordset на лист Excel, начиная с верхнего левого угла указанного диапазона.
    • DataSeries() — метод, который может сэкономить множество времени и избежать возни с функциями даты и времени. Этот метод позволяет увеличить вами значения даты в диапазоне на указанный вами временной интервал. Например, если у вас в диапазоне стоит первое января, то при помощи этого метода можно сгенерировать первое число любого другого месяца.
    • Delete() — удаляет данные текущего диапазона. В качестве необязательно параметра можно определить, с какой стороны будут сдвигаться ячейки на место удаленных.
    • Dirty() — пометить ячейки диапазона как «грязные». Такие ячейки будут пересчитаны при следующем же пересчете. Обычно используется, когда Word сам не может догадаться, что их нужно пересчитать. Пересчитать ячейки диапазона можно и принудительно — при помощи метода Calculate().
    • методы Fill… (FillDown(), FillUp(), FillLeft(), FillRight()) позволяют размножить одно и то же значение по ячейкам диапазона в указанном вами направлении.
    • метод Find() позволяет произвести поиск по ячейкам диапазона и вернуть новый объект Range, который представляет первую ячейку, в котором было найдено нужное значение. У этого метода есть множество необязательных параметров, которые позволяют определить направление поиска, чувствительность к регистру, искать все значение ячейки или часть и т.п. Методы FindNext() и FindPrevious() позволяют продолжить поиск, начатый методом Find(), в разных направлениях.
    • метод GoalSeek() позволяет применить автоподбор значений для функции Excel программным способом. На графическом экране то же самое можно сделать при помощи меню Сервис ->Подбор параметра.
    • метод Insert() позволяет вставить ячейки в диапазон, сдвинув остальные (вы можете выбрать — вправо или вниз).
    • метод Justify() позволяет равномерно распределить текст по диапазону. Если в данный диапазон он не помещается, он будет распространен на соседние ячейки (с перезаписью их значений).
    • метод Merge() позволяет слить все ячейки диапазона в одну. При этом останется только одно значение — верхней левой ячейки. Разбить обратно такую слитую ячейку на несколько обычных можно при помощи метода UnMerge().
    • Parse() — позволяет разбить одну ячейку на несколько по указанному вами шаблону (например, чтобы отделить код города от номера телефона).
    • PasteSpecial() — операция, дополняющая Copy() и Cut(). Она позволяет вставить то, что лежит в буфере обмена, с указанием специальных параметров вставки (вставлять с добавлением к существующим данным, с умножением, вычитанием, делением и т.п.)
    • PrintOut() и PrintPreview() — позволяют вывести диапазон на печать или открыть режим просмотра перед печатью..
    • Replace() — метод, дополняющий метод Find(). Позволяет проводить поиск и замену значений в диапазоне.
    • Select() — возможность выделить указанный диапазон. Объекта Selection в Excel нет — вместо него есть возможность получить объект Range, представляющий выделенную область.
    • Show() — экран будет проскроллирован таким образом, чтобы показать указанный диапазон.
    • ShowDependents() — показать стрелки для ячеек, которые зависят от указанного диапазона (только первый уровень зависимости) или эти стрелки убрать. Обратный метод — ShowPrecedents().
    • ShowErrors() — показать источник ошибки для указанной ячейки.
    • Sort() — возможность произвести сортировку ячеек в диапазоне. Можно использовать большое количество необязательных параметров для настройки сортировки. SortSpecial() — с учетом особенностей азиатских языков.
    • Speak() — удивительный метод, который позволяет зачитывать вслух содержимое диапазона (можно определить, в каком направлении и будут ли зачитываться формулы). К сожалению, в локализованной версии Excel не работает.
    • SpecialCells() — очень удобный метод, который позволяет вернуть объект Range, включающий в себя все ячейки определенного типа (пустые, с ошибками, с комментариями, последние, с константами, с формулами, с определенным форматированием) и с определенным значением. Например, чтобы вернуть объект Range, состоящий из всех пустых ячеек диапазона, можно использовать код
    Илон Маск рекомендует:  Что такое код getsubmenu

    Set oRange2 = oRange.SpecialCells(xlCellTypeBlanks)

    oRange 2. Select ‘проверяем, так ли это

    • метод SubTotal() позволяет посчитать итоговое значение для диапазона (можно выбрать агрегатную функцию и множество других параметров).
    • метод Table() позволяет создать таблицу на основе передаваемого столбца, строки и функции, которую нужно использовать для вычисления ячеек таблицы. Пример из документации по этому методу позволяет автоматически сгенерировать таблицу умножения.
    • TextToColumns() — сложный метод, который позволяет разбить столбцы в диапазоне на несколько столбцов в соответствии с определенным алгоритмом. Принимает множество необязательных параметров.

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

    вполне подходит — только запоминайте адрес прямо в ячейку на листе.

    С другой стороны, сам Excel действительно сохраняет где-то в книге адреса всех последних активных ячеек каждого листа, так что задачка интересная. Быстрое гугление не дало ответа на вопрос

    вполне подходит — только запоминайте адрес прямо в ячейку на листе.

    С другой стороны, сам Excel действительно сохраняет где-то в книге адреса всех последних активных ячеек каждого листа, так что задачка интересная. Быстрое гугление не дало ответа на вопрос AndreTM

    Skype: andre.tm.007
    Donate: Q iwi: 9517375010

    Ответить

    вполне подходит — только запоминайте адрес прямо в ячейку на листе.

    С другой стороны, сам Excel действительно сохраняет где-то в книге адреса всех последних активных ячеек каждого листа, так что задачка интересная. Быстрое гугление не дало ответа на вопрос Автор — AndreTM
    Дата добавления — 27.05.2013 в 14:11

    psw Дата: Понедельник, 27.05.2013, 20:46 | Сообщение № 8

    Пользователь и VB-программа (для краткости — демон) работают параллельно.
    Активация Листа1 демоном ведет к деактивации Листа2 пользователя,
    на котором пользователь в это время работает. Это недопустимо.

    Кроме того, демон м.б. стартован после того как пользователь
    побывал на Листе1 демона и покинул его — «вручную деактивировал» Лист1.
    Поэтому демону нечего запоминать «в ячейку на листе»[1].
    В процессе совместной работы пользователя и демона, у демона
    м.б. несколько жизней (от своего старта до своего завершения),
    и очередной старт жизни м.б. необязательно на Листе1.

    Почему-то народ пытается обойти именно
    изначально сформулированное, главное (и единственное!)
    условие задачки — запрет активации неактивного листа))))

    Пользователь и VB-программа (для краткости — демон) работают параллельно.
    Активация Листа1 демоном ведет к деактивации Листа2 пользователя,
    на котором пользователь в это время работает. Это недопустимо.

    Кроме того, демон м.б. стартован после того как пользователь
    побывал на Листе1 демона и покинул его — «вручную деактивировал» Лист1.
    Поэтому демону нечего запоминать «в ячейку на листе»[1].
    В процессе совместной работы пользователя и демона, у демона
    м.б. несколько жизней (от своего старта до своего завершения),
    и очередной старт жизни м.б. необязательно на Листе1.

    Почему-то народ пытается обойти именно
    изначально сформулированное, главное (и единственное!)
    условие задачки — запрет активации неактивного листа)))) psw

    Сообщение Пользователь и VB-программа (для краткости — демон) работают параллельно.
    Активация Листа1 демоном ведет к деактивации Листа2 пользователя,
    на котором пользователь в это время работает. Это недопустимо.

    Кроме того, демон м.б. стартован после того как пользователь
    побывал на Листе1 демона и покинул его — «вручную деактивировал» Лист1.
    Поэтому демону нечего запоминать «в ячейку на листе»[1].
    В процессе совместной работы пользователя и демона, у демона
    м.б. несколько жизней (от своего старта до своего завершения),
    и очередной старт жизни м.б. необязательно на Листе1.

    Почему-то народ пытается обойти именно
    изначально сформулированное, главное (и единственное!)
    условие задачки — запрет активации неактивного листа)))) Автор — psw
    Дата добавления — 27.05.2013 в 20:46

    AndreTM Дата: Понедельник, 27.05.2013, 20:56 | Сообщение № 9

    Вы не понимаете? Excel не поддерживает такого функционала (по крайней мере, стандартными средствами).

    Вам же советуют реальный обходной путь. Который исходит из того, что «текущую ячейку» на неактивном листе может изменить только пользователь. Который при этом должен хотя бы раз активировать лист. И затем деактивировать (!) А вы ударяетесь в пояснения, не имеющие отношения к задаче, — видимо, не знаете, как правильно организовать событийную модель своей задачи.

    Вы не понимаете? Excel не поддерживает такого функционала (по крайней мере, стандартными средствами).


    Вам же советуют реальный обходной путь. Который исходит из того, что «текущую ячейку» на неактивном листе может изменить только пользователь. Который при этом должен хотя бы раз активировать лист. И затем деактивировать (!) А вы ударяетесь в пояснения, не имеющие отношения к задаче, — видимо, не знаете, как правильно организовать событийную модель своей задачи. AndreTM

    Skype: andre.tm.007
    Donate: Q iwi: 9517375010

    Сообщение Вы не понимаете? Excel не поддерживает такого функционала (по крайней мере, стандартными средствами).

    Вам же советуют реальный обходной путь. Который исходит из того, что «текущую ячейку» на неактивном листе может изменить только пользователь. Который при этом должен хотя бы раз активировать лист. И затем деактивировать (!) А вы ударяетесь в пояснения, не имеющие отношения к задаче, — видимо, не знаете, как правильно организовать событийную модель своей задачи. Автор — AndreTM
    Дата добавления — 27.05.2013 в 20:56

    psw Дата: Понедельник, 27.05.2013, 21:30 | Сообщение № 10
    Alex_ST Дата: Понедельник, 27.05.2013, 21:45 | Сообщение № 11

    С уважением,
    Алексей
    MS Excel 2003 — the best.

    Ответить

    psw Дата: Понедельник, 27.05.2013, 23:16 | Сообщение № 12

    ..и вообще-то при Worksheet_Deactivate для Листа1
    в ActiveCell.Address(0, 0) содержится
    адрес ячейки Листа2 НА который делается переход
    а не
    адрес ячейки Листа1 С которого делается переход..

    [admin]Оформляйте коды тегами![/admin]

    ..и вообще-то при Worksheet_Deactivate для Листа1
    в ActiveCell.Address(0, 0) содержится
    адрес ячейки Листа2 НА который делается переход
    а не
    адрес ячейки Листа1 С которого делается переход..

    [admin]Оформляйте коды тегами![/admin] psw

    Сообщение ..и вообще-то при Worksheet_Deactivate для Листа1
    в ActiveCell.Address(0, 0) содержится
    адрес ячейки Листа2 НА который делается переход
    а не
    адрес ячейки Листа1 С которого делается переход..

    [admin]Оформляйте коды тегами![/admin] Автор — psw
    Дата добавления — 27.05.2013 в 23:16

    Poltava Дата: Вторник, 28.05.2013, 01:20 | Сообщение № 13
    AndreTM Дата: Вторник, 28.05.2013, 06:14 | Сообщение № 14

    Я придумал немного другой вариант (с доп.переменной в модуле каждого «нужного» листа), построенный на исключениях.
    Правда, что-то там не дает переключаться на другие открытые книги (есть обход — можно создать новую книгу, а в ней уже открыть нужную, но тогда до закрытия «новооткрытого» — не вернуться в книгу с демоном), хотя и продолжает считать и записывать верно. Что-то там с событиями — надо посмотреть.
    Зато в рабочей книге даже удаление/добавление/копирование листов (во время работы демона) — без нареканий (при добавлении — надо озаботиться прописыванием переменной, при копировании — достаточно переместить курсор в нужную ячейку. Ибо демон пропускает активный лист при обработке, а пишет только на неактивные. И кода — минимум

    Да, ещё. Переменные в модулях листа — Variant с расчетом на Object/Range, поэтому смотрите внимательно, как выполняете присваивание. Зато можно обращаться прямо к «активной» ячейке и её свойствам/методам. Конечно, можно сделать String (будет надёжнее при написании кода), но это уж проблемы разработчика.

    Я придумал немного другой вариант (с доп.переменной в модуле каждого «нужного» листа), построенный на исключениях.
    Правда, что-то там не дает переключаться на другие открытые книги (есть обход — можно создать новую книгу, а в ней уже открыть нужную, но тогда до закрытия «новооткрытого» — не вернуться в книгу с демоном), хотя и продолжает считать и записывать верно. Что-то там с событиями — надо посмотреть.
    Зато в рабочей книге даже удаление/добавление/копирование листов (во время работы демона) — без нареканий (при добавлении — надо озаботиться прописыванием переменной, при копировании — достаточно переместить курсор в нужную ячейку. Ибо демон пропускает активный лист при обработке, а пишет только на неактивные. И кода — минимум

    Да, ещё. Переменные в модулях листа — Variant с расчетом на Object/Range, поэтому смотрите внимательно, как выполняете присваивание. Зато можно обращаться прямо к «активной» ячейке и её свойствам/методам. Конечно, можно сделать String (будет надёжнее при написании кода), но это уж проблемы разработчика. AndreTM

    Skype: andre.tm.007
    Donate: Q iwi: 9517375010

    Сообщение Я придумал немного другой вариант (с доп.переменной в модуле каждого «нужного» листа), построенный на исключениях.
    Правда, что-то там не дает переключаться на другие открытые книги (есть обход — можно создать новую книгу, а в ней уже открыть нужную, но тогда до закрытия «новооткрытого» — не вернуться в книгу с демоном), хотя и продолжает считать и записывать верно. Что-то там с событиями — надо посмотреть.
    Зато в рабочей книге даже удаление/добавление/копирование листов (во время работы демона) — без нареканий (при добавлении — надо озаботиться прописыванием переменной, при копировании — достаточно переместить курсор в нужную ячейку. Ибо демон пропускает активный лист при обработке, а пишет только на неактивные. И кода — минимум

    Да, ещё. Переменные в модулях листа — Variant с расчетом на Object/Range, поэтому смотрите внимательно, как выполняете присваивание. Зато можно обращаться прямо к «активной» ячейке и её свойствам/методам. Конечно, можно сделать String (будет надёжнее при написании кода), но это уж проблемы разработчика. Автор — AndreTM
    Дата добавления — 28.05.2013 в 06:14

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

    Коротко о разделе:
    Здесь разрешается создавать темы, относящиеся к любому языку программирования, для которого не существует раздела на форуме (например, Lisp, Tcl/Tk, FORTRAN и т.д.). Если раздел для нужного Вам языка есть, большая просьба создавать тему в нем.
    Вопросы, связанные с JScript, Perl, PHP обсуждаются в разделе WWW Masters.

    Обратите внимание:
    1. Прежде чем задать вопрос, воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали.
    2. Если Ваш вопрос связан с конкретным языком программирования, обязательно укажите название языка в имени темы.
    3. Постарайтесь давать темам информативные названия. Темы с названиями типа «Помогите, горю» будут удалены.
    4. Помните, чем грамотней будет задан Ваш вопрос, тем больше будет у Вас шансов получить на него ответ. Как правильно задавать вопросы
    5. Ипользуйте тег [ code ] . текст программы. [ /code ] для выделения текста программы.

    Просьбы выполнить какую-либо работу за автора в этом разделе не обсуждаются. Темы с подобными просьбами будут перемещены или удалены. Для заказов у нас существуют специальные разделы: Разовые заказы и подработка, ПОМОЩЬ СТУДЕНТАМ.

    Если кто не понял (а такие есть) — чтобы за вас решали ваши задачки, идите на другие ресурсы.

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

    Excel VBA: Приёмы программирования По материалам эхоконференции 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 )
    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
    ‘ Не выводить подтверждение на удаление
    Application.DisplayAlerts = False
    ActiveWorkbook.Worksheets(sSheetName).Delete
    DelSheetByDate = True
    Application.DisplayAlerts = True
    End If

    Exit Function
    errHandle:
    MsgBox Err.Description, vbCritical, «Ошибка №» & Err.Number
    End Function

    Назад к СОДЕРЖАНИЮ

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

    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

    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
    . 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

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

    5 xbonez [2011-01-07 17:59:00]

    У меня есть следующий код vba, чтобы найти вхождения в «0» в следующем столбце:

    Как я могу изменить код, чтобы, когда он находит «0» , скажем, B6, он отображает C7? то есть. он отображает ячейку, расположенную по диагонали рядом с той, где находится «0» .

    2 ответа

    5 Решение Fionnuala [2011-01-07 18:11:00]

    18 Alex P [2011-01-07 18:20:00]

    Вы можете использовать Offset

    Свойство Offset имеет вид Offset(row, column) . Примеры:

    Макрос определяющий пустая ли ячейка или заполненная в VBA Excel

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

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

    Рассмотрим несколько вариантов VBA алгоритмов:

    Алгоритм для строго определенной ячейки с применением её адреса.

    Пример для ячейки с адресом B6:

    • Private Sub CommandButton1_Click() ‘наименование алгоритма
    • If IsEmpty(Range(«B6»)) = True Then ‘условие, если ячейка пустая, то
    • MsgBox («В ячейке нет данных») ‘вывод сообщения, что в ячейке нет данных
    • Else ‘в противном случае
    • MsgBox («Данные внесены в ячейку») ‘вывод сообщения, что в ячейке есть данные
    • End If ‘конец блока «если»
    • End Sub ‘конец алгоритма

    VBA: Как найти диапазон ячеек для значения и вернуть ячейки рядом с местоположением?

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

    Краткое описание без конкретных имен ячеек ниже

    Я пытаюсь написать макрос, в котором пользователь вводит значение (X), а макрос ищет диапазон ячеек для значения ( X), а затем макрос возвращает значения ячеек в 3 пробелах рядом с тем местом, где находится местоположение значения (X).

    Пара вещей, которые делают это невозможным для решения, это тот факт, что пользователь вводит значение на листе 1 и значение перемещается на листе 2 по формуле, я не могу понять, как использовать Find, где значения Я ищу, еще не определен в макросе.

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

    Например: Range. («C7: D10») не будет работать, потому что пользователь мог ввести новую информацию, которая изменяет рабочий диапазон, как описано ниже.

    Ниже приведен скриншот с дополнительными пояснениями

    Так на этом снимке экрана ячейки C3 и D3 являются импортированными значениями из Sheet1.

    C3 — это (= Sheet1! B2)

    Идея состоит в том, что макрос запускается и просматривает столбец A, пока он не совпадет с C3 . [+1112]

    Затем функция поиска перемещается по двум ячейкам и ищет вниз, пока не найдет совпадение с D3 или пока не достигнет пустого места.

    Я не знаю, как попросить макрос выполнить поиск по импортированному значению, и я не знаю, как попросить его найти этот странный определенный диапазон, который мне нужен. Идея состоит в том, что кто-то из моих сотрудников мог бы прийти и добавить строку ниже C10 и добавить необходимую информацию, и макрос все еще будет работать и искать в C11, и после этого будет пустое место, чтобы сказать макросу остановиться.

    После того, как поиск найдет совпадение для D3, он вернет значения, смежные с совпадением, в соответствующие ячейки вверху, E3, F3 и G3.

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

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

    This will display the cell address using the Range object:

    Get Cells Address

    This will display the cell address using the Cells object:

    ActiveCell Address

    To get the ActiveCell address use this code:

    Set Variable to Cell Address

    You can also assign the cell address to a string variable:

    Get Row Number From Cell Address

    This code will extract the row number from an address:

    However, usually you can use this much simpler code:

    ABOUT AUTOMATE EXCEL

    «At Automate Excel we offer a range of free resources, software, training, and consulting to help you Excel at Excel. Contact me to learn more.»

    Steve Rynearson, Chief Excel Officer (CEO) at Automate Excel

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