Vba 在单元格中查找并复制某些值

Vba 在单元格中查找并复制某些值,vba,excel,Vba,Excel,我有一列文件名的格式如下: 一些数字\u一些文字\u 1\u 100\u AA 这些文件名在A列。我需要扫描每个单元格中的每个文件名,复制数字1并粘贴到B列,复制数字100并粘贴到C列,所有这些都与文件名位于同一行。然后我想对A列下一个单元格重复。 谢谢你的帮助 带有: 3141543_junktext_4563_10098_ZZ 在单元格A1中,在B1中输入: =TRIM(MID(SUBSTITUTE($A1,"_",REPT(" ",999)),COLUMNS($A:C)*999-998,9

我有一列文件名的格式如下: 一些数字\u一些文字\u 1\u 100\u AA 这些文件名在A列。我需要扫描每个单元格中的每个文件名,复制数字1并粘贴到B列,复制数字100并粘贴到C列,所有这些都与文件名位于同一行。然后我想对A列下一个单元格重复。 谢谢你的帮助

带有:

3141543_junktext_4563_10098_ZZ

在单元格A1中,B1中输入:

=TRIM(MID(SUBSTITUTE($A1,"_",REPT(" ",999)),COLUMNS($A:C)*999-998,999))
=TRIM(MID(SUBSTITUTE($A1,"_",REPT(" ",999)),COLUMNS($A:D)*999-998,999))
并在C1中输入:

=TRIM(MID(SUBSTITUTE($A1,"_",REPT(" ",999)),COLUMNS($A:C)*999-998,999))
=TRIM(MID(SUBSTITUTE($A1,"_",REPT(" ",999)),COLUMNS($A:D)*999-998,999))

要显示4563和10098,如果每个部分都有分隔符(即在示例中由
\uu
分隔),则可以方便地将文本转换为列,并将其作为分隔符,然后删除最后两列和前两列


(但要先复制到新列中,否则会丢失源数据。)

由于这是用VBA标记的,我将给出一个简单的VBA宏解决方案

最简单的方法是定义一个名为splitText(test,delim,n)的VBA函数,该函数将通过分隔符分割文本,并获取第n列。这是非常普遍需要的,我希望他们只是把它标准化

Function splitText(txt As String, delim As String, n As Integer)
    splitText = split(txt, delim)(n)
End Function
然后,如果字符串为A1,则将其放入B1:

=splitText(A1,"_",2)
在C1中:

=splitText(A1,"_",3)

您的意思是您有这种格式的字符串“www_xxx_yyy_zzz_AA”,其中www、xxx、yyy和zzz是数字?你只需要yyy和zzz?这是目前为止最简单的方法。虽然它不完全是“程序化的”。不知道提问者是否需要动态更新…这听起来像是[excel formula]版本的Split:)很好。@Gary的学生我尝试将其作为公式放入VBA代码中,但它不允许我这样做。我收到无效字符的编译错误。是否需要;为了代替,@Gary的学生,我做了以下工作:范围(单元格(1,2),单元格(lastRownum+1,2))。公式=“=TRIM(MID(SUBSTITUTE($A2,“u”),REPT(“,999)),列($A:C)*999-998999)),其中我用引号标记了您的代码。我无法运行代码。如果我删除了replace和REPT中的引号,我就可以运行它,但显然这不起作用。有什么建议吗?你需要在内部双引号上加倍!我觉得这应该行得通。如何将其包含在当前VBA代码中?我应该将splitText声明为什么?非常感谢。只要将上面的函数文本复制到VisualBasicDeveloper下的一个模块中,就可以了。您可以在声明的末尾有一个“as string”限定符,但这不是必需的。明白了。所以我可以从另一个模块调用该宏吗?是的,您可以,尽管使用“split(text,delim)”比纯VBA更好。这个函数实际上只是标准VBA拆分函数的包装,所以它可以用作excel公式函数。我想我知道它为什么不起作用。因此,我在一个模块中插入了该函数,并在我的主宏中执行了以下操作:范围(单元格(1,2),单元格(lastRownum+1,2))。公式=“=splitText(A1,“"”,2)”当引号“位于下划线前后时,我收到一个错误,指出下划线是无效字符。