Excel宏自动调整所有包含数据的行 - 或 - 整个工作表*已更新*

时间:2016-12-07 18:29:13

标签: excel vba excel-vba macros

****更新为排序现在有效,只需要如何动态自动调整行,而无需定义行自动调整。列的withh总是相同的,可以是硬代码***

新手在这里,VBA有限。

我有一个当前的项目,虽然我的问题可能看起来很基本,但考虑到我已准确完成了多少步骤,我似乎无法在不定义行的情况下自动调整所有行。

我可以通过范围来完成,但每个月报告中的条目数量都不同。

我的宏要素需要一个报告(名称每个月都会更改,因为它是由另一个应用程序以凌乱的Excel格式导出)并清理它。稍后,它将通过其他方法转换为SharePoint数据表列表。

由于我更像是一名工作流程编写人员,因此我将所有内容拼写出来。如果有什么我可以清理简化,我也学会喜欢它。

宏如下:(请原谅格式错误,尝试复制到问题中)

Sub ComponentBalRptCleanup()

'Unmerge all Cells in Worksheet
ActiveSheet.Cells.UnMerge

'Delete Columns A1 thru D1
Range("A1:D1").EntireColumn.Delete

'Delete Rows A1 thru A9
Range("A1:A9").EntireRow.Delete

'Cut and Paste Cells
Range("A2").Cut Range("A1")
Range("G1").Cut Range("F1")
Range("P1").Cut Range("O1")
Range("AA1").Cut Range("Z1")

'Sort by Column A to Remove Extra Rows from View
 Columns("A:AN").Sort key1:=Range("A:A"), order1:=xlAscending, Header:=xlYes

'Auto Fit Contents in Columns and Rows
     ActiveCell.Columns("A:AG").EntireColumn.Select
    ActiveCell.Columns("A:AG").AutoFit
ActiveCell.Rows("1:77").EntireRow.Select
       ActiveCell.Rows("1:77").EntireRow.AutoFit

'Delete Empty Columns
Range("B:B, D:D, G:I, K:L, N:N, P:Q, T:V, X:Y, AA:AB, AD:AF").EntireColumn.Delete

'Remove Wrap Text from Cell B1
Range("B1").WrapText = False

'Autofit Contents of Columns
Range("A1:AF1").Columns.AutoFit

'Autofit Row A2 Contents
Range("A2:A2").Rows.AutoFit

'Save File As
Application.GetSaveAsFilename

End Sub

1 个答案:

答案 0 :(得分:0)

我会说主要的问题是你的排序。在VBA中对可变范围进行排序很棘手。我强烈建议使用命名范围。 您可以选择电子表格的“有效”区域,并使用以下语句为其命名:

Range("A1").Select
Selection.CurrentRegion.Select
Selection.Name = "myRange"

之后,使用myRange而不是静态地址。这是一个简单的例子:

Sub NameRangeAndSort()
' Create Named Range and Sort by 1st column
    Dim TotalRows As Integer
    Range("A1").Select
    Selection.CurrentRegion.Select
    Selection.Name = "myRange"

    ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear
    ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=Range("A1") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.ActiveSheet.Sort
        .SetRange Range("myRange")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

您还在几个autofit语句中重复了两次EntireColumn。每个声明只应包含一次。