【问题标题】:VBA - Descending Sort Works Only When Stepping Through CodeVBA - 降序排序仅在单步执行代码时有效
【发布时间】:2016-06-10 04:50:05
【问题描述】:

我正在尝试按降序对列进行排序。当我单步执行代码时,代码工作得很好,但是当宏完全运行时,数据没有排序。我无法弄清楚为什么会这样。这是一段代码:

Dim temp_str as String
Dim lrow as Long
Dim DOX_Net_Lvl_Col_Loc as Long
Dim DOX_ws as WorkSheet
Set DOX_ws = ThisWorkbook.Sheets("DOX")

' Sort Netting Level in descending order
With DOX_ws
    .Activate
    temp_str = ConvertToLetter(DOX_Net_Lvl_Col_Loc)
    .Range(temp_str & "1:" & temp_str & lrow).Sort _
       Key1:=.Range(temp_str & "1"), Order1:=xlDescending
End With

Function ConvertToLetter(ColNo As Long) As String
    ConvertToLetter = Split(Cells(, ColNo).Address, "$")(1)
End Function

显然,这只是整体代码的一个 sn-p。我已经确认lrowtemp_str 计算正确。此外,在测试代码时,我确认.Range(temp_str & "1:" & temp_str & lrow).Select 抓取了我想要排序的全部范围。什么会阻止代码在宏完全运行期间工作?

为了提供更多上下文,填充文件/排序列的子(我们称之为“DOX”)仅从不同的子(我们称之为“主”)调用。当我自己运行 DOX 子程序时,排序工作得很好。我正在使用 Excel 2010。

【问题讨论】:

  • 我测试了代码并且运行良好(使用调试器并单独运行)。我唯一能想到的是,由于某种随机原因,是否有来自另一个子的剩菜(因为你说它是称为)。可能有干扰的自动过滤器(在 .Activate DOX_ws 工作表之后设置 .AutoFilterMode = False),或过滤器的工作表保护。
  • 尝试将cells 限定在ConvertToLetter 中得到split
  • .AutoFilterMode = False 不走运,在运行 Master 子程序时仍然未排序。 ConvertToLetter 函数工作正常 - 它返回预期的内容(在本例中为“K”)。
  • 是否有任何“Application.ScreenUpdating = False”裁决?
  • 我在调用 DOX 子的 MASTER 子中确实有 Application.ScreenUpdating = False。不过这应该没关系吧?

标签: vba excel sorting


【解决方案1】:

我想出了一个解决方案。如果我将范围更改为.Range("A1:" & temp_str & lrow).Sort,那么它可以工作。我想它需要整个数据范围来执行排序;显然,仅仅给它列是不够的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多