vba最低的字母数字文本

时间:2015-03-10 17:44:55

标签: vba excel-vba excel

如何从一系列细胞中获得最低的字母数字细胞值?我不想对单元格进行排序,我也不想只查看数字值。如果我有以下单元格:

2A1111
4B0011
2Z0011
2A0011

Excel应该知道2A0011是最低值,因为它将它们正确排序为:

2A0011
2A1111
2Z0011
4B0011

在我的宏中,我将一行中每个单元格的值与该行中最低值的单元格进行比较。如果单元格具有更高的值,则会在其位置添加新的(空白)单元格,并且单元格下方的整个列会向下移动。

For cell = 1 To rLastCell.Columns.Count
    If Cells(row, cell) > Application.WorksheetFunction.Min(rLastCell.Rows(row)) Then
        If Not rng2 Is Nothing Then
            Set rng2 = Union(rng2, rLastCell(row, cell))
        Else
            Set rng2 = rLastCell(row, cell)
        End If
    End If
Next

这适用于所有带有数字的行 - 仅在我的传感器中,但当行包含字母数字文本时,.Min(rLastCell.Rows(row))的值为0,因此会将行中的每个单元格向下移动。

作为旁注 - 几乎所有与此相关的帖子都涉及忽略单元格中的字母,这意味着2A0011和2Z0011被视为相等。

编辑:@Ditto我没有足够的代表来发布截图,所以我会尝试在下面格式化它...

2807516 1153634 1153634 3332241

3332241 2319999 2319999 3344644

3344644 2420083 2420083 3347024

3347024 2734988 2734988 3349486

3349486 2807516 2807516 3353163

以上内容将重新格式化为下表。

------- 1153634 1153634 ------- 

------- 2319999 2319999 ------- 

------- 2420083 2420083 ------- 

------- 2734988 2734988 ------- 

2807516 2807516 2807516 ------- 

3332241 ------- ------- 3332241

3344644 ------- ------- 3344644

3347024 ------- ------- 3347024

3349486 ------- ------- 3349486

------- ------- ------- 3353163

下面是一些字母数字数据的示例

2P9864  0V5170  0V5170  2P9864

5N7531  2P9864  2P9864  2W8150

3N8572  3L0415  3L0415  3N8572

5N7531  5N7531  4W1704  5N7531

6F5985  6F5985  5N7531  6F5985

抱歉可怕的格式化。发布表格没有好办法!

1 个答案:

答案 0 :(得分:0)

数据效果很好..作为截图,我无法在这里查看(从工作中),现在我可以复制/粘贴它了;)

这是我根据你所展示的内容提出的......不确定它是最优化的方式,但它确实有效。希望是否有其他人发现更容易的方式(我实际上希望有一个我不知道的功能):))

  Function f_strmin(in_range As Range) As String
      Dim lowstr As String
      Dim firstpass As Boolean
      firstpass = True

      For Each cell In in_range
          If firstpass And cell.Value <> "" Then
              lowstr = cell.Value
              firstpass = False
          ElseIf cell.Value = "" Then
              ' do nothing
          ElseIf cell.Value < lowstr Then
              lowstr = cell.Value
          End If
      Next cell

      f_strmin = lowstr
  End Function

  Sub test()
      Dim r As Integer
      Dim vr As String
      Dim minval As String
      Dim chk As Boolean

      r = 1
      vr = Trim(Str(r)) & ":" & Trim(Str(r))

      ' as long as the current row we're on has records .. keep going until we hit a blank row
      Do While Application.WorksheetFunction.CountA(Range(vr)) > 0
          ' get the min value in this row
          minval = f_strmin(Range(vr))

          For c = 1 To 4
              If Cells(r, c).Value > minval Then
                  chk = Cells(r, c).Insert(xlDown, xlFormatFromLeftOrAbove)
              End If
          Next c

          r = r + 1
          vr = Trim(Str(r)) & ":" & Trim(Str(r))
      Loop

  End Sub

这套:

  2807516   1153634 1153634 3332241
  3332241   2319999 2319999 3344644
  3344644   2420083 2420083 3347024
  3347024   2734988 2734988 3349486
  3349486   2807516 2807516 3353163

结束于此:

            1153634 1153634 
            2319999 2319999 
            2420083 2420083 
            2734988 2734988 
  2807516   2807516 2807516 
  3332241                      3332241
  3344644                      3344644
  3347024                      3347024
  3349486                      3349486
                               3353163

这套:

  2P9864    0V5170  0V5170  2P9864
  5N7531    2P9864  2P9864  2W8150
  3N8572    3L0415  3L0415  3N8572
  5N7531    5N7531  4W1704  5N7531
  6F5985    6F5985  5N7531  6F5985

结果如下:

            0V5170  0V5170  
  2P9864    2P9864  2P9864   2P9864
                             2W8150
            3L0415  3L0415  
                             3N8572
                    4W1704  
  5N7531    5N7531  5N7531   5N7531
  3N8572            
  5N7531            
  6F5985    6F5985           6F5985