Axl*_*ack 3 excel vba excel-vba
我试图从文本中提取Milliliters和Lite(只有值,而不是ml或Ltr),但由于没有特定的标准,因此很难做出公式.以下是我所拥有的描述类型的一些示例:
- Settlement 2.5% (Settlement Discount)
- BAGDOL/1 (U-POL DOLPHIN GLAZE Brushable Stopper Bag 440ml)
- P38/5 (ISOPON P38 LIGHTWEIGHT FILLER 3Ltr)
- EGC21TT (EUROPEAN COATINGS PRIMER 4:1 HS 4Ltr TRIPLE TIGHT)
- RLT/1KIT (U-POL RAPTOR TINTABLE 750ml & 250ml STANDARD HARDENER KIT)
- CCWP/AL (U-POL CUSTOM CAN Pregassed Aerosol 400ml (Waterbased))
Run Code Online (Sandbox Code Playgroud)
我使用下面的公式,我觉得我过于复杂:
=IF(LEN(IFERROR(MID(G2,FIND("ml",G2)-3,LEN(G2)),""))=0,IFERROR(SUBSTITUTE(MID(G2,FIND("Ltr",G2)-2,LEN(G2)),"Ltr)","")*1000,""),IFERROR(SUBSTITUTE(MID(G2,FIND("ml",G2)-3,LEN(G2)),"ml)",""),""))
Run Code Online (Sandbox Code Playgroud)
那些440ml的人返回440,而那些说3Ltr的人返回3000 - 但这只是在它位于单元格文本的末尾.
我想能够提取ml或Ltr的值,无论它在文本中的位置.那些有超过一组毫升值的人,我想总结一下.示例: 750ml & 250ml应为1000. Settlement 2.5% (Settlement Discount)应返回0.
有一个简单的方法吗?我很高兴在VBA中这样做,因为我认为这不会那么复杂.
任何帮助,将不胜感激!
使用RegEx可能有更好的方法,但是我没有在那些黑暗的艺术中练习,所以我会使用类似下面的内容来获得你需要的东西:
Function getvolume(txt As String) As Long
Dim wrd As Variant, wrds As Variant
getvolume = 0
If txt = "" Then Exit Function
' strip out characters that will confuse
txt = Replace(txt, "(", " ")
txt = Replace(txt, ")", " ")
' convert all to lower case
txt = LCase(txt)
' split the text into individual "words"
wrds = Split(txt, " ")
For Each wrd In wrds
If wrd Like "*ml" Then getvolume = getvolume + Val(Replace(wrd, "ml", ""))
If wrd Like "*ltr" Then getvolume = getvolume + 1000 * Val(Replace(wrd, "ltr", ""))
Next
End Function
Run Code Online (Sandbox Code Playgroud)
因此,如果你的文字在G2那里,那么你将使用公式=getvolume(G2)