【问题标题】:sort for a set range排序一个设定的范围
【发布时间】:2021-11-30 01:21:03
【问题描述】:

我正在尝试对之前设置的范围进行排序,但它不起作用,而且我无法找到问题所在。因此,欢迎任何帮助

我的程序对特定工作表中的所有数据进行排序,然后根据条件设置范围。

Sub References_Sort()

    ' Activate Worksheet
    Dim ws As Worksheet
    Set ws = Application.ThisWorkbook.Worksheets("Hoja2")
    ws.Activate

    'Set variables
    Dim LastColumn, LastRow, FirstRow As Integer
    Dim rngCom As Range
    Dim i As Long
   
   'Sort the rows based on the data in column E
    ws.Columns("A:I").Sort _
        key1:=Range("E2"), _
        order1:=xlAscending, _
        Header:=xlYes
        
    'Find which is the last row and last column with data
    LastColumn = Cells(1, Columns.Count).End(xlToLeft).Column
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
        
    With ws
        'Find first row with value=5 in column E
        FirstRow = .Range("E:E").Find(What:=5, After:=.Range("E1")).Row
        ' Set range which includes data with value=5 in column E
        Set rngCom = .Range(Cells(FirstRow, "A"), Cells(LastRow, LastColumn))
          
        'Sort set range based on the data in column B
        rngCom.Sort _
            key1:=Range("B2"), _
            order1:=xlAscending, _
            Header:=xlYes
            
    End With

End Sub

【问题讨论】:

  • 哪一部分“不起作用”?你有错误吗?你有没有尝试通过它来观察它在做的时候做了什么?
  • 嗨@braX。执行代码时不会出现任何错误。看起来它工作得很好,但是它不会对 rngCom 中包含的数据进行排序。因此,除了这部分代码之外,似乎一切都按预期工作:``` '根据 B 列中的数据对集合范围进行排序 rngCom.Sort _ key1:=Range("B2"), _ order1:=xlAscending, _标头:=xl是```
  • 代码运行时,Range("B2") 的计算结果是否符合您的预期?

标签: excel vba sorting


【解决方案1】:

您的某些Range 对象不合格。

像这样对它们进行限定(参见 cmets):

Sub References_Sort()

    ' Activate Worksheet
    Dim ws As Worksheet
    Set ws = Application.ThisWorkbook.Worksheets("Hoja2")
    ws.Activate

    'Set variables
    ' Dimmed them as Long instead of 2 variants and 1 integer
    Dim LastColumn As Long, LastRow As Long, FirstRow As Long
    Dim rngCom As Range
    Dim i As Long
   
   'Sort the rows based on the data in column E
   ' (added ws. to the range object)
    ws.Columns("A:I").Sort _
        key1:=ws.Range("E2"), _
        order1:=xlAscending, _
        Header:=xlYes
        
    'Find which is the last row and last column with data
    ' these cells references should probably be qualified too 
    ' added ws. to them
    LastColumn = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
        
    With ws
        'Find first row with value=5 in column E
        FirstRow = .Range("E:E").Find(What:=5, After:=.Range("E1")).Row
        ' Set range which includes data with value=5 in column E
        ' fixed missing qualifications here too
        Set rngCom = .Range(.Cells(FirstRow, "A"), .Cells(LastRow, LastColumn))
          
        'Sort set range based on the data in column B
        ' (added a . to the Range object to qualify it using the with)
        rngCom.Sort _
            key1:=.Range("B2"), _
            order1:=xlAscending, _
            Header:=xlYes
            
    End With

End Sub

仅作记录,OP 希望对此进行更改(请参阅 cmets):

rngCom.Sort _
key1:=.Range("B1"), _ 
order1:=xlAscending, _ 
Header:=xlNo

【讨论】:

  • 我试过你的代码加了一个“。”对 Range 对象进行限定,但随后出现编译错误。
  • 在最后的排序中,rngCom 中的数据应该按照 B 列的值排序,这可能是问题所在。
  • 只有你才能知道你所期望的,所以是的,仔细检查每一件,看看它们是否都是你所期望的。每个范围/单元格引用都需要限定。
  • 感谢@braX 的帮助。现在可以了 :) 我按照您的建议对所有范围/单元格进行了限定,然后,我修改了排序方法中的一些行 ``` rngCom.Sort _ key1:=.Range("B1"), _ order1:=xlAscending, _ 标头:=xlNo```.
猜你喜欢
  • 1970-01-01
  • 2017-09-23
  • 2018-03-29
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 2013-10-10
  • 2014-02-22
相关资源
最近更新 更多