这就是问题所在,我有一个带有设备名称的表,我想将文本分成几列,直到满足大写字母或数字为止。
这是表格的样子:
表原样
这是拆分后的样子:
待定桌
我正在考虑使用左功能,但不知道如何包括大写字母! 这是我尝试过的:
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中更轻松地实现此目标吗?
谢谢!
编辑:添加了我的尝试
答案 0 :(得分:1)
这是没有VBA / RegEx的方法:
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"
编辑我怀疑以下代码可能更有效,因为添加的唯一列是结果列:
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"