【问题标题】:VBA, excel cut a part from a stringVBA,excel从字符串中剪切一部分
【发布时间】:2015-07-17 02:29:17
【问题描述】:

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

我需要从单元格的整个字符串中删除所有内容,除了总计之后的内容。为了清除这一点,我需要总数之后的数字。我不知道excel中有什么功能可以解决我的问题。是否有类似修剪或识别“总数”并在此之后给我数字的东西?

示例: 从这个单元格中,我需要 47 和其他 47

Cell:Appvg - 总计:47 GB - 免费:20 Gb; rootvg - 总计:47 -免费:

【问题讨论】:

  • 您只查找 Total 之后的数字吗?或者您可能还使用了其他关键词?

标签: vba excel trim


【解决方案1】:

这两个总计是否总是相同的?如果是这样,您可以使用此公式(只需将其放在与数据相同行的单元格中,我假设您的单元格为 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)

【讨论】:

    【解决方案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 搜索可能会得到比我提供的更好的解释。我使用的所有数字(例如,7、1、6)只是如果您假设“总计:”在每个需要的数字之前存在一个空格,那么数字将在哪里的数学。我不确定小数是否存在,所以我返回了一个 Double,但它可能是 Integer 或 Long,具体取决于您对数据的期望。

    【讨论】:

    • 我应该注意的是,我通常总是尽可能地尝试做一个公式解决方案,所以我更喜欢@user3578951 的答案。但是,如果您需要一些快速而肮脏的东西,或者可以处理更长的数字和/或小数的东西,这可能是一个起点。
    【解决方案3】:

    对于第一个实例:(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”

    【讨论】:

      【解决方案4】:

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

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

      Appvg - 总计:147 GB - 免费:20 Gb; rootvg - 总计:247 -免费:

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

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

      使用此公式获得总数:247(-免费)

      =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进行搜索。如果是这种情况,请使用以下公式:

      键字符串 “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(-免费)

      =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))),"")))
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多