Не удается найти последний столбец из листа данных - PullRequest
0 голосов
/ 22 октября 2018

Я попытался выяснить последний использованный столбец в моей таблице Excel, используя vba, чтобы начать что-то писать сразу после этого столбца.На изображении ниже я попытался показать, что я имел в виду и откуда я хочу начать писать.Там уже выбрано нужное поле, которое равно «F2».

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

Это моя попытка:

Sub FindLastColumn()
    Dim lCol&

    lCol = Cells(1, Columns.Count).End(xlToLeft).Column
    MsgBox lCol
End Sub

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

Таблица данных с данными выглядит следующим образом:

enter image description here

Ответы [ 5 ]

0 голосов
/ 22 октября 2018

Используйте вариант метода Find для его нахождения, но ограничьте его игнорированием строки 1:

Sub Test()

    Dim rng As Range

    Set rng = LastCell(Sheet1)

    MsgBox "Last cell containing data is " & rng.Address & vbCr & _
           "Selected cell is in example is " & Sheet1.Cells(2, rng.Column + 1).Address

End Sub

Public Function LastCell(wrkSht As Worksheet) As Range

    Dim lLastCol As Long, lLastRow As Long

    On Error Resume Next

    With wrkSht.Rows("2:1048576")
            lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
            lLastRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row

        If lLastCol = 0 Then lLastCol = 1
        If lLastRow = 0 Then lLastRow = 1

        Set LastCell = wrkSht.Cells(lLastRow, lLastCol)

    End With
    On Error GoTo 0

End Function
0 голосов
/ 22 октября 2018

Простым маршрутом будет использование Find, как показано ниже:

Dim rgLastColumnCell As Range
Set rgLastColumnCell = ActiveSheet.Cells.Find("*", , , , xlByColumns, xlPrevious)
MsgBox "Last Used Column is : " & rgLastColumnCell.Column

Отрегулируйте ActiveSheet.Cells часть в соответствии с вашими потребностями, например: Activesheet.Range("B2:XFD1048576"), если вы хотите пропустить первый ряд из чека.

0 голосов
/ 22 октября 2018

Похоже, что вы хотите найти правый наиболее часто используемый столбец в строках 2 до конца ваших данных.Чтобы сделать это, вам нужно перебрать все строки данных, отслеживая, какой из столбцов равен Max(LastUsedColumn).К сожалению, такой встроенной функции не существует, но вы могли бы написать что-то вроде этого:

Public Function MaxUsedColumnInRow(ByVal SheetToCheck As Worksheet, ByVal RowToCheck As Long) As Long
  MaxUsedColumnInRow = SheetToCheck.Cells(RowToCheck, Columns.count).End(xlToLeft).Column
End Function

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

Public Function MaxUsedColumnInRange(ByVal SheetToCheck As Worksheet, ByVal StartRow As Long, ByVal EndRow As Long) As Long

  Dim curRow As Long
  For curRow = StartRow To EndRow
    Dim CurCol As Long
    CurCol = MaxUsedColumnInRow(SheetToCheck, curRow)
    Dim maxCol As Long
    If CurCol > maxCol Then
      maxCol = CurCol
    End If
  Next

End Function

И, наконец, проведите быстрый тест, заменив «Лист1» на имя листа, который вы специально проверяете:

Public Sub TestIt()
  MsgBox "Max Used column on sheet1 = " & CStr(MaxUsedColumnInRange("Sheet1", 2, 50))
End Sub

Конечно, вы захотите определить максимальный ряд на вашем листе и передать его в функцию MaxUsedColumnInRange - если только у вас не окажется ровно 50 строк данных, пример теста Sub вероятно, вы не получите желаемый результат.

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

0 голосов
/ 22 октября 2018

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

Sub foo()
LastRow = Sheet1.UsedRange.Rows.Count
'get the last row with data in your used range
MaxCol = 1
For i = 2 To LastRow 'loop from row 2 to last
    If Sheet1.Cells(i, Sheet1.Columns.Count).End(xlToLeft).Column > MaxCol Then
        MaxCol = Sheet1.Cells(i, Sheet1.Columns.Count).End(xlToLeft).Column
        'get the highest value for the column into variable
    End If
Next i
MsgBox MaxCol
End Sub
0 голосов
/ 22 октября 2018

Вы не можете получить требуемый результат с помощью встроенных функций, либо вы можете получить столбец H, потому что это последний использованный столбец, или столбец B, потому что это последний заполненный столбец. Чтобы получить E, вам нужнонаписать свой собственный код, и, судя по всему, вы хотите, чтобы конец цветного диапазона.Вы можете проверить последний столбец, в котором цвет отсутствует в цикле

Sub checkLastColumn()
    col_num = 1
    Do While Cells(2, col_num).Interior.Pattern <> xlNone
        col_num = col_num + 1
    Loop
    MsgBox col_num
End Sub

Будет возвращен столбец F

EDIT ....

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

Например:

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

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

Sub getStatusColumn()
    col_num = 1
    Do While Cells(1, col_num) <> "status"
        col_num = col_num + 1
    Loop
    MsgBox col_num
End Sub

ИЛИ

Sub getLastItemColumn()
    col_num = 1
    Do While Left(Cells(1, col_num), 4) = "Item"
        col_num = col_num + 1
    Loop
    MsgBox col_num
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...