VBA, excel 从字符串中剪切一部分

VBA, excel cut a part from a string

我想从字符串中获取一部分。我不熟悉 VBA 或不常见的 excel 函数,但我认为也许宏或 VBA 代码可以帮助我。

我需要从单元格的整个字符串中删除所有内容,除了总计之后的内容。要清除它,我需要总数之后的数字。我不知道 excel 中有什么函数可以解决我的问题。是否有类似 trim 或识别 'total' 并在之后给我数字的东西?

示例: 从这个单元格我需要 47 和另一个 47

单元格:Appvg - 总计:47 GB - Free:20 Gb; rootvg - 总计:47 - 免费:<1 GB>

这两个总数会一直相同吗?如果是这样,您可以使用此公式(只需将其放在与数据同一行的单元格中,我假设您的单元格是 A1):

=TRIM(MID(A2,SEARCH("total: ",A2)+LEN("total: "),2))

如果 GB 数字将大于两位数,请将“2”更改为“3”。您是否有任何其他示例单元格数据可以用来改进上述内容?

编辑:如果数字不同,您可以使用: =MID(A1,SEARCH("appvg - total: ",A1)+LEN("appvg - total: "),2)&", "&MID(A1,SEARCH("rootvg - total: ",A1)+LEN("rootvg - total: "),2)

编辑 2:我正在研究公式,因此如果 GB 大于两位数,例如 964 GB,就可以动态地选择它。这似乎适用于 4 位长的数字: =MID(A4,SEARCH("appvg - total: ",A4)+LEN("appvg - total: "),SEARCH(" G",A4)-SEARCH(":",A4)-2)&", "&MID(A4,SEARCH("rootvg - total: ",A4)+LEN("rootvg - total: "),SEARCH(" G",A4,SEARCH(" G",A4)-SEARCH(":",A4)-1)-SEARCH(":",A4)-2)

如果你想要一个真正的 VBA 解决方案,这里有一个函数可以至少得到第一个数字(并且可以创建一个类似的函数来得到第二个数字):

Function first_number(a_string As String) As Double
    'assumes one space after each "Total:" occurrence
    loc_of_first_total = InStr(1, a_string, "Total")
    end_of_first_number = InStr(loc_of_first_total + 7, a_string, " ") - 1
    first_number = CDbl(Mid(a_string, loc_of_first_total + 7, end_of_first_number - loc_of_first_total - 6))
End Function

如果您不熟悉 InStr,Google 搜索可能会得到比我提供的更好的解释。如果您假设 "Total:" 加一 space 在每个需要的数字之前存在,我使用的所有数字(例如 7、1、6)都只是数字所在位置的数学运算。我不确定小数是否可以存在,所以我返回了一个 Double,但它可以是 Integer 或 Long,具体取决于您对数据的期望。

对于第一个实例:(其中 WordToFind 可能是 "Total:"

=LOOKUP(2,1/MID(A1,SEARCH(WordToFind,A1)+LEN(WordToFind)+1,ROW(INDIRECT("1:5"))),MID(A1,SEARCH(WordToFind,A1)+LEN(WordToFind)+1,ROW(INDIRECT("1:5"))))

对于第二个实例:

=LOOKUP(2,1/MID(A1,SEARCH(WordToFind,A1,SEARCH(WordToFind,A1)+1)+LEN(WordToFind)+1,ROW(INDIRECT("1:5"))),MID(A1,SEARCH(WordToFind,A1,SEARCH(WordToFind,A1)+1)+LEN(WordToFind)+1,ROW(INDIRECT("1:5"))))

如果您需要更多实例,VBA 可能是更好的选择。 如果您的数字部分可能超过 5 个字符,请更改“1:5”中的“5”

我假设您需要将结果放在两个单独的单元格中。 另请注意,要搜索的 key string"Total:"

单元格 A11 具有以下值 (使用不同的总数来验证不同的结果)

Appvg - 总计:147 GB - Free:20 Gb; rootvg - 总计:247 - 免费:<1 GB>

使用此公式得出总数:147 (GB)

=LEFT(SUBSTITUTE(A11,LEFT(A11,LEN("Total:")+SEARCH("Total:",A11)),""),
-1+SEARCH(" ",SUBSTITUTE(A11,LEFT(A11,LEN("Total:")+SEARCH("Total:",A11)),"")))

使用此公式得出总数:247(-Free)

=LEFT(SUBSTITUTE(A11,LEFT(A11,
LEN("Total:")+SEARCH("|",SUBSTITUTE(A11,"Total:","|",2))),""),
-1+SEARCH(" ",SUBSTITUTE(A11,
LEFT(A11,LEN("Total:")+SEARCH("|",SUBSTITUTE(A11,"Total:","|",2))),"")))

万一key string发生变化,可以用单元格输入key strings进行搜索。如果是这种情况,请使用这些公式:

key string "Total:" 被输入单元格 A12

使用此公式得出总数:147 (GB)

=LEFT(SUBSTITUTE(A11,LEFT(A11,LEN(A12)+SEARCH(A12,A11)),""),
-1+SEARCH(" ",SUBSTITUTE(A11,LEFT(A11,LEN(A12)+SEARCH(A12,A11)),"")))

使用此公式得出总数:247(-Free)

=LEFT(SUBSTITUTE(A11,LEFT(A11,
LEN(A12)+SEARCH("|",SUBSTITUTE(A11,A12,"|",2))),""),
-1+SEARCH(" ",SUBSTITUTE(A11,LEFT(A11,
LEN(A12)+SEARCH("|",SUBSTITUTE(A11,A12,"|",2))),"")))

无论数字的长度如何,所有公式都有效