在Excel中打印之前对数据进行排序VBA并不总是有效

时间:2014-02-18 19:01:57

标签: excel vba sorting excel-vba

背景资料

我有一个大约有7列的列表。第7列是我用来对数据进行排序的特殊列。我有一个运行的onBeforePrint子程序,按最后一列对列表进行排序,然后在打印之前将其隐藏。

问题在于,有时候它会正常工作,而且所有东西都能正确排序,有时则不然。此外,当它确实有效时,在我点击它们之前,最后一列中的所有值都显示错误#!Value。当我点击它们时,它们通常(并非总是)改变回来,但是当它们不改变时,它的排序不再有效。任何想法?

代码

这部分代码是通过Record Macro按钮抓取的,另一部分是我自己添加的。 (即EntireColumn.Hidden部分)

Private Sub Workbook_BeforePrint(Cancel As Boolean)


    ActiveSheet.Range("G:G").EntireColumn.Hidden = False

    ActiveSheet.ListObjects(1).Range.Sort Key1:=Range("G1"), Order1:=xlAscending, Header:= _
        xlGuess, OrderCustom:=6, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal

    ActiveSheet.Range("G:G").EntireColumn.Hidden = True


End Sub

功能

此功能是最后一个单元格相同的功能。它接收诸如“A-7”,“HH-7”,“BB-31”,“7A-14”之类的值并将它们转换为基数36以便对它们进行排序以便所有单个字母和所有双字母按不同的组分类。此代码来自This Question

Public Function Base36Transform(r As Range) As Long
    Dim s As String, c As String
    Dim v
    Dim i As Integer
    Dim rv As Long

    v = Split(r.text, "-")
    s1 = v(0)
    s2 = v(1)
    s = Right("A" & s1, 2) & Right("A" & s2, 2)
    rv = 0
    For i = 1 To Len(s)
        c = Mid(s, Len(s) - i + 1, 1)
        If c Like "#" Then
            rv = rv + (Val(c) + 10) * (36 ^ (i - 1))
        Else
            ' c is like "[A-Z]"
            rv = rv + (Asc(c) - Asc("A")) * (36 ^ (i - 1))
        End If
    Next
    Base36Transform = rv
End Function

感谢任何帮助。一旦我工作的互联网停止搞砸了,我就会发布#VALUE东西的截图我的意思

0 个答案:

没有答案