Как получить значение последней непустой ячейки в строке? - PullRequest
1 голос
/ 26 января 2012

Вот пример электронной таблицы

Sample table

Я хочу выбрать диапазон (например: A2:E2) и получить значение 1. Если я выберу A4:E4, я получу значение 1; и так далее. Есть ли способ достичь этого с помощью макроса?

Еще одна вещь, которая мне понадобится, - это значение в первой строке соответствующего столбца. Пример:

Если я выберу A2:E2 Я хочу получить n (поскольку 1 в столбце E), если я выберу A4:E4 Я хочу получить v (так как 1 в столбце C).

Ответы [ 2 ]

2 голосов
/ 26 января 2012

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

Dim ColLast as Long
Dim ValueColLast as String
Dim HeadColLast as String

With Sheets(xxxxx)

  ColLast = .Cells(2,Columns.Count).End(xlToLeft).Column
  ValueColLast = .Cells(2, ColLast).Value
  HeadColLast = .Cells(1,ColLast).Value 

End With

Cells(Row, Column) относится к ячейке, идентифицируемой строкой и столбцом в активной рабочей таблице.Ряд должен быть числом.Столбец может быть числом (например, 1 или 104) или идентификатором столбца (например, «A» или «CZ»)

.Cells(Row, Column) адресует ячейку, указанную в строке и столбце на листе, указанном в операторе With,Обратите внимание на начальную точку.

.Cells(2,Columns.Count) указывает на последнюю ячейку в строке 2, начиная с Columns.Count, учитывая количество столбцов на листе для текущей версии Excel.`Rows.Count делает то же самое для строк.

Предполагая, что .Cells(2,Columns.Count) пусто, .Cells(2,Columns.Count).End(xlToLeft) находит следующую ячейку в указанном направлении со значением.Это VBA-эквивалент Ctrl + LeftArrow.xlToRight, xlUp и xlDown позволяют вам двигаться в других направлениях..Cells(Rows.Count,"A").End(xlUp) дает последнюю использованную строку в столбце A.

.Cells(2,Columns.Count).End(xlToLeft).Column дает номер последнего использованного столбца в строке 2.

ValueColLast = .Cells(2, ColLast).Value устанавливает ValueColLast в значение последнейячейка в строке 2. Я определил ValueColLast как строку, потому что, если бы я предположил, что это число и определил его как Long, я получил бы ошибку, если бы его не было.

HeadColLast = .Cells(1,ColLast).Value устанавливает значение HeadColLast в значениев строке 1.

Надеюсь, все это имеет смысл.

1 голос
/ 27 января 2012

Хорошо, вот функция, которую вы можете использовать в качестве формулы в рабочей книге. Он также отвечает на оба ваших вопросов. :)

Вставьте приведенный ниже код в модуль.

СИНТАКСИС / ИСПОЛЬЗОВАНИЕ

= MyFunc (диапазон ячеек, Arg)

Диапазон ячеек : (обязательно) Диапазон, такой как A2: E2

Arg : (обязательно) Может принимать значение «H» или «R». «H» даст вам заголовок столбца, а «R» даст вам значение строки

* ** 1023 тысяча двадцать-дв * Пример

= MyFunc (A1: E2, "H") даст вам "n" и

= MyFunc (A1: E2, «R») даст вам «1»

Option Explicit

Function MyFunc(rng As Range, stype As String) As Variant
    Dim MyArray() As String
    Dim sCol As Long

    If stype = "" Or (UCase(stype) <> "H" And _
    UCase(stype) <> "R") Then Exit Function

    With rng
        MyArray = Split(.Address, "$")

        sCol = Cells(Val(MyArray(UBound(MyArray))), _
        Columns.Count).End(xlToLeft).Column

        If UCase(stype) = "H" Then
            MyFunc = Cells(1, sCol)
        ElseIf UCase(stype) = "R" Then
            MyFunc = Range(MyArray(UBound(MyArray) - 1) & _
            MyArray(UBound(MyArray))).Value
        End If
    End With
End Function

Примечание. Это просто общий код, показывающий, как он работает, и в настоящий момент он не обрабатывает никаких ошибок.

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