【问题标题】:Excel VBA macro to sort alphabetically before saveExcel VBA宏在保存前按字母顺序排序
【发布时间】:2018-04-11 15:05:44
【问题描述】:

在 Excel 中,我试图在新行中输入数据,当我保存时,让它自动按 A 列中的值的字母顺序对所有填充的行进行排序(本质上,我想消除单击“排序”的麻烦每次保存前的 A 到 Z”)。我在工作表的代码中有以下内容(工作簿包含三个工作表,我只希望这个宏对其中一个进行操作)

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    On Error Resume Next
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        Range("A1").Sort Key1:=Range("A3"), _
          Order1:=xlAscending, _
          MatchCase:=False, _
          Orientation:=xlTopToBottom
    End If 
End Sub

注意:key1 范围从 A3 开始,因为第 1-2 行是标题。谁能弄清楚为什么这段代码不起作用?我并没有真正编码,所以如果缺少某些东西,我将不知道。我知道启用宏不是问题,因为我可以手动运行其他宏没有问题,只是这个自动的宏不起作用。

【问题讨论】:

  • 您是否将此代码放在ThisWorkbook 部分?这是一个事件,所以它需要在那里而不是在自定义模块/工作表中。*.com/questions/12365417/… 供参考
  • 它不起作用,因为没有目标。 Yo9u 复制了太多代码,你正在使用错误恢复下一个。

标签: vba excel


【解决方案1】:

它不起作用,因为没有目标。您从获得此代码的任何地方复制了太多代码,并且您正在使用错误恢复下一个,因此任何错误都被简单地跳过。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    with thisworkbook.worksheets("sheet1")
        with .cells(1, "A").currentregion
            .cells.offset(1, 0).Sort Key1:=.columns(1), Order1:=xlAscending, _
                                     Orientation:=xlTopToBottom, header:=xlyes
        End with
    End with
    SaveAsUI  = false
    Cancel = false
End Sub

【讨论】:

  • 我尝试使用您的代码,但也没有用。我还尝试了 Jerry 答案中的代码,至少这给了我一个运行时错误,但是您提供的代码根本没有运行。
  • 更新:关闭文件,稍后重新打开并再次尝试您的代码后,它现在返回运行时错误“9”。调试指向同一行,“with thisworkbook.worksheets("sheet1")”,但我不知道这有什么问题。将措辞更改为 "ThisWorkbook.Sheets("Sheet1")" 没有区别。
  • @ETL - 上面的有效示例使用完全限定的范围引用并假设您有一个名为 e.g. 的工作表“表 1”;如果您没有这样的工作表,您将收到错误 9“下标超出范围”,因为 Excel 在工作表集合中找不到此字符串。只需将ThisWorkbook.Worksheets("Sheet1") 中的工作表名称更改为您的实际名称即可。
【解决方案2】:

此宏将对您指定的范围进行排序。如果需要低于 A12,则需要编辑底部单元格范围

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)

With ThisWorkbook.Worksheets("Sheet1")
Dim LastRow As Long
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Range("A3:A12" & LastRow).Sort Key1:=Range("A3:A12" & LastRow), _
       Order1:=xlAscending, Header:=xlNo
End With

End Sub

【讨论】:

  • 试过这段代码,得到一个运行时错误,说下标超出范围。显然这条线有问题:With ThisWorkbook.Worksheets("Sheet1"),虽然我不知道为什么会这样
【解决方案3】:

发现前面两个回复的问题是我重命名了我的工作表,所以我需要将ThisWorkbook.Worksheets("Sheet1") 更改为Sheet1

最后,每当我保存工作簿时,我想按字母顺序排列工作簿中三个工作表中的两个,所以在记录宏功能的帮助下弄清楚我到底在做什么,我最终得到了以下结果代码:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Application.ScreenUpdating = False
Sheet1.Sort.SortFields.Clear
    Sheet1.Sort.SortFields.Add Key _
        :=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With Sheet1.Sort
        .SetRange Range("A:D")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Sheet2.Sort.SortFields.Clear
        Sheet2.Sort.SortFields.Add Key _
            :=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        With Sheet2.Sort
            .SetRange Range("A:D")
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    SaveAsUI = False
    Cancel = False
Application.ScreenUpdating = True
End Sub

【讨论】:

  • 注意:我不知道如何将标题指定为第 1 行和第 2 行,所以我只是在 A2 的值中放置了一个前导空格,以便第 2 行始终排在第一位。跨度>
最近更新 更多