从字符串中间删除零

时间:2019-07-25 18:59:53

标签: vba excel-formula

我有一个带前缀的序列号列表,然后是几个数字。所有序列号均为8个字符,因此根据前缀和零的数量,前缀和数字之间会添加不同数量的前导零。 (例如ALT00001,CAT00564,AAR19470,M0000003,MISC7859,MISC0025) 如何从序列号中删除所有前导零,而保留所有属于实际数字的零?

我希望创建一个可以执行此操作的宏,因为我每天必须无数次在多个工作簿上运行此代码。

2 个答案:

答案 0 :(得分:4)

A 列中有数据,在 B1 中输入:

=LEFT(A1,3) & --RIGHT(A1,5)

并向下复制。

enter image description here

EDIT#1:

基于更新后的示例,我们必须在字符串中找到第一个数字的位置,并根据该位置进行解析。

C1 中输入:

=MIN(FIND({"0","1","2","3","4","5","6","7","8","9"},UPPER(A1)&"0123456789"))

并向下复制。 (给出第一个数字的位置)

现在在 B1 中输入:

=LEFT(A1,C1-1) & --RIGHT(A1,8-C1+1)

或:

=LEFT(A1,C1-1) & --RIGHT(A1,9-C1)

(如果您不希望使用“ helper”列,请组合公式)

EDIT#2:

以下是一些代码:

Sub Deb()
    Dim Kolumn As String, rng As Range, cell As Range, s As String, L As Long
    Dim i As Long

    Kolumn = "A"
    Set rng = Intersect(Columns(Kolumn).EntireColumn, ActiveSheet.UsedRange).Offset(1, 0).Cells

    For Each cell In rng
        s = cell.Value
        If s = "" Then Exit Sub
        L = Len(s)
        For i = 1 To L
            If IsNumeric(Mid(s, i, 1)) Then
                GoTo Process
            End If
        Next i
        MsgBox "bad data " & s
        Exit Sub
Process:
        cell.Value = Left(s, i + -1) & CLng(Mid(s, i))
    Next cell

End Sub

EDIT#3:

宏非常容易安装和使用:

  1. ALT-F11弹出VBE窗口
  2. ALT-I ALT-M打开一个新模块
  3. 将内容粘贴并关闭VBE窗口

如果保存工作簿,则宏将随其一起保存。 如果您在2003年以后使用Excel版本,则必须保存 该文件为.xlsm而不是.xlsx

删除宏:

  1. 如上调出VBE窗口
  2. 清除代码
  3. 关闭VBE窗口

使用在Excel窗口中的宏:

  1. 选择要在其上运行宏的工作表
  2. ALT-F8
  3. 选择宏
  4. 触摸“运行”

要全面了解有关宏的更多信息,请参见:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

必须启用宏才能使其正常工作!

答案 1 :(得分:0)

我有两种方法,一种是使用 excel数组公式在文本字符串中查找数字值,另一种是使用 excel幂查询来转换数据仅需4个简单步骤。

  

方法1-数组公式

以下公式将首先将文本字符串转换为数组,例如。 ALT00001将成为{"A";"L";"T";"0";"0";"0";"0";"1"},然后检查数组中的每个字符(如果是类似{FALSE;FALSE;FALSE;TRUE;TRUE;TRUE;TRUE;TRUE}的数值),最后将所有TRUE结果求和。这将为您提供文本字符串中数值的总数。

{=SUM(--ISNUMBER(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)))}

请注意,这是一个数组公式,因此在完成公式编辑后,您需要按 CSE (Ctrl + Shift + Enter)。

Approach 1

在工作中,我在单元格B1中输入了数组公式,然后在单元格C1中输入了以下公式以得出结果。

=LEFT(A1,8-B1)&--RIGHT(A1,B1)

您可以结合使用这两个公式,但是它看起来很长,很难被其他人解释。如果确实合并,则需要按 CSE 使其结合数组,以使其正常工作。

  

方法2-超级查询

尽管@Deb并没有要求使用Power Query(PQ)的解决方案,但鉴于上述基于公式的解决方案并不是那么简单明了,并且由于某种原因而复杂,因此我仍然希望分享一种有效解决该问题的替代方法。

PQ能够转换来自多个工作表的数据,并具有非常用户友好的大量内置函数。请注意,您需要具有 Excel 2010或更高版本才能使用PQ。

这是使用PQ的步骤:

1)将数据范围加载到PQ Editor,一种方法是突出显示数据范围,并使用 Data 标签中的 From Table ,如下所示:

From Table

2)加载后,PQ编辑器将在新窗口中打开。下一步是将值分成文本字符串和数字字符串。一种快速的方法是使用PQ编辑器的 Transform 标签中的 Split Column(由非数字转换为数字),如下所示。

Split Column

3)现在,第一列中有文本,第二列中有数字。下一步是清除数字列中值前面的“ 0 ”。一种方法是将数据类型Text更改为Whole Number,然后将其更改回Text(我将解释为什么您需要下一步将其更改回“文本”。

Change Type

4)下一步是合并两列以获得所需结果。一种方法是添加自定义列,然后使用&组合两列中的值,如下所示。

=[Column1.1]&[Column1.2] the way of using & is same as in an excel formula

Add Custom Column

正如我在上一步中提到的,我们需要将数字值改回text,原因是PQ编辑器不允许将文本值与数字值组合,这将导致以下错误

Error

5)最后一步取决于您的喜好。我要做的是删除其他列,并将结果列加载到原始数据所在的当前工作表中。

Close and Load

不幸的是,PQ无法覆盖源数据。但是,我认为最好将源数据保存在安全的位置而不被覆盖,然后将编辑/转换后的数据导出到新位置并进行处理。

这是幕后代码,但是所有步骤都使用内置功能执行,您可以轻松地搜索每个功能的专有技术。

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Split Column by Character Transition" = Table.SplitColumn(Source, "Column1", Splitter.SplitTextByCharacterTransition((c) => not List.Contains({"0".."9"}, c), {"0".."9"}), {"Column1.1", "Column1.2"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Character Transition",{{"Column1.2", Int64.Type}}),
    #"Changed Type2" = Table.TransformColumnTypes(#"Changed Type1",{{"Column1.2", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type2", "Result", each [Column1.1]&[Column1.2]),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Custom",{"Result"})
in
    #"Removed Other Columns"

干杯:)