MyTetra Share
Делитесь знаниями!
Функция получения ссылки на заданную пользователем ячейку
Время создания: 16.03.2019 23:43
Текстовые метки: Cells
Раздел: Разные закладки - VBA - Excel - Cells
Запись: xintrea/mytetra_db_adgaver_new/master/base/1514664937q1lv82bs6r/text.html на raw.githubusercontent.com

Функция получения ссылки на заданную пользователем ячейку

  • Макросы VBA Excel
  • Работа с диапазонами ячеек и листами
  • Ячейки Excel
  • текстовые строки

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

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

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

Sub ПримерИспользования_GetCell()
    ' вставляем значение в первую пустую ячейку столбца A
    ' (вставка производится ниже всех данных в первом столбце листа)
    GetCell("a").Value = Now
 
    ' то же самое, но с другими вариантами параметра функции (все 4 способа равнозначны)
    GetCell("a:a").Value = 111
    GetCell(Columns(1)).Value = 222
    GetCell([a:a]).Value = 333
 
    '  ============ вставка в первую незаполненную ячейку третьей строки =================
    GetCell(Destination:=3).Value = 1
    ' то же самое, но с другими вариантами параметра функции (все 4 способа равнозначны)
    GetCell("3").Value = 2
    GetCell(Rows(3)).Value = 3
    GetCell([3:3]).Value = 4
 
    '  ============ другие варианты использования =================
    GetCell().Value = "активная ячейка"    ' вставка в заданную ячейку (вызов без параметра)
    GetCell("NewSheet").Value = "на новый лист в ячейку A1"    ' создаётся новый лист
    GetCell("NewWorkbook").Value = "в новую книгу в ячейку A1"    ' создаётся новая книга Excel
End Sub

Как вы заметили, в качестве параметра функции можно использовать предопределённые текстовые константы "NewSheet" и "NewWorkbook"

Код функции GetCell:

Пример использования функции GetCell можно посмотреть
в
надстройке для импорта данных из CSV на лист Excel

Function GetCell(Optional ByRef Destination As Variant) As Range
    ' Функция получает в качестве параметра ссылку на диапазон
    ' Возвращает ячейку для вставки данных в зависимости от параметра:
    '   если параметр не задан - возвращается активная ячейка текущей книги
    '   если параметр является ссылкой на ячейку - возвращается эта ячейка
    '   если параметр является ссылкой на строку - возвращается первая незаполненная ячейка этой строки
    '   если параметр является ссылкой на столбец - возвращается первая незаполненная ячейка этого столбца

    On Error Resume Next: Err.Clear
    If IsMissing(Destination) Then
        If ActiveWorkbook Is Nothing Then Workbooks.Add(xlWBATWorksheet).Worksheets(1).Name = "Данные"
        Set GetCell = ActiveCell: Exit Function
    End If
 
    If Not IsObject(Destination) Then If IsNumeric(Destination) Then Destination = Val(Destination)
 
    Select Case TypeName(Destination)
        Case "String"
            If Destination = "NewWorkbook" Then Workbooks.Add(xlWBATWorksheet).Worksheets(1).Name = "Данные"
            If ActiveWorkbook Is Nothing Then Workbooks.Add(xlWBATWorksheet).Worksheets(1).Name = "Данные"
 
            If Destination = "NewSheet" Then ActiveWorkbook.Worksheets.Add , ActiveSheet
 
            Set GetCell = Range(Destination)
            If Err.Number = 1004 Then
                If Destination Like String(Len(Destination), "[A-z]") Then _
                   Err.Clear: Set GetCell = Range(Destination & ":" & Destination)
                'Debug.Print Err.Number, Err.Description
                If Err Then Set GetCell = ActiveCell: Exit Function    ' неопознанная ошибка
            End If
        Case "Integer", "Long", "Double"
            If ActiveWorkbook Is Nothing Then Workbooks.Add(xlWBATWorksheet).Worksheets(1).Name = "Данные"
            Err.Clear: If Val(Destination) > 0 Then Set GetCell = Rows(Val(Destination))
            If Err Then Set GetCell = ActiveCell: Exit Function    ' неопознанная ошибка

        Case "Range": Set GetCell = Destination
        Case "Workbook": Set GetCell = Destination.Worksheets(1).[a:a]
        Case "Worksheet": Set GetCell = Destination.[a:a]
 
        Case Else
            Debug.Print "Another parameter type: ", TypeName(Destination)
            Set GetCell = ActiveCell: Exit Function    ' неопознанная ошибка
    End Select
 
    If GetCell Is Nothing Then Set GetCell = ActiveCell: Exit Function
    Select Case True
        Case GetCell.Address = GetCell.EntireColumn.Address
            Set GetCell = GetCell.Columns(1).Cells(GetCell.Rows.Count).End(xlUp).Offset(1)
        Case GetCell.Address = GetCell.EntireRow.Address
            Set GetCell = GetCell.Rows(1).Cells(GetCell.Columns.Count).End(xlToLeft).Offset(, 1)
        Case Else: Set GetCell = GetCell.Cells(1)
 
    End Select
End Function
  • 17467 просмотро
Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования