VBA在小数点后将字符串拆分2个字符

时间:2016-05-13 00:47:44

标签: string vba excel-vba split excel

我有以下字符串:

股息
34.3228.1028.0028.0028.0028.0028.0028.0029.5030.50

我希望将其拆分,以便我可以将其34.3228.1028.00等转换为excel中的一行。我的问题特别在于我希望将它分成2个字符到小数点的右边,因为从中删除它的表数据是一个美元格式,例如:

Picture on website

这是我尝试的但是我再也不知道如何根据小数点后的2个字符拆分它:

Dim eTR As Object, cTR As Object, a As Integer 
Set cTR = doc.getElementsByTagName("tr")
a = 0

For Each eTR In cTR
If Left(eTR.innerText, 9) = "Dividends" Then
    TR = doc.getElementsByTagName("tr")(a).innerText
     Debug.Print TR
    'Debug.Print a

End If
a = a + 1


Next

Dim s As Variant
s = (Split(TR, ".")(1))
Cells(1, 2).Value = s
Cells(1, 3).Value = s(1)
Cells(1, 4).Value = s(2)
Cells(1, 5).Value = s(3)
End Sub

我也厌倦了使用以下代码获取每个表格数据(因为它在图像上看起来):

'get divs/share
chk = 0
dividends:
Dim eTR3 As Object, cTR3 As Object
Set cTR3 = doc.getElementsByTagName("td")
g = 0

For Each eTR3 In cTR3
If Left(eTR3.innerText, 9) = "Dividends" Then
    TR5 = doc.getElementsByTagName("td")(g).innerText
    r = 1
    i = g + 10
    For h = g To i Step 1
    TR5 = doc.getElementsByTagName("td")(h).innerText
    Cells(s + 4, r + 1).Value = TR5
    r = r + 1
    Next h
End If
g = g + 1
Next

但由于某种原因,我不断获得不属于该行的随机表数据输入。作为一种解决方法我想到抓住表格行并将字符串分开。

先谢谢了!

汤姆

3 个答案:

答案 0 :(得分:1)

没有VBA的Excel解决方案。

假设你的字符串在A列中,并且字符串中有10个数字要被拔出。

在M栏或更右侧使用:

=FIND(".",$A$1,L1+1)

确保此公式左侧的列为空。将公式向右复制10列。在我的测试用例中,它是第V列。这将返回每个的位置。在字符串中。如果你向右移动足够远,它最终会返回一个错误,表明没有进一步的错误。在要找到的字符串中。

在B栏中使用以下公式:

=MID(A1,5,M1-2)
'or if you want it as a number and not a string
=MID(A1,5,M1-2)*1

它的独特之处在于它是数据的开始,而且模式还没有开始。您知道第一个数字将始终作为第5个字符开始,因为DATA长度为4个字符。 M1-2根据小数点的位置告诉返回多少个字符。

在C栏中使用此公式,可以在模式重复后立即复制:

=MID($A1,N1-(N1-M1-3),(N1-M1))
'or if you want it as a number and not a string
=MID($A1,N1-(N1-M1-3),(N1-M1))*1

将其复制到右边9次,在测试用例中复制到列K它基本上是测量它们之间的距离。并确定从当前小数返回的字符数以及要返回的字符数。

现在,您可以为放在A栏中的每个新字符串复制B1:V1。完成后,您可以根据需要复制和粘贴值。

概念证明

我在图像中的交错行上有结果,以节省空间并显示所有点。另外请不要这样,因为除非您格式化单元格,否则某些数字以单尾或双尾零excel结尾将不会显示它们。在图像中,行2将结果作为字符串返回,第4行将结果作为数字返回。

enter image description here

答案 1 :(得分:1)

需要更多技术并确保您需要2位小数点 感谢@Forward Ed的想法。

请尝试:

' This sub is example to call splittext() function
Sub test()
Dim retArr() As String

retArr = splittext("Dividends34.3228.1028.0028.0028.0028.0028.0028.0029.5030.50")

' us reArr to do other stuff here
End Sub


Function splittext(str) As String()
Dim startPos As Integer
Dim splitArr() As String
Dim arrSize As Integer

str = Replace(str, "Dividends", "")

startPos = 1
arrSize = 0
Do While InStr(startPos, str, ".") > 0
    ReDim Preserve splitArr(arrSize)

    splitArr(arrSize) = Mid(str, startPos, InStr(startPos, str, ".") + 3 - startPos)
    arrSize = arrSize + 1
    startPos = InStr(startPos, str, ".") + 3
Loop

splittext = splitArr
End Function

答案 2 :(得分:0)

VBA想:

我没有要测试的链接文档,但是这个概念怎么样:

Sub test()
Dim eTR As Object, cTR As Object
Dim a As Integer
Dim s() As Variant

Set cTR = doc.getElementsByTagName("tr")
ReDim s(1)

a = 0

For Each eTR In cTR
    If Left(eTR.innerText, 9) = "Dividends" Then
        TR = doc.getElementsByTagName("tr")(a).innerText
        Debug.Print TR
        'Debug.Print a
        s(a) = doc.getElementsByTagName("tr")(a).innerText
    End If
    a = a + 1
    ReDim Preserve s(a)
Next

'this range needs to be equal in size to your array.
Range(Cells(1, 2), Cells(1, a+1)).Value = s

End Sub

VBA不是我的强项,因此可能存在一些巨大的语法问题,但你能看到我在直接写入阵列/单元格的位置吗?你可以在构建字符串的同一点上完成它。