使用Split()作为NewLine分隔符VBA

时间:2018-01-09 22:03:47

标签: arrays vba excel-vba excel

引言

我正在尝试删除一行,如果在该数组中找到该行的值。

将值输入到Userform上的TextBox中,每个值由NewLine字符分隔。

我想我已经设法确定Split()函数中的逻辑是错误的。从在线研究中,我看到人们使用......

Split(text, Chr(10))
Split(text, Chr(16))
Split(text, vbLf)

这些值中没有一个(Chr(10)Chr(16)vbLf)似乎按预期工作......似乎正在发生的事情是它会找到{{1} }但是它不是从字符串中删除它并在放入数组时保留值。

CODE

填写数据......

NewLine

删除行......

data() = Split(frmDeleteLines.textData, Chr(10))
''''' Also tested Chr(16) and vbLf

使用比较值搜索数组...

Private Sub DeleteLines(textArr() As String, column As Long)

   Dim LR As Long

   LR = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).row

   With ActiveSheet
      For i = LR To 3 Step -1
         If Not (SearchArray(.Cells(i, column), textArr())) Then '<--- Call search array
            .Cells(i, column).EntireRow.Delete 'Delete row if found
         End If
      Next i
   End With

End Sub

Private Function SearchArray(searchValue As String, textArr() As String) As Boolean SearchArray = False For i = LBound(textArr()) To UBound(textArr()) Debug.Print "Comparing: " Debug.Print " ARR: " & textArr(i) Debug.Print " VAL: " & searchValue If (searchValue = textArr(i)) Then SearchArray = True Debug.Print " DONT DELETE!!!!!" Exit For End If Next i End Function 用于调试目的,这就是让我相信Debug.Print函数没有按预期执行的...让我理解Split()函数中的分隔符不会被包含在它被放入的数组中。也许Split()值还有更多内容?

INPUT

NewLine

比较价值

123456
789456
456123
456789

最终结果

 |_____A____|_____B____|_____C____|
1|  123456  |   BLAH   |   BLAH   |
2|  487964  |   BLAH   |   BLAH   |
3|  456123  |   BLAH   |   BLAH   |
4|  753496  |   BLAH   |   BLAH   |

理论上应该保留行 |_____A____|_____B____|_____C____| 1| 123456 | BLAH | BLAH | 2| | | | 3| | | | 4| | | | 1,但它会删除所有行......

当我查看即时窗口时,我注意到输出的值如下...

3

手上的问题

我的逻辑不正确吗?或者Comparing: ARR: 123456 VAL: 123456 Comparing: ARR: 789456 VAL: 123456 Comparing: ARR: 456123 VAL: 123456 Comparing: ARR: 456789 VAL: 123456 函数与Split()值一起使用时会有什么时髦吗?

2 个答案:

答案 0 :(得分:5)

如果您的TextBox已设置为使用vbNewLine分隔值,请使用vbNewLine作为Split函数中的分隔符,即Split(text, vbNewLine)

vbNewLine通常等同于Chr(13) & Chr(10)(即CR / LF组合)。因此,这与vbCrLf相同,因此以下所有内容都应该有效:

data = Split(frmDeleteLines.textData, vbNewLine)
data = Split(frmDeleteLines.textData, vbCrLf)
data = Split(frmDeleteLines.textData, Chr(13) & Chr(10))

答案 1 :(得分:3)

您可以通过以下功能形式完成此操作:

Function splitLineBreaks(ByVal str As String) As String
    str = Replace(str, vbCrLf, vbCr)
    str = Replace(str, vbLf, vbCr)
    splitLineBreaks = Split(str, vbCr)
End Function

这些常数的历史来自作家日;

vbCr 回车(将头部返回到打字机的开头)
vbLF换行(将页面移动一行)
通常这两个人会合并,因为它只是有意义的,进入:
vbCrLf回车/换行

根据您使用的软件,每个软件可能完全相同,也可能不同。但是当你在寻找新的线路时,检查所有这些常数总是一个好主意。