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值。。。所以数组应该完全相同,否则进一步处理会有点困难。。