我有一个带前缀的序列号列表,然后是几个数字。所有序列号均为8个字符,因此根据前缀和零的数量,前缀和数字之间会添加不同数量的前导零。 (例如ALT00001,CAT00564,AAR19470,M0000003,MISC7859,MISC0025) 如何从序列号中删除所有前导零,而保留所有属于实际数字的零?
我希望创建一个可以执行此操作的宏,因为我每天必须无数次在多个工作簿上运行此代码。
答案 0 :(得分:4)
在 A 列中有数据,在 B1 中输入:
=LEFT(A1,3) & --RIGHT(A1,5)
并向下复制。
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:
宏非常容易安装和使用:
如果保存工作簿,则宏将随其一起保存。 如果您在2003年以后使用Excel版本,则必须保存 该文件为.xlsm而不是.xlsx
要删除宏:
要使用在Excel窗口中的宏:
要全面了解有关宏的更多信息,请参见:
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)。
在工作中,我在单元格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 ,如下所示:
2)加载后,PQ编辑器将在新窗口中打开。下一步是将值分成文本字符串和数字字符串。一种快速的方法是使用PQ编辑器的 Transform 标签中的 Split Column(由非数字转换为数字),如下所示。
3)现在,第一列中有文本,第二列中有数字。下一步是清除数字列中值前面的“ 0 ”。一种方法是将数据类型从Text
更改为Whole Number
,然后将其更改回Text
(我将解释为什么您需要下一步将其更改回“文本”。
4)下一步是合并两列以获得所需结果。一种方法是添加自定义列,然后使用&
组合两列中的值,如下所示。
=[Column1.1]&[Column1.2] the way of using & is same as in an excel formula
正如我在上一步中提到的,我们需要将数字值改回text
,原因是PQ编辑器不允许将文本值与数字值组合,这将导致以下错误
5)最后一步取决于您的喜好。我要做的是删除其他列,并将结果列加载到原始数据所在的当前工作表中。
不幸的是,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"
干杯:)