0

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

  • 如果“服务类型描述”> 60 个字符,则将名称缩减为 < 60 个字符,但只有完整的单词

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

Dataset#1 是实时的,可以随时用更新的数据重新拉取,所以我需要创建一个模板,允许我从 DataSet#2(当前具有完整长度的描述)的列表中提取信息到任何基于 DataSet#1 中修剪的服务类型描述的 Dataset#1 的副本。


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

  • “FNMA 1025 Small Residential Income Property Appraisal & FNMA 216 Addendum”(73 个字符,包括空格)

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

  • “FNMA 1025 小型住宅收入财产评估和 FNM”

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

  • 《FNMA 1025 Small Residential Income Property Appraisal &》(56个字,8个“字”,含&)

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


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

4

2 回答 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

希望这会有所帮助,因为那里有一个循环,我会看看无限循环的任何可能性。

于 2020-02-11T14:35:48.523 回答
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

在此处输入图像描述

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

正则表达式的解释

将长度修剪为整个单词

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

选项: ^$ 匹配换行符

使用RegexBuddy创建

于 2020-02-12T01:04:37.497 回答