Excel通过字母/数字将单元格拆分为2个单独的单元格

时间:2015-03-02 17:45:15

标签: excel excel-vba excel-formula vba

假设您有2个工作表,在第一个工作表中您有很多不同的数据。在D列中,您有一个数字(粗体)。数字的第一部分是2或3个字母,然后是几个数字(数字位数可以变化),例如 HTG5342355 PO23455 ,而不是每个单元格D列有这样的数字,它可以在D3但是它可以在D6,D7,D20 ......(它总是在D列中)

如何将前2个或3个字母作为一个单元格复制到第二个工作表中,将数字作为另一个单元格紧挨着它。

编辑:

只是想为这个问题添加一些信息:

在D栏中,还有其他数据,所以它看起来像这样:

**HTG5342355**
another text
**PO23455**
**BT3452342**
something
something else
**NN23355**

只需要分割粗体数字,其他内容与其他工作表无关

4 个答案:

答案 0 :(得分:1)

使用Sheet2!D1中的数据,将以下公式放在要返回零件的位置:

对于开头的字母:

=LEFT(Sheet2!D1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},Sheet2!D1&"0123456789"))-1)

对于最后的数字:

=MID(Sheet2!D1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},Sheet2!D1&"0123456789")),99)

答案 1 :(得分:0)

你可以编写一个 big-and -gly 复杂的公式,但是,虽然这可能有点过分,但我会使用正则表达式。 Read this question and its answers以供进一步参考。

VBA支持正则表达式,但您必须在项目中启用它们:

  1. 打开VBA编辑器
  2. Tools菜单中,点击References
  3. 查找Microsoft VBScript Regular Expressions 5.5并启用复选标记。
  4. 现在,创建一个新模块并编写一些代码。像这样:

    function Split_Letters_And_Digits(input_str as String) as String()
        dim re as RegExp
        set re = new RegExp
        dim ans(2) as String
        with re
            .global = True
            .ignoreCase = True
            .multiline = False
            .pattern = "([A-Za-z]{2,3})([0-9]*)"
            ' This pattern will match 2 or 3 upper or lower case letters
            ' and any number of digits after that.
            ' Each group is enclosed in parentheses; this will allow you
            ' to get each group separatedly
        End With
        ' Check if the input string matches the pattern
        if re.test(input_str) then
            ans(1) = re.replace(input_str, "$1")
            ans(2) = re.replace(input_str, "$2")
            ' Those "$1" and "$2" are special tokens that enable you to get
            ' the first and second piece of the pattern; that's the reason
            ' for those parentheses in the pattern
        else
            ' If the input doesn't match the pattern, exit the function
            exit function
        end if
        Split_Letters_And_Digits = ans
    end function
    

    这是一个数组函数。要使用它,请选择两个单元格范围,然后编写=Split_Letters_And_Digits(D3)并按 Ctrl + Shift + 输入

    您可以编写正则表达式来匹配更复杂的模式(您可能无法使用普通公式拆分的模式),因此值得学习如何使用它们。

    希望这有助于你

答案 2 :(得分:0)

Dim cellvalue as string, textlength as integer, foundnumber as boolean, _
  y as integer, x as integer
with thisworkbook.sheet1
  do until .cells(y,4).value=vbnullstring
    cellvalue=.cells(y,4).value
    textlength=len(cellvalue)
    if textlength > 1 then
      foundnumber=false
      for x= 2 to textlength
        if foundnumber=false then
          if isnumber(mid(cellvalue,x,1)) then
            foundnumber=true
            thisworkbook.sheet2.cells(y,4).value=left(cellvalue,x-1)
            thisworkbook.sheet2.cells(y,5).value=mid(cellvalue,x)
          end if
        end if
      next x
    end if
  y=y+1
  loop
end with

我相信这会奏效,虽然我有点紧张但没有测试过。它可能需要更多测试来确保单元格中的数据是您要复制的类型,但希望它能帮助您入门。我可以稍后回来评论。

答案 3 :(得分:0)

使用公式(复制到适合):

=IF(ISNUMBER(VALUE(MID(Sheet1!$D1,3,1))),LEFT(Sheet1!$D1,2),LEFT(Sheet1!$D1,3))  

=IF(ISNUMBER(VALUE(MID(Sheet1!$D1,3,1))),MID(Sheet1!$D1,3,LEN($D1)),MID(Sheet1!$D1,4,LEN(D$1)))