所以,我遇到了数据排序问题。
本质上,我想对第 2 行到第 48 行的单元格进行排序,使它们低于第 1 行中的近似值(下图中的省略号用作该行中所有其他单元格的占位符;所有行, 1 到 48,将从 EG 延伸到 IB,使每行总共 100 个单元格)。
数据通常如下所示:
但我要求第 2 行到第 48 行的数据以近似值(1.2 以内)排序在第 1 行对应项的下方,如下所示:
现在对值进行排序,使用第 1 行作为所有其他行排序的主行。如果第 2-48 行中没有单元格值满足与其第 1 行对应值的 1.2 以内的条件,则该行中的单元格必须留空。
我最初的代码是这样写的:
Sub t()
Dim F As Range
Dim Q As Range
For Each F In Range("EG1:IB1").Cells
For Each Q In Range("EG2:IB2").Cells
If Q.Value <= (F.Value + 1.2) Then
F.Offset(1, 0).Value = Q.Value
Exit For
End If
Next Q
Next F
End Sub
显然,这段代码没有产生预期的结果,但我不知道为什么。目的是对照第 2 行迭代检查第 1 行的数据值,如果在第 2 行中找到符合必要条件的值(在当前第 1 行单元格值的 1.2 范围内),则将其放置在行中相应值的下方1.
所以,假设:
- 第 1 行将在所有 100 个单元格中包含数据值,并且
- 第 2-48 行不会在所有 100 个单元格中都有数据,并且
- 不包含数据的单元格将为空,并且
- 我希望将代码限制为一次对一行进行排序(为了安全起见,在每个程序运行时根据第 1 行检查并排序单行)
如何重写(如果需要的话,完全重写)我的代码,以便可以对数据进行排序(如第一张图片中所示),以最适合第二张图片中示例的数据组织?
提前谢谢您,如果这实际上是一个我忽略的非常简单的解决方案,请原谅我!!
最好,
最佳答案
对每行进行横向排序应该纠正所有无序值,并将它们全部“挤在一起”在 EG1:IB48 范围的左端。之后,插入一个新单元格(向右移动行上的其他值)应该可以纠正位置。
Sub sort_and_push()
Dim rw As Long, cl As Long
With Worksheets("Sheet4") '<~~ set this correctly!
With .Range("EG1:IB48")
With .Rows(1)
.Cells.sort Key1:=.Rows(1), Order1:=xlAscending, _
Orientation:=xlLeftToRight, Header:=xlNo
End With
For rw = 2 To .Rows.Count
.Rows(rw).Cells.sort Key1:=.Rows(rw), Order1:=xlAscending, _
Orientation:=xlLeftToRight, Header:=xlNo
For cl = 1 To 99
If IsEmpty(.Cells(rw, cl)) Then
Exit For
ElseIf .Cells(rw, cl).Value2 > .Cells(1, cl + 1).Value2 Then
.Cells(rw, cl).Insert Shift:=xlToRight
End If
Next cl
Next rw
End With
End With
End Sub
关于vba - 如何有条件地将一行中的数据排序为第二行中的近似数据匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33335926/