基于字符限制将文本截断为完整单词-Excel

问题描述 投票:0回答:2

我正在处理某些数据(DataSet#1),该数据的文本字段使用某些非常规逻辑被截断了:

  • 如果“服务类型描述”是> 60个字符,则将名称缩减到<60个字符,但只能full个字

我的问题是,我需要在excel中格式化一些其他数据(DataSet#2)才能匹配此逻辑,该逻辑将应用于报表服务器后端(我的控件之外)。似乎也没有人找到所有可能的截断描述的列表。

Dataset#1是活动的,可以随时用更新的数据重新拉动,因此我需要创建一个模板,该模板允许我从DataSet#2的列表中提取信息(当前具有完整的描述)根据数据集#1中经过裁剪的服务类型描述,将其放入数据集#1的任何副本中。


示例:以下是完整的产品名称,以及我的DataSet#2中的产品名称:

  • “ FNMA 1025小住宅收入财产评估和FNMA 216附录”(73个字符,包括空格)

仅将文本修剪为<60个字符(59)将产生:

  • “ FNMA 1025小住宅收入物业评估与FNM”

但是,相同的产品在主数据(DataSet#1)中的命名如下:

  • “ FNMA 1025小住宅收入财产评估与”(56个字符,八个“单词”,包括&)

DataSet#1的后端逻辑已将完整的产品名称修整为少于60个字符,但仅保留完整的单词(删除了“ FNM”部分单词)。


理想情况下,我必须能够获取具有完整描述名称的列表-并在Excel(或VBA)中应用逻辑,该逻辑将产生与其他数据集中的修剪数据相同的结果-然后,我可以提取信息根据服务类型描述从数据集2(完整的产品名称)到数据集1。

excel vba word-count texttrimming character-limit
2个回答
0
投票

您可以使用类似的东西

Function truncate_string(strInput As String, Optional lngChars As Long = 60)

Dim lngCharInstance As Long


lngCharInstance = Len(strInput)

While lngCharInstance > lngChars 
   lngCharInstance = InStrRev(strInput, " ", _
                    IIf(lngCharInstance >= Len(strInput), _
                    Len(strInput), lngCharInstance - 1))
Wend

truncate_string = Mid(strInput, 1, lngCharInstance)

End Function

这将这样称呼

truncate_string("FNMA 1025 Small Residential Income Property Appraisal & FNMA 216 Addendum")

并且将返回如下

FNMA 1025 Small Residential Income Property Appraisal &

或类似,例如30个字符

truncate_string("FNMA 1025 Small Residential Income Property Appraisal & FNMA 216 Addendum",30)

给出

FNMA 1025 Small Residential

希望这会有所帮助,因为其中存在一个循环,所以我会研究无限循环的任何可能性。


0
投票

您可以为此使用正则表达式。

Option Explicit
Function trimLength(S As String, Optional Length As Long = 60) As String
    Dim RE As Object, MC As Object
    Dim sPat As String

sPat = "^.{1," & Length - 1 & "}(?=\s|$)"

If Len(S) > 60 Then
    Set RE = CreateObject("vbscript.regexp")
    With RE
        .Pattern = sPat
        .MultiLine = True
        Set MC = .Execute(S)
            trimLength = MC(0)
    End With
Else
    trimLength = S
End If

End Function

enter image description here

请注意,根据您的问题,我们从所需长度中减去一个。

正则表达式的解释

修剪长度到整个单词

^.{1,59}(?=\s|$)

选项:在线中断处的^ $匹配

使用RegexBuddy创建

© www.soinside.com 2019 - 2024. All rights reserved.