将包含数据的行转移到顶部

时间:2012-12-31 18:12:17

标签: excel-vba excel-2003 vba excel

我想知道是否有人可以帮助我。

这样我就可以维护一个给定的'输入范围'我试图将一个脚本放在一起,从用户选择的一行或多行中删除单元格内容。如果填充了从第7行开始的列“A”,则将包含数据的所有行移动到电子表格的顶部。

我已经将下面的代码放在一起,从行中删除了单元格内容,但我无法弄清楚如何将包含数据的行“向上移动”放在另一个下面,省略任何空行之间的行数据。

Sub DelRow()
    Dim msg

        Sheets("Input").Protect "password", UserInterFaceOnly:=True
        Application.EnableCancelKey = xlDisabled
        Application.EnableEvents = False
        msg = MsgBox("Are you sure you want to delete this row?", vbYesNo)
        If msg = vbNo Then Exit Sub
        With Selection
            Application.Intersect(.Parent.Range("A:R"), .EntireRow).Interior.ColorIndex = xlNone
            Application.Intersect(.Parent.Range("S:AD"), .EntireRow).Interior.ColorIndex = 37
            Application.Intersect(.Parent.Range("AF:AQ"), .EntireRow).Interior.ColorIndex = 42
            Selection.SpecialCells(xlCellTypeConstants).ClearContents
        End With
        Application.EnableEvents = True

End Sub

我已将下面显示的“排序”宏放在一起,虽然这适用于包含数据的两个连续行,但它对我使用“删除”宏的行不起作用。

例如,如果我填充“输入范围”的第一行和第二行,则代码会使用“B”列作为排序条件对电子表格进行正确排序。但是,如果我删除第一行的内容,从而创建一个空白行,则“排序”脚本不会向上移动第二行。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.EnableCancelKey = xlDisabled
    With Sheets("Input")
        If .Range("A7").Value = "" Then Exit Sub
        .Range("B7:AS400").Sort Key1:=Range("$B$1"), _
        Order1:=xlAscending, _
        Header:=xlGuess, _
        OrderCustom:=1, _
        MatchCase:=False, _
        Orientation:=xlTopToBottom, _
        DatOption1:=xlSortNormal
    End With
End Sub

我只是想知道是否有人可以看看这个,并提供一些指导我如何调整我的代码以便我可以添加排序功能。

非常感谢和亲切的问候

3 个答案:

答案 0 :(得分:0)

要根据您的代码删除行,您最好的选择是:

Selection.Delete Shift:=xlUp

如果您想确保删除整行,那么您需要这样:

Selection.EntireRow.Delete Shift:=xlUp

至于之后的排序,如果有必要,你应该研究Range.Sort


编辑:如果你想删除部分行,但具体可以这样做:

Range(Cells(Selection.Row,5),Cells(Selection.Row,8)).Delete Shift:=xlUp这会将删除应用于E-H列。

答案 1 :(得分:0)

尝试将标题更改为xlNo而不是xlGuess。 Excel可能“认为”您有一个标题行,它不会包含在要排序的行中,因此您的空行顶行将保留在那里。

即改变 Header:=xlGuessHeader:=xlNo

答案 2 :(得分:0)

在互联网上搜索更多内容后,我发现了以下文章: http://www.access-programmers.co.uk/forums/showthread.php?t=178521

使用这个,我已将我的'删除行'代码修改为以下完美无缺的代码:

Sub DelRow()
    Dim msg

        Sheets("Input").Protect "handsoff", UserInterFaceOnly:=True
        Application.EnableCancelKey = xlDisabled
        Application.EnableEvents = False
        msg = MsgBox("Are you sure you want to delete this row?", vbYesNo)
        If msg = vbNo Then Exit Sub
        With Selection
            Application.Intersect(.Parent.Range("A:R"), .EntireRow).Interior.ColorIndex = xlNone
            Application.Intersect(.Parent.Range("S:AD"), .EntireRow).Interior.ColorIndex = 37
            Application.Intersect(.Parent.Range("AF:AQ"), .EntireRow).Interior.ColorIndex = 42
            Selection.SpecialCells(xlCellTypeConstants).ClearContents
        End With
       Application.EnableEvents = True
            With Range("A7:AS400" & Cells(Rows.Count, "A").End(xlUp).Row)
            .Sort Key1:=Range("B7"), _
            Order1:=xlAscending, _
            Header:=xlNo, _
            OrderCustom:=1, _
            MatchCase:=False, _
            Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal
End With

End Sub

非常感谢所有善意提供帮助的人。

非常感谢,祝新年快乐。

亲切的问候