String VBA将字符串拆分为小数点后的2个字符

String VBA将字符串拆分为小数点后的2个字符,string,vba,excel,split,String,Vba,Excel,Split,我有以下字符串: 股息34.3228.1028.0028.0028.0028.0028.0028.0028.0028.0028.0028.0028.0029.5030.50 我希望将其拆分,以便将其作为34.32,28.10,28.00等格式,然后放入excel中的一行。我的问题是,我希望在小数点右侧拆分2个字符,因为我要删除的表格数据是美元格式的,例如: 这是我尝试过的,但我仍然不知道如何根据小数点后的2个字符进行拆分: Dim eTR As Object, cTR As Object, a

我有以下字符串:

股息
34.3228.1028.0028.0028.0028.0028.0028.0028.0028.0028.0028.0028.0029.5030.50

我希望将其拆分,以便将其作为
34.32
28.10
28.00
等格式,然后放入excel中的一行。我的问题是,我希望在小数点右侧拆分2个字符,因为我要删除的表格数据是美元格式的,例如:

这是我尝试过的,但我仍然不知道如何根据小数点后的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
但出于某种原因,我不断得到不属于该行的随机表数据输入。作为一种解决方法,我想抓住桌子上的一行,把绳子分开

提前感谢


tom

不带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个字符开始,因为数据长度为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行以数字形式返回结果

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不是我的强项,因此可能存在一些巨大的语法问题,但是你能看到我直接写入数组/单元格的方向吗?您可以在构建字符串的同一点执行此操作。

需要更多技术,并确保需要2位小数点。
谢谢你的想法

请尝试:

' 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

字符串是否已在excel中?如果excel公式可用,这是否合适,或者您是否专门寻找VBA?您尝试过什么吗?你的密码在哪里?你是要我们帮你写吗?你可以在前面写三个以上的字吗。你能在前面写少于2个字符吗?总有10个数字需要分开吗?这里似乎有一些误解。这不是一个代码编写服务,你发布你的需求和想要的语言,然后有人炮制代码来满足它们。在你自己做了一些努力之后,我们非常乐意帮助你。一旦您这样做了,如果您遇到困难,您可以解释问题,发布代码的相关部分,并询问有关您遇到的问题的特定问题,我们将很高兴尝试并帮助您找到解决方案。祝你好运。很抱歉遇到这样的问题,但我试图直接回答这个问题,所以它很简短,切中要害。如果你需要一个纯VBA解决方案,你在这里有一个思维过程,你可以转换为VBA。另外,如果您只需要VBA解决方案,那么您应该将标签从excel更改为excel VBAThanks。我感谢您的回复!是的,这确实帮助我收集了一个想法。我认为使用VBA路线,拆分可以让你开始,但是你需要交换每个数组元素中的字符来构建你的数字。可能是屁股有点痛。在遇到错误的地方计数后,最好是逐步遍历字符串,直到计数为+2。将字符串存储到该点,然后开始构建新字符串。