引言
我正在尝试删除一行,如果在该数组中找到该行的值。
将值输入到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()
值一起使用时会有什么时髦吗?
答案 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
是回车/换行
根据您使用的软件,每个软件可能完全相同,也可能不同。但是当你在寻找新的线路时,检查所有这些常数总是一个好主意。