如何将文本分成几列,直到满足大写字母或数字

时间:2019-04-29 07:58:59

标签: excel vba

这就是问题所在,我有一个带有设备名称的表,我想将文本分成几列,直到满足大写字母或数字为止。

这是表格的样子:

表原样

这是拆分后的样子:

待定桌

我正在考虑使用左功能,但不知道如何包括大写字母! 这是我尝试过的:

        private void dgvModProdAllPrtList_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            IndAddPrt = e.RowIndex;
            Inventory.CurrentPartID = (int)dgvModProdAllPrtList.Rows[IndAddPrt].Cells[0].Value;
            Inventory.CurrentPart = Inventory.lookupPart(Inventory.CurrentPartID);
            dgvModProdAllPrtList.DefaultCellStyle.SelectionBackColor = Color.CornflowerBlue;
        }

不幸的是,它无法正常工作... 重要说明:大写字母可以用西里尔文和拉丁文写成

还可以在Power Query中更轻松地实现此目标吗?

谢谢!

编辑:添加了我的尝试

2 个答案:

答案 0 :(得分:1)

这是没有VBA / RegEx的方法:

enter image description here

B1中的公式:

{=LEFT(A1,SMALL(IFERROR(MATCH(FullList,UNICODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1)))+1,1)),0),0),SUMPRODUCT(--(IFERROR(MATCH(FullList,UNICODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1)))+1,1)),0),0)=0))+1))}

关于通过 Ctrl Shift Enter

作为数组输入的通知

C1中的公式:

=RIGHT(A1,LEN(A1)-LEN(B1))
  • 请注意,B列中有尾随空格。

  • FullList是另一个工作表中的命名范围,它引用UNICODE列表,该列表代表所有大写拉丁字母和西里尔字母以及数字。因此,清单是48-57、65-90和1040-1071。

答案 1 :(得分:1)

您可以使用Power Query进行此操作。 我敢肯定有一种更干净的方法可以执行此操作,但是SplitOnAnyDelimiter似乎没有选择仅在第一个实例上进行拆分的选项,而且我没有时间将所有内容编写为简洁的M代码,所以现在,我添加了一些自定义列:

  • 去除第一个字母,以避免在开头找到大写字母。
  • 然后找到第一个出现的位置任何数字,大写拉丁字母,大写西里尔字母
  • 返回字符串在该位置之前的部分。
  • 返回该位置之后的字符串部分。
  • 删除不需要的列

M代码:

let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "2nd", each Text.Middle([Name],1)),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "Position", each Text.PositionOfAny([2nd],{"0".."9","A".."Z","А".."Я"},Occurrence.First)),
    #"Added Custom2" = Table.AddColumn(#"Added Custom1", "Equipment", each Text.Start([Name],[Position])),
    #"Added Custom3" = Table.AddColumn(#"Added Custom2", "Custom", each Text.Middle([2nd],[Position])),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom3",{"Name", "2nd", "Position"})
in
    #"Removed Columns"

来源

enter image description here

结果

enter image description here

编辑我怀疑以下代码可能更有效,因为添加的唯一列是结果列:

let
    Source = Excel.CurrentWorkbook(){[Name="Table5"]}[Content],

#"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Equipment", each Text.Start([Name],
        Text.PositionOfAny(Text.Middle([Name],1),{"0".."9","A".."Z","А".."Я"},Occurrence.First))),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "Part No", each Text.Middle([Name],
    Text.PositionOfAny(Text.Middle([Name],1),{"0".."9","A".."Z","А".."Я"},Occurrence.First)+1)),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"Name"})
in
    #"Removed Columns"