Найти последний столбец с данными и добавить данные после этого столбца - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть некоторые данные в моей рабочей таблице, и я хочу добиться того, чтобы я хотел добавить данные после 1 столбца из последнего столбца с данными. Я пробовал свойство Range().End, но думаю, что не могу его правильно реализовать.

colnum = Sheet3.Range("A:Z").End(xlToLeft).Column + 2

Приведенный выше код дает мне номер столбца как «1», а плюс 2 означает, что он дает номер столбца «3», который равен «C». Данные в моей рабочей таблице выглядят примерно так:

enter image description here Я хочу выполнить динамический поиск c, и мой код должен найти столбец «E» в качестве последнего столбца с данными и начать добавлять данные из столбца «F». Любые предложения приветствуются.

1 Ответ

0 голосов
/ 18 февраля 2020

Эта функция возвращает массив, в котором первый элемент является номером последней строки, а второй элемент - номером последней колонки.

Function LastRowCol(Worksht) As Long()
'Uncomment if on worksheet
'Application.Volatile
    Dim WS As Worksheet, R As Range
    Dim LastRow As Long, LastCol As Long
    Dim L(1) As Long

Select Case TypeName(Worksht)
    Case "String"
        Set WS = Worksheets(Worksht)
    Case "Worksheet"
        Set WS = Worksht
End Select

With WS
    Set R = .Cells.Find(what:="*", after:=.Cells(1, 1), _
                    LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByRows, _
                    searchdirection:=xlPrevious)

    If Not R Is Nothing Then
        LastRow = R.Row
        LastCol = .Cells.Find(what:="*", after:=.Cells(1, 1), _
                    LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByColumns, _
                    searchdirection:=xlPrevious).Column
    Else
        LastRow = 1
        LastCol = 1
    End If
End With

L(0) = LastRow
L(1) = LastCol
LastRowCol = L
End Function

Sub change_code_name()
'Requires Trust Access to VBA Object Model

  Dim wbk As Object, sheet As Object
ActiveWorkbook.VBProject.name = "VBAProject"
Set wbk = ActiveWorkbook.VBProject.VBComponents(ActiveWorkbook.CodeName)
  wbk.name = "wbk_code_name"
Set sheet = ActiveWorkbook.VBProject.VBComponents(ActiveWorkbook.Sheets(1).CodeName)
  sheet.name = "sheet_code_name"
End Sub

В случае вашей строки кода предполагается, что кодовое имя вашей таблицы равно Sheet3, это будет что-то вроде:

colnum = LastRowCol(Sheet3)(1) + 1

и будет применяться к активной книге.

См. Также Ошибка при поиске последней использованной ячейки в Excel с VBA для широкого обсуждения различных методов поиска последней строки / столбца и подводных камней каждого из них.

Редактировать:

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

Option Explicit
Function LastRowCol(Worksht, Optional excludeRows As Long = 0) As Long()
'Uncomment if on worksheet
'Application.Volatile
    Dim WS As Worksheet, R As Range
    Dim LastRow As Long, LastCol As Long
    Dim L(1) As Long
    Dim searchRng As Range

Select Case TypeName(Worksht)
    Case "String"
        Set WS = Worksheets(Worksht)
    Case "Worksheet"
        Set WS = Worksht
End Select

If excludeRows > 0 Then
    With WS
        Set searchRng = Range(.Cells(excludeRows + 1, 1), .Cells(.Rows.Count, .Columns.Count))
    End With
Else
    Set searchRng = WS.Cells
End If

With searchRng
    Set R = .Cells.Find(what:="*", after:=.Cells(1, 1), _
                    LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByRows, _
                    searchdirection:=xlPrevious)

    If Not R Is Nothing Then
        LastRow = R.Row
        LastCol = .Cells.Find(what:="*", after:=.Cells(1, 1), _
                    LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByColumns, _
                    searchdirection:=xlPrevious).Column
    Else
        LastRow = 1
        LastCol = 1
    End If
End With

L(0) = excludeRows + 1
L(1) = LastCol
LastRowCol = L
End Function

и в своем макросе:

colnum = LastRowCol(Sheet3,1)(1) + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...