从单个 Excel 表中提取所有数字

从单个 Excel 表中提取所有数字

给出一个包含混合数字和文本的 Excel 表。

史蒂芬斯:

123|文本|11
-----------
嗨 | 75| 1

我如何扫描整个工作表并仅提取单列中的数字?

123|
----
 75|
----
 11|
----
  1|

我不喜欢使用 VBA,顺序并不重要。

答案1

您可以使用公式来实现此目的:

 =IFERROR(LARGE(IF(ISNUMBER(A$1:C$3),A$1:C$3),ROW()),"")

以下列出从大到小的数字:

在此处输入图片描述

这是一个数组公式,因此必须使用 CTRL-Shift Enter 输入,而不是直接按 Enter。如果输入正确,Excel 将在公式栏中用花括号 {} 括住公式。

要扫描整个工作表,请将 IF 语句中的范围更改为 $1:$1048576。但您需要排除列出数字的列。因此,您可以在 A 列中列出并使用 B$1:XFD$1048576。(这是 2007 年以后的 Excel 版本)。

答案2

这取决于这里的用例,但我建议的逻辑是(不使用 VBa)将每一列复制到一个长列中,然后按字母顺序排序!

所以它开始于

在此处输入图片描述

复制并粘贴到单个列

在此处输入图片描述

添加新行和标题单击Filter(在Data功能区中,Sort and Filter选项卡)

从最小到最大排序

在此处输入图片描述

只需删除其他行!

如果将所有列复制到一列太耗时,请参阅https://stackoverflow.com/questions/4480227/how-to-consolidate-data-from-multiple-excel-columns-all-into-one-column

Sub MakeOneColumn()

    Dim vaCells As Variant
    Dim vOutput() As Variant
    Dim i As Long, j As Long
    Dim lRow As Long

    If TypeName(Selection) = "Range" Then
        If Selection.Count > 1 Then
            If Selection.Count <= Selection.Parent.Rows.Count Then
                vaCells = Selection.Value

                ReDim vOutput(1 To UBound(vaCells, 1) * UBound(vaCells, 2), 1 To 1)

                For j = LBound(vaCells, 2) To UBound(vaCells, 2)
                    For i = LBound(vaCells, 1) To UBound(vaCells, 1)
                        If Len(vaCells(i, j)) > 0 Then
                            lRow = lRow + 1
                            vOutput(lRow, 1) = vaCells(i, j)
                        End If
                    Next i
                Next j

                Selection.ClearContents
                Selection.Cells(1).Resize(lRow).Value = vOutput
            End If
        End If
    End If

End Sub

如何在 MS Office 中添加 VBA?

相关内容