excel 将单元格引用动态存储为VBA中的变量,然后使用存储的变量选择(和删除)区域

xytpbqjk  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(131)

我目前有一个VBA宏,它可以将常规数据提取转换为表。在宏中,我定义了一个范围,该范围足够大,可以超过通常提取的行数。

ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$AG$20000"), , xlYes).Name _
    = "Table1"

然后我的宏对表格进行一些其他的转换/添加公式等,然后表格通过PowerBI呈现。
我想删除表中多余的行-这因每次提取而异。
在下面的示例中-它记录了所需的步骤序列,只有186行。

Range("Table1[[#Headers],[Client Id]]").Select
Selection.End(xlDown).Select
Range("A187").Select
Range(Selection, Selection.End(xlDown)).Select
Rows("187:20000").Select
Selection.Delete Shift:=xlUp

我想存储的范围(“A187”)作为一个变量,然后我想插入存储的变量在选择187:20000
或者,如果我可以对我想转换成表的范围进行可变选择,那也会起作用。
任何帮助将不胜感激。

wn9m85ua

wn9m85ua1#

下面将创建一个表格来拟合数据,假设没有额外的数据单元格:

ActiveSheet.ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion, , xlYes).Name = "Table1"

如果需要强制列只包含"A:AG",请用途:

ActiveSheet.ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion.Columns("A:AG"), , xlYes).Name = "Table1"

ActiveSheet.ListObjects.Add(...).Name = "Table1"是一个录制的宏创建表的方式。为了避免命名冲突,我将避免使用通用的Table1作为名称。
如果名称不重要,请使用:

ActiveSheet.ListObjects.Add xlSrcRange, Range("A1").CurrentRegion.Columns("A:AG"), , xlYes

如果工作表上只有一个表,则可以将其引用为:

ActiveSheet.ListObjects(1)
nkoocmlb

nkoocmlb2#

删除底部空行(应用于Excel表格(ListObject))

Sub DeleteEmptyBottomRowsTEST()
     
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1")
    Dim tbl As ListObject: Set tbl = ws.ListObjects("Table1")
    
    ' Remove possible filters.
    ' The Find method will fail if the table is filtered.
    If tbl.ShowAutoFilter Then
        If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
    End If
     
    Dim rg As Range: Set rg = tbl.DataBodyRange
    If rg Is Nothing Then Exit Sub
     
    DeleteEmptyBottomRows rg

End Sub

Sub DeleteEmptyBottomRows(ByVal rg As Range)
    
    Dim lCell As Range
    Set lCell = rg.Find("*", , xlFormulas, , xlByRows, xlPrevious)
    If lCell Is Nothing Then rg.Delete xlShiftUp: Exit Sub
    
    Dim rOffset As Long: rOffset = lCell.Row - rg.Row + 1
    Dim rCount As Long: rCount = rg.Rows.Count
    If rOffset = rCount Then Exit Sub
    
    Dim rResize As Long: rResize = rCount - rOffset
    rg.Resize(rResize).Offset(rOffset).Delete xlShiftUp

End Sub

相关问题