【问题标题】:Excel: Sorting cells with numbersExcel:用数字对单元格进行排序
【发布时间】:2018-12-04 09:56:46
【问题描述】:

当前代码:

        Public Sub A()
    j = 1
    For i = 1 To 10
        If Cells(i, 1) > 0 Then
         Cells(j, 2) = Cells(i, 1)
         j = j + 1
    [B1:B10].Sort key1:=[B1]
        End If

Next

End Sub

它的工作原理是它确实从 A 列复制到 B 列并对正数进行排序。我现在的问题是如何让它在正数下包含负数并按降序写下来?全部在B列。

原文:我目前正在用 excel 学习 VBA,但我被困在一个 任务。我有一列 A1:A20,每个单元格都存储一个数字。我需要 将相同的范围复制到 B1:B20 并将数字排列在 升序。我的问题是我该怎么做?

【问题讨论】:

  • 虽然您的问题有多个答案,但请注意,任何问题都应包含您尝试过的代码,并说明您遇到的错误/问题。

标签: excel vba


【解决方案1】:
[A1:A20].Copy [B1]
[B1:B20].Sort Key1:=[B1]

【讨论】:

  • 它不会比这更短。顺便说一句,例如[A1:A20] 代表 ActiveWorkbook.ActiveSheet.Range("A1:A20")。不错。
  • @VBasic2008 谢谢!如果排除命名参数Key1,它会变得更短一些。 :) 是的,这个符号表示活动工作表的范围。
  • 你能想象我下面的数组冒泡排序版本在给定范围内实际上快了三倍吗?当然,它只会更快,直到大约 120 条记录。之后它呈指数下降:在 1000 条记录时,它至少慢 25 倍,在 2000 条记录时,它至少慢 75 倍,在 10000 条记录时,它至少慢 1200 倍,是的,慢 1200 倍。肯定要调查快速排序。
  • @JohnyL 谢谢,我了解第一行的工作原理,但第二行如何确定数字的排序方式?例如,如果我想按降序对它们进行排序,甚至按升序列出所有 >0 个数字,然后在同一 B 列中列出
  • @Rob 如果要升序或降序,可以使用Order1参数:Order1:=xlAscendingOrder1:=xlDescending。至于其他的排序方式,就得写专门的代码了。
【解决方案2】:

粘贴已排序的范围(范围、数组、排序、范围)

Option Explicit

Sub PasteSortedRange()

  Const cStrSource As String = "A1:A20"   ' Source Range
  Const cStrTarget As String = "B1:B20"   ' Target Range

  Dim vntSource As Variant                ' Array

  Dim lngR1 As Long                       ' Outer Array Counter
  Dim lngR2 As Long                       ' Inner Array Counter
  Dim dblTemp As Double                   ' Temporary Number Storage

  With ThisWorkbook.ActiveSheet

    ' Paste Source Range into Array.
    vntSource = .Range(cStrSource).Value2

    ' Sort Array.
    For lngR1 = 1 To UBound(vntSource) - 1
      For lngR2 = lngR1 + 1 To UBound(vntSource)
        If vntSource(lngR1, 1) > vntSource(lngR2, 1) Then
          dblTemp = vntSource(lngR1, 1)
          vntSource(lngR1, 1) = vntSource(lngR2, 1)
          vntSource(lngR2, 1) = dblTemp
        End If
      Next
    Next

    ' Paste Array into Target Range.
    .Range(cStrTarget) = vntSource

  End With

End Sub

【讨论】:

    【解决方案3】:

    假设你有一列的数字在 range("A1:A20")

    Sub paste_and_filter()
    
    'Variable declaration
    Dim rng As Range, rng2 As Range
    
    'Set up of objects
    Set rng = Range("A1:A20")
    Set rng2 = Range("B1:B20")
    
    'Copy and paste the column
    rng.Select
    Selection.Copy Destination:=rng2
    
    'Filter
    With ActiveSheet.Sort
        .SortFields.Clear
        .SortFields.Add rng2, xlSortOnValues, xlDescending, xlSortNormal
        .SetRange rng2
        .Header = False
        .MatchCase = False
        .Orientation = xlSortColumns
        .Apply
    End With
    
    End Sub
    

    【讨论】:

      【解决方案4】:

      点击开发者和录制宏(如果你没有看到开发者菜单follow this tutorial。选择单元格A1:A20。复制到B1:B20 (Ctrl+C kbd>, Ctrl+V 效果最好)。点击数据,排序,不要展开选择,不要点击“我的数据有标题”,点击确定.回到Developer菜单并点击Stop Recording。按Alt+F11检查你刚刚创建的代码。

      【讨论】:

      • 您好,感谢您的回复。我按照宏录制步骤进行操作,但是一旦按下 Alt-F11,它就会显示为空白,不显示任何代码。 Nvm,通过宏找到它>选择录制的一个>编辑,现在它显示代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 2013-11-14
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多