从Excel单元格中提取固定长度的数字

2024-06-19

一些类似名称的线程,但仍然无法解决我的问题。我需要从 Excel 字符串中提取固定长度的 NUMBER 值(在我的场景中为 8 位数字)。为此目的提供了以下 Excel 公式:

=MID(A1,FIND("--------",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"0","-"),"1","-"),"2","-"),"3","-"),"4","-"),"5","-"),"6","-"),"7","-"),"8","-"),"9","-")),8)

它可以完成工作,但是我有两个问题:

  1. 最重要的是——我正在寻找一个exact匹配。虽然它确实提取了它找到的第一个 8 位数字序列,但我真的很想only8 位数字,意味着应忽略 9 位(或更长)数字(因为 7 位数字已经如此)。此公式还从较长的数字中提取前 8 位数字。

  2. 不太重要,但如果只查找以 1 开头的数字就很好了。所以,真的只是想提取这个:1??????作为数值。所以像“一个12891212一个”或“一个12891212a" 应该被提取,同时128912120a or 23456789不应该。

如果可行的话,与 VBA 相比,我更喜欢基于 Excel 公式的方法。 任何帮助深表感谢!


这可以通过公式来完成,但这完全取决于您的 Excel 版本:


1)Excel 2016,您仍然可以使用公式:

公式为B1:

=IFERROR(MID(A1,MAX((MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),1)="1")*(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),8)))*(NOT(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1)))+8,1))))*(NOT(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1)))-1,1))))*(ROW(A$1:INDEX(A:A,LEN(A1))))),8),"Nothing found")

Note: This is an array formula and needs to be confirmed through CtrlShiftEnter


2)Excel 2019,使用CONCAT() https://support.microsoft.com/en-gb/office/concat-function-9b1a9a3f-94ff-41af-9736-694cbd6b4ca2 and FILTERXML() https://support.microsoft.com/en-us/office/filterxml-function-4df72efc-11ec-4951-86f5-c1374812f5b7:

公式为B1:

=IFERROR(FILTERXML("<t><s>"&CONCAT(IF(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),1)),MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),1),"</s><s>"))&"</s></t>","//s[starts-with(., '1') and string-length(.) =8]"),"Nothing Found")

Note: This is an array formula and needs to be confirmed through CtrlShiftEnter


3)Excel 365,使用前面提到的函数,但包括SEQUENCE() https://support.microsoft.com/en-us/office/sequence-function-57467a98-57e0-4817-9f14-2eb78519ca90:

公式为B1:

=IFERROR(FILTERXML("<t><s>"&LET(X,MID(A1,SEQUENCE(LEN(A1)),1),CONCAT(IF(ISNUMBER(--X),X,"</s><s>")))&"</s></t>","//s[starts-with(., '1') and string-length(.) =8]"),"Nothing Found")

The XPATH部分公式负责实际查询,查找以“1”开头且总长度为“8”的字符串。这甚至可以使用像“abc123456789abc12345678abc29876543”这样的字符串,返回“12345678”。

如果你喜欢FILTERXML and XPATH,那么你可能会发现this https://stackoverflow.com/q/61837696/9758194有趣的。


4)Excel 365,内部人士版(撰写本文时)使用TEXTSPLIT() https://support.microsoft.com/en-us/office/textsplit-function-b1ca414e-4c21-4ca0-b1b7-bdecace8a6e7:

=LET(X,MID(A1,SEQUENCE(LEN(A1)),1),Y,TEXTSPLIT(A1,IF(ISNUMBER(--X)," ",X),,1),FILTER(Y,(--LEFT(Y)=1)*(LEN(Y)=8),"Nothing Found"))

5)VBA:如果您必须使用 VBA,我想 UDF 是一个不错的选择。就像是:

Function GetStr(str As String, pat As String) As String

With CreateObject("vbscript.regexp")
    .Pattern = pat
    .Global = True
    If .Test(str) = True Then
        GetStr = .Execute(str)(0).Submatches(0)
    Else
        GetStr = "Nothing found"
    End If
End With

End Function

你可以调用这个B1 as per =GetStr(A1,"(?:^|\D)(1\d{7})(?:\D|$)")。这是利用正则表达式。如果您有兴趣并想了解更多信息,那么this https://stackoverflow.com/q/22542834/9758194对您来说是一本有趣的读物。

我故意将该模式留在 UDF 之外,您可能想更改它。目前的模式可以在网上看到Demo https://regex101.com/r/ZotvZK/1,引擎将从左到右寻找:

  • (?: - 1st Non-capturing group
    • ^|\D- 起始字符串锚或数字以外的任何内容。
    • )- 关闭第一个非捕获组。
  • ( - 1st capture group.
    • 1\d{7}- 搜索文字 1 后跟 7 位数字。
    • )- 关闭第一个捕获组。
  • (?: - 2nd Non-capturing group
    • \D|$- 除数字或结尾字符串锚点之外的任何内容。
    • )- 关闭第二个非捕获组。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从Excel单元格中提取固定长度的数字 的相关文章

随机推荐

  • 使用标志来识别口语

    在我正在做的网络应用程序中 我需要识别人们所说的语言 我想使用标志来做到这一点 但我有一些问题 例如 如果您说法语 则可以放置法国国旗 但如果您说英语 您可以放置 美国或英国国旗或两者的混合 阿拉伯语选择哪个标志 沙特阿拉伯国旗 阿尔及利亚
  • 响应式导航栏隐藏其下方的元素

    我创建了一个响应式导航栏 但它使下面的元素 Flexslider 插件 消失 在我制作导航栏之前 下面的 Flexslider 可以正常显示 但现在不行 导航栏的 z index 为 2 所以我不知道问题是什么 我应该如何 更改什么才能允许
  • 单元测试术语概述(存根与模拟、集成与交互)?

    我在我的项目中使用了更多的单元测试 并阅读了我可以在网上找到的所有信息 并且对很多术语感到困惑 因此 我可能在对话和谷歌搜索中错误地使用了这些术语 有人可以概述所有单元测试术语 例如 假 类型以及测试类型 交互与集成 吗 当谈到模拟 假货和
  • Angular 2访问组件内的ng-内容

    我怎样才能访问 content 来自组件类本身的组件 我想做这样的事情
  • 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) 存在性能问题?

    LDAP 搜索有一些内置规则 其中之一是LDAP MATCHING RULE IN CHAIN From MSDN https msdn microsoft com en us library aa746475 v vs 85 aspx 1
  • 如何从 Laravel 中的表中选择所有列名称?

    我试图从表中获取所有列名Teller 功能 public function getTableColumns tables return DB select DB raw SELECT COLUMN NAME DATA TYPE COLUMN
  • 跨浏览器:禁用输入字段的不同行为(文本可以/不能复制)

    我有一个被禁用的输入 html 字段 在某些浏览器 Chrome Edge Internet Explorer 和 Opera 中可以选择并复制文本 但至少在 Firefox 中这是不可能的 您可以通过在不同浏览器中执行以下代码来测试
  • CKEditor 类被剥离

    我有一个自定义插件 它添加了一个带有附加类的链接 当我使用 源 按钮查看此内容时 它会显示该类并且看起来应有的样子 但是 当我返回 WYSYWIG 视图并再次查看源代码时 该类已被删除 知道如何阻止这种情况发生吗 在此先感谢您的帮助 Che
  • Neo4j节点创建速度

    我的笔记本电脑上有一个新的 neo4j 设置 通过 REST API 创建新节点似乎相当慢 平均约 30 40 毫秒 我在谷歌上搜索了一下 但找不到任何真正的基准来衡量 应该 花多长时间 有这个帖子 https www arangodb c
  • 删除 VBA 按钮集合

    我正在使用以下脚本在 Excel 中生成按钮 范围正是我希望放置它的位置 Sub CreateAddButton rng As Range Dim btn As Button With Worksheets User Set btn But
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 如何修复nodejs Express服务器中的“MulterError:意外字段”?

    我正在设置一个服务器来从客户端上传 zip 文件 服务器运行express和multer来执行此操作 上传文件时 服务器抛出 MulterError 意外字段 错误 我无法弄清楚是什么导致了它 我尝试过使用 png 图像 效果很好 但对于
  • 如何减少导航图标和工具栏标题之间​​的差距?

    我的问题是导航抽屉图标和工具栏标题之间 有多余的空间 示例图像如下 工具栏的xml视图是
  • 根据另一列中的键累积一列中的值时出现问题

    我有一个看起来像这样的数据框 我需要使用 PROJ ID 列中的字符串创建一个新的值列 并形成 PROJ NAME 列中的值字符串 这里提供的解决方案 根据 r 中另一列的键累积一列中的值 https stackoverflow com q
  • st_intersects 与 st_overlaps

    这两个查询有什么区别 select a gid sum length b the geom from polygons as a roads as b where st intersects a the geom b the geom gr
  • 如何使用 NSUserDefaults 正确工作(检索值)

    我的代码中有一个简单的方法 如下所示 BOOL isFirstTimeLogin NSString t gName NSString stringWithFormat NSUserDefaults standardUserDefaults
  • 使用 Runtime.getRuntime().exec() 进行重定向不起作用

    我需要从程序执行命令 命令行是可以的 我在终端试了一下 但是在程序中不行 我从我的代码中添加一个副本 File dir new File videos String children dir list if children null Ei
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 以嵌套反应形式使用 setControl

    我想知道当我在另一个 formBuilder 组中有一个数组时 我必须做什么才能以反应形式使用 setControl 和 get 例如 this formulario this formBuilder group title this ra
  • 从Excel单元格中提取固定长度的数字

    一些类似名称的线程 但仍然无法解决我的问题 我需要从 Excel 字符串中提取固定长度的 NUMBER 值 在我的场景中为 8 位数字 为此目的提供了以下 Excel 公式 MID A1 FIND SUBSTITUTE SUBSTITUTE