Board logo

標題: [發問] 有關資料剖析 [打印本頁]

作者: tommy.lin    時間: 2012-3-27 11:23     標題: 有關資料剖析

想要教Column A(整欄位)的資料分割到B/C/D 欄位
A欄位資料內容為日期格式 使用VB寫的話應該怎麼寫?分割依據為"/" 但是沒法順利切割開
不知道我寫的是否正確想請教板上專家

Sub AA()
Range("A:A").TextToColumns Destination:=Range("B"), OtherChar _
        :="/"

End Sub
作者: hugh0620    時間: 2012-3-27 11:42

本帖最後由 hugh0620 於 2012-3-27 11:47 編輯

回復 1# tommy.lin


    A欄位是日期格式~ 代表的就是年月日
    你要拆解的BCD欄位也就是年月日~
    用一般最簡單的方式~來拆解就可以了~
    若你A資料是從資料庫倒出來的~ 可能會是文字格式~有可能要修改一下~
    如果可以~ 請提供資料的範例~
  1. Sub EX_1()

  2. For Each a In Range("A:A")
  3.     If a <> "" Then
  4.        a.Offset(0, 1) = Year(a)
  5.        a.Offset(0, 2) = Month(a)
  6.        a.Offset(0, 3) = Day(a)
  7.     End If
  8. Next

  9. End Sub
複製代碼

作者: tommy.lin    時間: 2012-3-27 11:48

回復 2# hugh0620

檔案已上傳
作者: hugh0620    時間: 2012-3-27 12:03

本帖最後由 hugh0620 於 2012-3-27 12:17 編輯

回復 3# tommy.lin

B欄位~ 請改成數值格式~
題供兩種方式給你參考~
  1. Sub EX_1()
  2. For Each a In Range("A2:A65536")
  3.     If a <> "" Then
  4.        a.Offset(0, 1) = Year(a)
  5.        a.Offset(0, 2) = Month(a)
  6.        a.Offset(0, 3) = Day(a)
  7.     End If
  8. Next
  9. End Sub
複製代碼
  1. Sub xx()  '將字串分割成子字串
  2. For Each a In Range("A:A")
  3. h = Split(a, "/", 3, vbDatabaseCompare)
  4.     i = 1
  5.     For Each b In h
  6.     a.Offset(columnoffset:=i) = b
  7.     i = i + 1
  8.     Next
  9. Next
  10. End Sub
複製代碼

作者: tommy.lin    時間: 2012-3-27 13:04

可以了...Thanks lots..不過看不懂語法

作者: mark15jill    時間: 2012-3-27 13:35

本帖最後由 mark15jill 於 2012-3-27 13:36 編輯

回復 5# tommy.lin
直接把程式丟進VBA內..



sub xxg
        Columns("a:a").Select
    Selection.TextToColumns Destination:=Range("G1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
        :="/", FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2)), _
        TrailingMinusNumbers:=True
end sub

作用:用 / 為判斷符號 加以切割
作者: tommy.lin    時間: 2012-3-27 13:52

我有試著用巨集錄製成上面這樣子但實際執行時會出現error....
作者: mark15jill    時間: 2012-3-27 15:41

本帖最後由 mark15jill 於 2012-3-27 15:49 編輯

回復 7# tommy.lin


    麻煩貼圖 看哪邊有錯..



Sub xyw()
Columns("g:g").Select
    Selection.TextToColumns Destination:=Range("m1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
        :="/", FieldInfo:=Array(Array(3, 2), Array(2, 2), Array(1, 2)), _
        TrailingMinusNumbers:=True
        
    sy = Columns("o:o").Value
    Columns("t:t") = sy
    sm = Columns("n:n").Value
    Columns("u:u") = sm
    sd = Columns("m:m").Value
    Columns("v:v") = sd
    Columns("m:o").Clear
End Sub
作者: tommy.lin    時間: 2012-3-28 10:10

問題好像解開了...原本我有四個日期欄位需要資料剖析原本錄製的方式是一次全部做完
但是好像會有錯亂的現象(執行到一半卡住或是後面的插入欄位錯位)我的步驟如下
在每個日期欄位後面插入五個空白欄位資料剖析後刪除最後兩個預留欄位.以上步驟重覆四次
後來我分四次錄製在串接起來沒有錯誤發生.anyway 感謝板上高手協助
作者: freeffly    時間: 2012-3-28 16:47

回復 4# hugh0620

  大大下面兩的可以解釋一下嗎
    vbDatabaseCompare  & columnoffset
    不太曉得用法
作者: GBKEE    時間: 2012-3-28 17:09

回復 10# freeffly
VBA 的說明
Split 函數 傳回一個陳列索引從零開始的一維陣列,它包含指定數目的子字串。
語法
Split(expression[, delimiter[, limit[, compare]]])
Split 函數語法有如下幾個指名引數: 請查看VBA 的說明

Offset 屬性   傳回 Range 物件,用以代表某個指定區域以外的範圍。唯讀。
expression.Offset(RowOffset, ColumnOffset)
expression     必選。該運算式傳回 Range 物件。
RowOffset      選擇性的 Variant。用列數表示的區域位移 (正值、負數或零 (0))。正值表示向下位移,負值表示向上位移。預設值為 0。
ColumnOffset      選擇性的 Variant。用欄數表示的區域位移 (整數、負數或 0 (零))。正值表示右位移,負值表示左。預設值為 0。
  1. Option Explicit
  2. Sub Ex()  '將字串分割成子字串
  3.     Dim A As Range
  4.     'SpecialCells 方法 此物件代表與指定型態及值相符合的所有儲存格。Range 物件。
  5.     For Each A In Range("A:A").SpecialCells(xlCellTypeConstants) 'xlCellTypeConstants。包含常數的儲存格
  6.         'If IsDate(A) Then     '是日期型態
  7.         If InStr(A, "/") Then  '字串中有 "/"
  8.         'InStr 函數 傳回在某字串中一字串的最先出現位置,此位置為 Variant (Long)。
  9.             With A.Offset(, 1).Resize(, 3)
  10.             '以A.Offset(, 1):[B欄],Resize(, 3):擴充3欄的Range範圍
  11.                 .Value = Split(A, "/")   '以 "/" 分割字串
  12.                 .Value = .Value          '變更為數字
  13.             End With
  14.            'Split 函數 傳回一個陳列索引從零開始的一維陣列 , 它包含指定數目的子字串
  15.         End If
  16.     Next
  17. End Sub
複製代碼

作者: freeffly    時間: 2012-3-28 17:36

回復 11# GBKEE


    謝謝版主解釋
   好像還要花點時間理解
  先收下來慢慢品嚐一下




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)