2016-05-13 98 views
1

我有以下字符串:VBA分裂小數點後的字符串由2個字符

股息
34.3228.1028.0028.0028.0028.0028.0028.0029.5030.50

我期待分割它,所以我可以得到它爲34.3228.1028.00等等,然後在excel中放入一行。我的問題是特別,我在找2個字符把它分解到小數點右邊,因爲表的數據IM從報廢是它例如一塊錢格式:

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 

但由於某種原因,我一直在獲取不屬於該行的隨機表數據輸入。爲了解決這個問題,我想抓住桌子排,把繩子分開。

感謝先進!

湯姆

+0

是字符串已經在Excel中?如果一個excel公式可用,那麼這將是合適的,還是您特別尋找VBA? –

+1

你嘗試過什麼嗎?你的代碼在哪裏?你問*我們*爲你寫嗎? –

+0

你可以在前面有超過3個字符。你可以在前面少於2個字符。 ?總共會有10個號碼被分開嗎? –

回答

1

Excel的解決方案,而VBA。

假設您的字符串位於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 

其獨特的,因爲它是你的數據的開始和模式還沒有開始。你知道第一個數字總是以第五個字符開頭,因爲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

+0

如果你需要一個純粹的VBA解決方案,你可以在這裏考慮一下你可以轉換成VBA的思維過程。此外,如果您只需要VBA解決方案,那麼您應該將標籤從excel更改爲excel-VBA –

+0

謝謝感謝我的回覆!是的,這絕對有助於我收集一個想法。 – Default001

+0

我認爲用VBA路線,split會讓你開始,但是你將需要從每個數組元素周圍交換字符來構建你的號碼。可能會有點痛苦的屁股。你可能會更好地通過你的字符串,直到你計算出來的數字爲+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是不是我的強項所以可能會有一些在那裏有巨大的語法問題,但你能看到我直接寫入數組/單元格的位置嗎?你在建立你的字符串的同一時刻完成它。

1

需要更多TECHNIC,並確保你需要2位小數點。
感謝@Forward埃德的想法。

請嘗試:

' 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