如何从 excel 单元格中提取关键字
How to pull keywords from an excel cell
我从事采购工作,我试图查看包含部件号及其描述的单元格列表,但只从单元格中提取部件号并将其放在另一列中。
零件号有 10 个可能的前缀之一(即 ABC、DDA、GHF、AH 等)。这些单元格可能看起来像这样:
- 胎压 ABC123873 监测器
- 机油寿命 ABC849999999021 仪表
- 空调GHF211维修
而且我希望能够搜索整个列表并仅将以下信息拉入另一列:
- ABC123873
- ABC849999999021
- GHF211
正如您从上面看到的那样,挑战在于零件号的长度各不相同,并且没有特定的约定。关于它们,您唯一知道的是它们可以有我上面提到的十种可能的前缀之一(ABC、GHF 等)。
我目前的解决方案是这样的:
C2=FIND("ABC", A2)
D2=FIND(" ", A2, C2)
E2=MID(A2, C2, D2)
其中单元格 A2 包含完整的零件号和描述,C2 通过搜索其前缀找到零件号的起始位置,D2 通过搜索 space 找到零件号的结束位置,然后 E2 在这两个位置之间拉出子字符串。
如您所见,这不是一个非常可靠的解决方案,它只允许我搜索以 ABC 开头的部分。我希望能够搜索所有 10 个可能的前缀(ABC、DDA、GHF、AH 等),但这不起作用。我尝试了以下方法:
C2=FIND({"ABC", "DDA", "GHF", "AH"}, A2)
但这只会搜索 ABC 部分而忽略其他前缀。非常感谢你们能提供的任何帮助!!
这不是最漂亮的公式,但它应该能让您上路。如果您对宏而不是公式感兴趣,肯定有 VBA 解决方案。
假设您的 Tire Pressure ABC123873 Monitor
在 A1 中,请在 B1 中输入:
=MID(SUBSTITUTE(SUBSTITUTE(A1," ",";",1)," ","-",1),SEARCH("ABC",SUBSTITUTE(SUBSTITUTE(A1," ",";",1)," ","-",1)),SEARCH(" ",SUBSTITUTE(SUBSTITUTE(A1," ",";",1)," ","-",1))-SEARCH("ABC",SUBSTITUTE(SUBSTITUTE(A1," ",";",1)," ","-",1)))
它是如何工作的,它需要你的 A1,然后首先使用 Substitute
。我将第一个和第二个 [space] 替换为 ;
和 -
。 (注意,如果 space 多于两个,这将 运行 变成问题)。然后,我只使用 Mid
来提取单元格中以 ABC
开头的部分,直到它到达 space。如果你没有 "ABC" 开始你想要的值,你需要调整 Search("ABC"...
部分(或在那里使用数组)。我仍在努力,但希望这有助于提供一个想法。
这就是我要做的。我创建了一个前缀列表以在 G 列中搜索。您甚至可以将它们放在单独的页面上以使其更清晰。
=MID(A1,FIND(G1:G2,A1,1),FIND(" ", A1, FIND(G1:G2, A1, 1))-FIND(G1:G2,A1,1))
我只测试了两个前缀,只是将 G1:G2
更改为 G1:G10
并将所有前缀放入其中。该公式在 A1 中查找。第一个 FIND
查找起始字符编号。等式的其余部分是计算产品编号的末尾减去开头,即 return 到 return 的字符数量。重要的是要知道 MID
不需要开始和结束字符。它希望开始字符和之后的字符数为return。所以 FIND(" ", FIND(G1:G2, A1, 1))
不起作用,因为它 return 的字符太多了。试一试。
哦,别忘了做 Ctrl+Shift+Enter
输入数组公式
VBA 答案是
Sub findProductCode()
' Variable Declarations
Dim productName As String
Dim productArray() As String
Dim wordCount As Integer
' Sets the active sheet to use
' Change Sheet1 to the name of your sheet
With Sheets("Sheet1")
' Selects the first cell to check
' Change A1 to the first cell with data
Range("A1").Select
' Loops through all rows until an empty row
' It will end if you have any empty rows in the midle of data
Do Until IsEmpty(ActiveCell)
' Reads text out of the cell
'Change A to the proper column
productName = Range("A" & ActiveCell.Row).Text
' Splits the string into individual words
productArray = Split(productName, " ")
' Loops through array to find the product number
For wordCount = LBound(productArray) To UBound(productArray)
' Check if the word has the desired 10 prefixes
' Add more Or Left(productArray(wordCount), 3) = "xxx" until you have 10 of your prefixes you need
If Left(productArray(wordCount), 3) = "ABC" Or Left(productArray(wordCount), 3) = "GHF" Then
' Sends the product number to its cell
' Change B to the correct destination Cell
Range("B" & ActiveCell.Row).Value = productArray(wordCount)
End If
Next
' Increments the active cell to the next cell down
ActiveCell.Offset(1, 0).Select
Loop
End With
End Sub
如果您不知道如何操作,您需要在 excel 中启用开发人员选项卡。 File->Options->Customize Ribbon
将开发人员添加到功能区。将您的工作sheet 另存为.xlsm
这是启用了宏的工作簿。然后转到开发人员选项卡,选择 "Visual Basic" 并双击 "ThisWorkBook"。粘贴代码。您可以 运行 那里的代码进行一次性交易,或者您可以在 sheet 上创建一个按钮,您可以随时 运行 这个宏。
要添加按钮,请返回您想要按钮的 sheet。在开发人员选项卡 select Insert
上,选择第一个表单控件 Button
。在 sheet 上绘制按钮,将出现一个对话框。 select findProductCode
宏和 select OK。现在每次单击按钮时,它都会 运行 宏。
我从事采购工作,我试图查看包含部件号及其描述的单元格列表,但只从单元格中提取部件号并将其放在另一列中。
零件号有 10 个可能的前缀之一(即 ABC、DDA、GHF、AH 等)。这些单元格可能看起来像这样:
- 胎压 ABC123873 监测器
- 机油寿命 ABC849999999021 仪表
- 空调GHF211维修
而且我希望能够搜索整个列表并仅将以下信息拉入另一列:
- ABC123873
- ABC849999999021
- GHF211
正如您从上面看到的那样,挑战在于零件号的长度各不相同,并且没有特定的约定。关于它们,您唯一知道的是它们可以有我上面提到的十种可能的前缀之一(ABC、GHF 等)。
我目前的解决方案是这样的:
C2=FIND("ABC", A2)
D2=FIND(" ", A2, C2)
E2=MID(A2, C2, D2)
其中单元格 A2 包含完整的零件号和描述,C2 通过搜索其前缀找到零件号的起始位置,D2 通过搜索 space 找到零件号的结束位置,然后 E2 在这两个位置之间拉出子字符串。
如您所见,这不是一个非常可靠的解决方案,它只允许我搜索以 ABC 开头的部分。我希望能够搜索所有 10 个可能的前缀(ABC、DDA、GHF、AH 等),但这不起作用。我尝试了以下方法:
C2=FIND({"ABC", "DDA", "GHF", "AH"}, A2)
但这只会搜索 ABC 部分而忽略其他前缀。非常感谢你们能提供的任何帮助!!
这不是最漂亮的公式,但它应该能让您上路。如果您对宏而不是公式感兴趣,肯定有 VBA 解决方案。
假设您的 Tire Pressure ABC123873 Monitor
在 A1 中,请在 B1 中输入:
=MID(SUBSTITUTE(SUBSTITUTE(A1," ",";",1)," ","-",1),SEARCH("ABC",SUBSTITUTE(SUBSTITUTE(A1," ",";",1)," ","-",1)),SEARCH(" ",SUBSTITUTE(SUBSTITUTE(A1," ",";",1)," ","-",1))-SEARCH("ABC",SUBSTITUTE(SUBSTITUTE(A1," ",";",1)," ","-",1)))
它是如何工作的,它需要你的 A1,然后首先使用 Substitute
。我将第一个和第二个 [space] 替换为 ;
和 -
。 (注意,如果 space 多于两个,这将 运行 变成问题)。然后,我只使用 Mid
来提取单元格中以 ABC
开头的部分,直到它到达 space。如果你没有 "ABC" 开始你想要的值,你需要调整 Search("ABC"...
部分(或在那里使用数组)。我仍在努力,但希望这有助于提供一个想法。
这就是我要做的。我创建了一个前缀列表以在 G 列中搜索。您甚至可以将它们放在单独的页面上以使其更清晰。
=MID(A1,FIND(G1:G2,A1,1),FIND(" ", A1, FIND(G1:G2, A1, 1))-FIND(G1:G2,A1,1))
我只测试了两个前缀,只是将 G1:G2
更改为 G1:G10
并将所有前缀放入其中。该公式在 A1 中查找。第一个 FIND
查找起始字符编号。等式的其余部分是计算产品编号的末尾减去开头,即 return 到 return 的字符数量。重要的是要知道 MID
不需要开始和结束字符。它希望开始字符和之后的字符数为return。所以 FIND(" ", FIND(G1:G2, A1, 1))
不起作用,因为它 return 的字符太多了。试一试。
哦,别忘了做 Ctrl+Shift+Enter
输入数组公式
VBA 答案是
Sub findProductCode()
' Variable Declarations
Dim productName As String
Dim productArray() As String
Dim wordCount As Integer
' Sets the active sheet to use
' Change Sheet1 to the name of your sheet
With Sheets("Sheet1")
' Selects the first cell to check
' Change A1 to the first cell with data
Range("A1").Select
' Loops through all rows until an empty row
' It will end if you have any empty rows in the midle of data
Do Until IsEmpty(ActiveCell)
' Reads text out of the cell
'Change A to the proper column
productName = Range("A" & ActiveCell.Row).Text
' Splits the string into individual words
productArray = Split(productName, " ")
' Loops through array to find the product number
For wordCount = LBound(productArray) To UBound(productArray)
' Check if the word has the desired 10 prefixes
' Add more Or Left(productArray(wordCount), 3) = "xxx" until you have 10 of your prefixes you need
If Left(productArray(wordCount), 3) = "ABC" Or Left(productArray(wordCount), 3) = "GHF" Then
' Sends the product number to its cell
' Change B to the correct destination Cell
Range("B" & ActiveCell.Row).Value = productArray(wordCount)
End If
Next
' Increments the active cell to the next cell down
ActiveCell.Offset(1, 0).Select
Loop
End With
End Sub
如果您不知道如何操作,您需要在 excel 中启用开发人员选项卡。 File->Options->Customize Ribbon
将开发人员添加到功能区。将您的工作sheet 另存为.xlsm
这是启用了宏的工作簿。然后转到开发人员选项卡,选择 "Visual Basic" 并双击 "ThisWorkBook"。粘贴代码。您可以 运行 那里的代码进行一次性交易,或者您可以在 sheet 上创建一个按钮,您可以随时 运行 这个宏。
要添加按钮,请返回您想要按钮的 sheet。在开发人员选项卡 select Insert
上,选择第一个表单控件 Button
。在 sheet 上绘制按钮,将出现一个对话框。 select findProductCode
宏和 select OK。现在每次单击按钮时,它都会 运行 宏。