Excel 将包含数据的行移到顶部
我想知道是否有人能帮助我 为了保持给定的“输入范围”,我正在尝试编写一个脚本,从用户选择的一行或多行中删除单元格内容。然后,如果从第7行开始的列“A”已填充,则将包含数据的所有行移动到电子表格的顶部 我将下面的代码放在一起,从行中删除单元格内容,但我无法解决如何将包含数据的行“上移”到另一行下,从而忽略数据之间的任何空白行Excel 将包含数据的行移到顶部,excel,excel-2003,vba,Excel,Excel 2003,Vba,我想知道是否有人能帮助我 为了保持给定的“输入范围”,我正在尝试编写一个脚本,从用户选择的一行或多行中删除单元格内容。然后,如果从第7行开始的列“A”已填充,则将包含数据的所有行移动到电子表格的顶部 我将下面的代码放在一起,从行中删除单元格内容,但我无法解决如何将包含数据的行“上移”到另一行下,从而忽略数据之间的任何空白行 Sub DelRow() Dim msg Sheets("Input").Protect "password", UserInterFaceOnly
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
我已经组合了一个如下所示的“Sort”宏,虽然它适用于包含数据的两个连续行,但它不适用于我使用“Delete”宏的行
例如,如果我填充了“输入范围”的第一行和第二行,代码将使用列“B”作为排序标准对电子表格进行正确排序。但是,如果删除第一行的内容,从而创建一个空行,“Sort”脚本不会向上移动第二行
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
我只是想知道是否有人可以看看这一点,请提供一些指导,我需要如何调整我的代码,以便我可以添加排序功能
非常感谢和问候要根据您的代码删除该行,您最好的选择是:
Selection.Delete Shift:=xlUp
如果要确保删除整行,请执行以下操作:
Selection.EntireRow.Delete Shift:=xlUp
至于以后的分类,如果有必要的话,你应该调查一下
编辑:如果要删除行的一部分,但要具体,可以执行以下操作:
范围(单元格(Selection.Row,5),单元格(Selection.Row,8))。删除移位:=xlUp
这会将删除应用于列E-H
尝试将标题更改为xlNo而不是xlGuess。Excel可能“认为”您有一个标题行,它不会包含在要排序的行中,因此您的空白顶行将保留在那里
也就是说,改变
Header:=xlGuess
到Header:=xlNo
在互联网上进行更多搜索后,我发现了以下文章:
使用此选项,我将“删除行”代码修改为以下代码,效果非常好:
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
非常感谢所有好心提供帮助的人
非常感谢,祝你新年快乐
在回答您的问题并重新阅读您的问题后,向您致以亲切的问候。。。你真的是想删除整行,还是只是其中的一部分?嗨@Daniel Cook,谢谢你花时间回复我的帖子。我没有删除行,因为我需要“输入范围”保持非托管状态,所以我将删除单元格内容。根据我对您最初评论的回答,非常感谢并感谢Daniel Cook。我不想删除该行,因为我需要维护一个固定的“输入范围”。除非有另一种方法,我非常高兴能被展示出来,否则我所知道的唯一能做到这一点的方法就是清除单元格内容。但是我想,如果可能的话,请将包含数据的任何行移到顶部,这样在包含数据的行之间就没有空行了。非常感谢和亲切的问候。嗨@Daniel Cook,非常感谢你在这件事上回到我身边。我已经整理了一个“排序”脚本,现在已经包含在我的原始帖子中。如果我添加两个连续的包含数据的行,则使用列“B”作为排序标准,排序将正常工作。但是,如果我最初使用“删除”宏,则正确删除单元格的内容,从而创建一个空白行,但排序函数不会将第二行移动,从而移除空白行。我希望这有帮助。非常感谢并感谢Daniel Cook,请查看我发布的答案。善良的regardsHi@Lord Peter,感谢您抽出时间回复我的帖子。请看我发布的答案。问候