【问题标题】:Column Sort not sorting referenced column, only on active column列排序不排序引用的列,仅在活动列上
【发布时间】:2015-03-14 13:24:03
【问题描述】:

我正在尝试修改一些代码,将两个单独的范围复制并粘贴到另一个工作表上,然后按字母顺序对其进行排序。问题是当我隐藏工作表时 - 即使我取消隐藏并重新隐藏它以运行宏 - 它似乎只在活动列上排序。

我在下面的第二个宏中用粗体标出了排序代码。 GetNamesList 宏在其代码末尾调用 ConsolidateList。

GetNamesList 设置为在工作簿打开时运行:

Private Sub Workbook_Open()
GetNamesList
End Sub

GetNamesList 的原始代码来自:http://bit.ly/1y3dU6n by @Siddharth-rout

Sub GetNamesList()
Dim rng As Range, aCell As Range
Dim MyAr() As Variant
Dim n As Long, i As Long

Application.ScreenUpdating = False
Sheet28.Visible = True

'~~> Change this to the relevant sheet
With Sheet3
    '~~> Non Contiguous range
    Set rng = .Range("Table2[Contact 1],Table2[Contact 2]")

    '~~> Get the count of cells in that range
    n = rng.Cells.Count

    '~~> Resize the array to hold the data
    ReDim MyAr(1 To n)

    n = 1

    '~~> Store the values from that range into
    '~~> the array
    For Each aCell In rng.Cells
        MyAr(n) = aCell.Value
        n = n + 1
    Next aCell
End With

'~~> Output the data in Sheet

'~~> Vertically Output to sheet 28
Sheet28.Cells(1, 1).Resize(UBound(MyAr), 1).Value = _
Application.WorksheetFunction.Transpose(MyAr)

ConsolidateList

Sheet28.Visible = False
Application.ScreenUpdating = True
End Sub

ConsolidateList 是:

Sub ConsolidateList()
'
' ConsolidateList Macro
' Remove duplicates and blanks
'

  With Sheet28.Range("A1:A1000")
    .Value = .Value
    .RemoveDuplicates Columns:=1, Header:=xlNo
    On Error Resume Next
    .SpecialCells(xlCellTypeBlanks).Delete xlShiftUp
    On Error GoTo 0
End With

Columns("A:A").Sort Key1:=Range("A1"), Order1:=xlAscending

End Sub

感谢您的帮助...

**更新 - 录制宏来做同样的事情...

Sub TestSort()
'
' TestSort Macro
'
Sheets("Jan").Select
Sheets("Sheet1").Visible = True
ActiveWindow.SmallScroll Down:=-405
Range("A1:A134").Select
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
    .SetRange Range("A1:A134")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
ActiveWindow.SmallScroll Down:=-245
Sheets("Sheet1").Select
ActiveWindow.SelectedSheets.Visible = False
End Sub

【问题讨论】:

  • 使用特定工作表限定范围,例如Sheets("Sheet1").Columns("A:A").Sort
  • 谢谢@SI 试过了,但它告诉我“排序引用无效。确保它在范围内,并且第一个排序依据框不一样或空白” ??
  • 您是否尝试过记录排序操作并将其与您的代码进行比较?
  • @SO - 上面的结果...对我来说,这里的问题是它使用 ActiveWorksheet 并引用了确切的范围 A1:A134,它会随着时间的推移而增长...
  • 因此您可以将 ActiveWorksheet 替换为 Sheets("Sheet1") 或其他任何东西。您可以在排序之前将范围设置为变量并使用变量的地址属性:)

标签: excel vba sorting reference


【解决方案1】:

谢谢@S-O。通过接受您的建议并对记录的代码感到困惑,我能够拼凑出以下内容:

Sub ConsolidateList()
'
' ConsolidateList Macro
' Remove duplicates and blanks
'

  With Sheet28.Range("A1:A1000")
    .Value = .Value
    .RemoveDuplicates Columns:=1, Header:=xlNo
    On Error Resume Next
    .SpecialCells(xlCellTypeBlanks).Delete xlShiftUp
    On Error GoTo 0
End With

Sheet28.Sort.SortFields.Clear
Sheet28.Sort.SortFields.Add Key:=Range("A1"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
    .SetRange Range("A1:A134")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

End Sub

虽然 ActiveWorkbook 似乎已经潜入其中......!

**更新

替换

With ActiveWorkbook.Worksheets("Sheet1").Sort
    .SetRange Range("A1:A134")

与:

在顶部

Dim Lastrow As Integer

然后

Lastrow = Sheet28.Cells.Find("*", searchorder:=xlByRows,searchdirection:=xlPrevious).Row
    With Sheet28.Sort
    .SetRange Range("A1:A" & Lastrow)

解决了...

【讨论】:

    猜你喜欢
    • 2019-10-26
    • 2020-07-02
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2023-03-30
    相关资源
    最近更新 更多