Скопируйте последний столбец с данными по указанной строке в следующий пустой столбец

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

Есть ли способ сделать это?

Мне удалось сделать это с помощью строк, используя:

lastrowSrc = Sheets("Overview").Range("B" & Rows.Count).End(xlUp).Row

Однако это ставит B12 в диапазон, используя columns.count просто помещает в число столбца, а не букву

Ответ 1

Чтобы получить точный столбец на листе, используйте этот код.

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim LastCol As Long

    Set ws = Sheets("Sheet1")

    '~~> This check is required else .FIND will give you error on an empty sheet
    If Application.WorksheetFunction.CountA(ws.Cells) = 0 Then
        LastCol = 1
    Else
        LastCol = ws.Cells.Find(What:="*", _
                After:=ws.Range("A1"), _
                Lookat:=xlPart, _
                LookIn:=xlFormulas, _
                SearchOrder:=xlByColumns, _
                SearchDirection:=xlPrevious, _
                MatchCase:=False).Column
    End If

    Debug.Print LastCol
End Sub

EDIT. Это любезность @brettdj. Вы также можете использовать объект диапазона для поиска последнего столбца

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim LastCol As Long
    Dim rng As Range

    Set ws = Sheets("Sheet1")

    Set rng = ws.Cells.Find(What:="*", _
                After:=ws.Range("A1"), _
                Lookat:=xlPart, _
                LookIn:=xlFormulas, _
                SearchOrder:=xlByColumns, _
                SearchDirection:=xlPrevious, _
                MatchCase:=False)

    If rng Is Nothing Then
        LastCol = 1
    Else
        LastCol = rng.Column
    End If

    Debug.Print LastCol
End Sub

Чтобы получить последний столбец определенной строки, скажем, строка 1 использует этот

    Debug.Print ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

Где ws - ваш соответствующий рабочий лист.

Аналогично для строки см. this.

Ответ 2

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

Sub Sample()
    Dim ws As Worksheet
    Dim CurrRow, RowLastCol, LastRow, LastCol As Long

    Set ws = Sheets("Sheet1")

    '~~> This check is required else .FIND will give you error on an empty sheet
    If Application.WorksheetFunction.CountA(ws.Cells) = 0 Then
        LastCol = 1
    Else
        LastCol = 0
        LastRow = ws.Cells.Find(What:="*", _
                After:=ws.Range("A1"), _
                Lookat:=xlPart, _
                LookIn:=xlFormulas, _
                SearchOrder:=xlByRows, _
                SearchDirection:=xlPrevious, _
                MatchCase:=False).Row
        ' Loop through all the rows of the sheet saving off the highest column count
        For CurrRow = 1 to LastRow
            RowLastCol = ws.Cells(CurrRow, Columns.Count).End(xlToLeft).Column
            If RowLastCol > LastCol Then
                LastCol = RowLastCol
            End If
        Next CurrRow
    End If

    Debug.Print LastCol
End Sub