-1

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

为了保持给定的“输入范围”,我正在尝试编写一个脚本,该脚本从用户选择的一行或多行中删除单元格内容。如果填充了从第 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

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

非常感谢和亲切的问候

4

3 回答 3

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

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

非常感谢,新年快乐。

亲切的问候

于 2013-01-01T16:07:13.033 回答
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

于 2012-12-31T21:15:16.997 回答
0

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

也就是说, Header:=xlGuess改为Header:=xlNo

于 2013-01-01T15:44:07.697 回答