Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 最后一个单词在整个单词字符串拆分过程中消失_Vba_Excel - Fatal编程技术网

Vba 最后一个单词在整个单词字符串拆分过程中消失

Vba 最后一个单词在整个单词字符串拆分过程中消失,vba,excel,Vba,Excel,我有一个sub,它设计用于将带有轮廓的字符串切割成段,然后使用“文本到列”将其存储在拆分段中的工作表中,以便它们可以单独加载到自定义弹出窗口中。我的问题是它总是从字符串中剪切和删除最后一个单词。我显然遗漏了一些东西,因为我看不出有什么问题。有人能告诉我为什么我总是失去最后一个字吗 Sub CutStringLength(ByVal NoteInput As String, ByVal ControlCall As String) '"NoteInput" is a string from

我有一个sub,它设计用于将带有轮廓的字符串切割成段,然后使用“文本到列”将其存储在拆分段中的工作表中,以便它们可以单独加载到自定义弹出窗口中。我的问题是它总是从字符串中剪切和删除最后一个单词。我显然遗漏了一些东西,因为我看不出有什么问题。有人能告诉我为什么我总是失去最后一个字吗

Sub CutStringLength(ByVal NoteInput As String, ByVal ControlCall As String)
    '"NoteInput" is a string from a inputbox
    '"ControlCall" is a variable name used in sheets, controls and functions

Dim AlteredString As String
Dim InnerLoop As Long, StringLimit As Long
Dim StartString As Variant

AlteredString = ""
StringLimit = 35
StartString = Split(NoteInput, " ")

For InnerLoop = LBound(StartString) To UBound(StartString)
If InnerLoop < UBound(StartString) Then
    AlteredString = AlteredString & StartString(InnerLoop) & " "
If (Len(AlteredString) + Len(StartString(InnerLoop + 1))) > StringLimit Then
   AlteredString = AlteredString & "|"
   StringLimit = Len(AlteredString) + 35
End If
End If
Next

AlteredString = Trim(AlteredString)

Worksheets(ControlCall).Range("BS2").Value = AlteredString
Worksheets(ControlCall).Select
Range("BS2").Select

Selection.TextToColumns Destination:=Range("BS2"),DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, _ 
OtherChar:="|", FieldInfo:=Array(1, 1), TrailingMinusnumbers:=True

End Sub
Sub-CutStringLength(ByVal NoteInput作为字符串,ByVal ControlCall作为字符串)
““NoteInput”是来自inputbox的字符串
“ControlCall”是一个用于工作表、控件和函数的变量名
Dim AlteredString作为字符串
变暗内循环长度为,StringLimit长度为
暗启动串作为变体
AlteredString=“”
StringLimit=35
StartString=Split(NoteInput,“”)
对于InnerLoop=LBound(StartString)到UBound(StartString)
如果InnerLoopStringLimit,那么
AlteredString=AlteredString&“|”
StringLimit=Len(可选字符串)+35
如果结束
如果结束
下一个
AlteredString=修剪(AlteredString)
工作表(ControlCall).Range(“BS2”).Value=AlteredString
工作表(ControlCall)。选择
范围(“BS2”)。选择
Selection.TextToColumns Destination:=范围(“BS2”),数据类型:=xlDelimited_
TextQualifier:=xlDoubleQuote,continuedDelimiter:=False,Tab:=False_
分号:=False,逗号:=False,空格:=False,其他:=True,\u
OtherChar:=“|”,FieldInfo:=数组(1,1),TrailingMinusnumbers:=True
端接头

使用InStrRev从最大位置向后查找第一个空格

Option Explicit

Sub test()
    Dim pcs As Variant
    Cells(1, "B") = splitString(Cells(1, "A").Value2)
    pcs = Split(Cells(1, "B").Value2, Chr(124))
    Cells(2, "B").Resize(1, UBound(pcs) + 1) = pcs
End Sub

Function splitString(str As String, Optional n As Long = 60)
    Dim p As Long, w As Long, words() As Variant

    Do While Len(Trim(str)) > n And CBool(InStr(1, str, Chr(32)))
        p = InStrRev(str, Chr(32), n)
        ReDim Preserve words(w)
        words(w) = Trim(Left(str, p))
        str = Trim(Mid(str, p))
        w = w + 1
    Loop

    ReDim Preserve words(w)
    words(w) = Trim(str)
    splitString = Join(words, Chr(124))
End Function
没有必要求助于TextToColumns。您可以将调整后的字符串拆分为变量数组,并将值直接传递到工作表中


看起来您想将一个长字符串拆分为一个完整的单词,每个段的长度限制为255个字符。对吗?字符串限制必须比255小得多,我设置的字符串限制是35。我的自定义弹出窗口没有自动换行功能,因此字符串必须拆分并作为单独的行加载。或者您可以放置一个
Chr(10)
以相同的间隔换行。我使用的弹出菜单是我不久前下载的一个类模块,它在用户窗体中创建了一个鼠标右键菜单到一个命令按钮,尽管我正在进步,但我仍然是VBA的新手,可以在其中添加Chr()函数。您是否曾经访问过
开始字符串(UBound)(StartString)
?当Index=Ubound(StartString)时,IF似乎会跳过该选项。输入框严格用于在帐户上添加注释,并作为工作表上的永久记录存储在帐户持有人下。只有当用户右键单击“单个帐户”命令按钮时,才会动态填充弹出菜单,然后字符串作为注释添加到菜单顶部。因为菜单的类模块不可用为了处理Chr()函数,我必须将字符串的段作为“additem”加载到菜单中,并发现加载数组非常容易出错。将工作表上的注释存储在段中,然后分别加载它们是我的最佳路径。