Vba 如何仅替换字符串中的某些空格?
我为数据创建了一个导入函数 有时,导入字符串如下所示:Vba 如何仅替换字符串中的某些空格?,vba,Vba,我为数据创建了一个导入函数 有时,导入字符串如下所示: Sub test() Dim s As String: s = "47588328 2020.06.25 11:42:13 buy 0.11 eurusd 1.12240 1.11902 0.00000 2020.06.25 14:05:04 1.11902 0.00 0.00 0.00 -35.35" Dim resultArray As Variant resultArray = GetSplit(s) En
Sub test()
Dim s As String: s = "47588328 2020.06.25 11:42:13 buy 0.11 eurusd 1.12240 1.11902 0.00000 2020.06.25 14:05:04 1.11902 0.00 0.00 0.00 -35.35"
Dim resultArray As Variant
resultArray = GetSplit(s)
End Sub
Sub test()
Dim s As String: s = "47588328 2020.06.25 11:42:13 buy 0.11 eurusd 1.12240 1.11902 0.00000 2020.06.25 14:05:04 1.11902 0.00 0.00 0.00 -35.35"
MsgBox GetSplit2(s)
End Sub
47588328 2020.06.25 11:42:13购买0.11欧元1.12240 1.11902 0.00000美元2020.06.25 14:05:04 1.11902 0.00 0.00 0.00-35.35 有时候像这样
45881875
2020.05.25 19:53:14
buy
0.10
eurusd
1.08975
1.08999
1.09503
2020.05.26 10:49:17
1.09503
0.00
0.00
-0.48
51.14
我将这些值拆分为一个数组。如果字符串由换行符分隔,则没有问题
如果字符串用空格隔开,我无法处理它。我试图用换行符替换空格。这将工作,但有日期和时间部分。它们必须保持在一起,当我用换行符替换空格时,它们不会保持在一起 我有这个:
TextboxText = UserForm1.TextBox1.Text
TextboxText = Replace(TextboxText, " ", vbLf)
我的一个想法是建立一个循环,通过所有的空间,然后只是除了空间号2和10。例如,使用伪代码:
> For Each Space in TextboxText
> If Not space nr = 2 or space nr = 10 Then
> replace space
> End if
> Next
这并不像我最初希望的那样干净,我认为可能有更好的方法,但确实有效:
Function GetSplit(s As String)
Dim x As Variant: x = Split(s, " ")
Dim r(13) As String
Dim i As Long
Dim j As Long
For i = 0 To 15
If i = 1 Or i = 9 Then
r(j) = x(i) & " " & x(i + 1)
i = i + 1
Else
r(j) = x(i)
End If
j = j + 1
Next i
GetSplit = r
End Function
它只是在被“”拆分的数组中循环,并在同一位置的值之间移动,除非它们位于位置1或9(空格2或10),在这种情况下,它会将第一个数组计数器合并并增加1,如下所示:
Sub test()
Dim s As String: s = "47588328 2020.06.25 11:42:13 buy 0.11 eurusd 1.12240 1.11902 0.00000 2020.06.25 14:05:04 1.11902 0.00 0.00 0.00 -35.35"
Dim resultArray As Variant
resultArray = GetSplit(s)
End Sub
Sub test()
Dim s As String: s = "47588328 2020.06.25 11:42:13 buy 0.11 eurusd 1.12240 1.11902 0.00000 2020.06.25 14:05:04 1.11902 0.00 0.00 0.00 -35.35"
MsgBox GetSplit2(s)
End Sub
当然,这一切只适用于每次收到的字符串格式完全相同的情况,我希望这些日期不要移动
编辑
我试图编辑这一个,以利用
IsDate
使其更具动态性,但IsDate
对于其中的许多字符串返回true,例如,“0.11”是一个日期,对于实际日期它甚至返回false(可能是由于区域设置)我要说的是,像您一直在做的那样将其拆分为一个数组(大概是使用split(strText)
然后返回数组以将日期与时间重新连接起来
For x = LBound(myArray) to Ubound(myArray)
'If IsDate(myArray(x)) Then - This didn't work as would erroneously return TRUE for decimals
If Format(Cdate(myArray(x)), "yyyy") <> "1899" Then
MyArray(x) = MyArray(x) & " " & MyArray(x+1) 'Join it to the value after
MyArray(x+1) = "" 'Delete the value after (time value)
End If
Next
x=LBound(myArray)到Ubound(myArray)的
'如果是IsDate(myArray(x)),那么-这不起作用,因为小数会错误地返回TRUE
如果格式为Cdate(myArray(x)),“yyyy”)“1899”,则
MyArray(x)=MyArray(x)&“&MyArray(x+1)”将其连接到后面的值
MyArray(x+1)=“”删除(时间值)之后的值
如果结束
下一个
然后,此后对数组所做的任何操作都只需包括,例如,如果MyArray(x)”“,则会漏掉这些空值。此操作直接返回一个字符串而不循环,但它还依赖于您的日期位置永远不会更改的前提和一个神奇的“
”占位符字符串
Function GetSplit2(s As String) As String
Dim x As Variant: x = Split(s, " ")
s = Replace(s, x(1) & " " & x(2), x(1) & "<dt>" & x(2))
s = Replace(s, x(9) & " " & x(10), x(9) & "<dt>" & x(10))
s = Replace(s, " ", vbCrLf)
GetSplit2 = Replace(s, "<dt>", " ")
End Function
我刚刚试过这个,它似乎对IsDate是真的,即使是在字符串“0.11”-非常奇怪你好,斯宾塞·巴恩斯,我真的很喜欢你的解决方案!非常性感:)非常感谢您提出这个问题。我喜欢它,因为日期可以在字符串中的任何位置。但是正如jamheadart所说,唯一的问题是它不仅在日期上返回IsDate的值。您知道如何解决这个问题吗?问题是像“0.11”这样的值,它们被解释为一个日期,我们能以某种方式排除它吗?也许是用正则表达式,但我不知道如何使用它们…嗯…不得不说我并没有完全测试它,只是这是我想到的第一个解决方案。忘了它会将小数(0.11)解释为时间(在本例中为00:11:00)因此,下一个修正;使用
Cdate
而不是IsDate
来检查它实际上是一个日期而不是时间。现在就把它编辑到答案中吧…@LucaS,如果这是我从未听说过的Regex的任何安慰的话。我还想到了一个可能更简单的方法;如果IsDate(myArray(x)&“&myArray(x+1))
-我想可以用它来代替。选择你最喜欢的。你很漂亮:)我还找到了一个解决方案,可以对“?。?”模式进行传统的检查,就像这样,然后用if TestCheck=False语句进行测试。。但是我想你的解决办法更好。。非常感谢你的帮助。。。您认为可以从数组中删除这两个空值吗?但只有这2个值,因为可能还有其他emtpy值。。。所以数组应该完全相同,否则进一步处理会有点困难。。