简体   繁体   中英

Apply Dynamic Range in ActiveSheet.Range

I have run a macro to paste, edit, alter and split data using a specified data set.

On a new data set (more data) I ran into a problem with my data range.

ActiveSheet.Range("$A$1:$T$299").AutoFilter Field:=6, Criteria1:= _
  "=Site Reference A", Operator:=xlOr, Criteria2:= _
  "=Site Reference A  Total"
Range("A1:T299").Select
Range("F160").Activate
Selection.SpecialCells(xlCellTypeVisible).Select
Selection.Copy

My data range is $A$1:$T$299. How would I make this dynamic?

Example -
Data set A has 200 columns.
Data set B has 230 columns.

A little long, but this full code is the safer way to find the last row and last column in a sheet.

Dim Sht As Worksheet
Dim FiltRng As Range
Dim LastCol As Long
Dim LastRow As Long

Set Sht = ActiveSheet '<-- better not rely on ActiveSheet

LastRow = FindLastRow(Sht)
LastCol = FindLastCol(Sht)

With Sht
    Set FiltRng = .Range(.Cells(1, 1), .Cells(LastRow, LastCol)) ' <-- set the filtered range dynamically
End With

With Sht
    FiltRng.AutoFilter Field:=6, Criteria1:= _
        "=Site Reference A", Operator:=xlOr, Criteria2:= _
        "=Site Reference A  Total"

    ' rest of your code goes here

End With

'==========================================================

Function FindLastCol(Sht As Worksheet) As Long

' This Function finds the last col in a worksheet, and returns the column number

Dim LastCell As Range

With Sht
    Set LastCell = .Cells.Find(What:="*", After:=.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, _
                        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)
    If Not LastCell Is Nothing Then
        FindLastCol = LastCell.Column
    Else
        MsgBox "Error! worksheet is empty", vbCritical
        End
    End If
End With

End Function

'==========================================================

Function FindLastRow(Sht As Worksheet) As Long

' This Function finds the last row in a worksheet, and returns the row number

Dim LastCell As Range

With Sht
    Set LastCell = .Cells.Find(What:="*", After:=.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, _
                        SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
    If Not LastCell Is Nothing Then
        FindLastRow = LastCell.Row
    Else
        MsgBox "Error! worksheet is empty", vbCritical
        End
    End If
End With

End Function

If there is no other data in column A, you can use a dynamic named range. Just use the following formula as the range for your named range and then reference the named range in your code. Keep in mind that this only works if there is no other data in column A.

 =OFFSET($A$1,0,0,COUNTA($A:$A),1)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM