PDA

View Full Version : tách dãy số cách nhau dấu phẩy



hung1981
18-03-08, 07:37 PM
Mình có dãy số ví dụ:
1178.38,1179.02,1177.11,1175.2.................... ..............
Bạn nào giúp mình viết 1 function tách nó thành từng số riêng từng ô tự động mà không giới hạn số trong dãy đó
ví dụ: dãy đó mình đặt ở ô A1 thì sẽ tách tự động sang các cột riêng B1, C1...

salam
18-03-08, 10:00 PM
Bạn dùng luôn data/text to column/delimited chọn comma nhấn finish là xong rồi.

longnh
10-04-08, 04:02 PM
Bạn cũng có thể dùng một chương trình soạn thảo thay thế "," bằng TAB rồi dán vào Excel, mặc định nó sẽ theo cột.
Nếu thay thế bằng xuống dòng (^p) trong word ==> dòng.

HuuThanh
10-05-08, 01:47 AM
Mình cũng hay có những dãy số có dấu phẩy cần phải tác riêng ra các hàng. Mình chỉ làm thủ công là copy nó ra file txt sau đó mở lại file đó bằng excel là được. Nó tự tách luôn. Nhưng nếu được các anh cao thủ viết cho cái Funtion bằng maco thì thật tốt. Các anh giúp chúng em với !

cadafi
10-05-08, 06:20 AM
Mình cũng hay có những dãy số có dấu phẩy cần phải tác riêng ra các hàng. Mình chỉ làm thủ công là copy nó ra file txt sau đó mở lại file đó bằng excel là được. Nó tự tách luôn. Nhưng nếu được các anh cao thủ viết cho cái Funtion bằng maco thì thật tốt. Các anh giúp chúng em với !

Bạn chép đoạn code này vào module, sau đó tạo một nút lệnh (hoặc phím tắt) kích thủ tục này chạy, trước khi chạy phải chọn vùng cần tách số (có thể là 1 ô hoặc nhiều dòng, nhưng chỉ duy nhất 1 cột)

Trong file ví dụ, bạn kéo chuột chọn từ ô A4:A6, sau đó click nút [Process]
trong hộp input box gõ vào B8, dữ liệu sẽ được tách ra và copy bắt đầu từ ô B8.


Sub TextToColumn()
On Error GoTo ErrorText
a = InputBox("Chon vung can luu du lieu", "Input Box")
Selection.TextToColumns Destination:=Range(a), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True

Exit_ErrorText:
Exit Sub

ErrorText:
MsgBox Err.Number & Space(2) & Err.Description & Chr(13) & _
"Co le ban chua chon o can tach so lieu, vui long chon o can tach so lieu"
Resume Exit_ErrorText

End Sub

HuuThanh
10-05-08, 10:07 PM
Cảm ơn các anh, các bạn đã nhiệt tình gúp đỡ, em vẫn dung Excel trong công việc nhưng không biết VBA lên chỉ làm thủ công mất rất nhiều thời gian, nay vào GPE được các anh, các bạn giúp đỡ nhiệt tình em được mở rộng tầm hiểu biết rất nhiều. Xin cảm ơn chân thành tới GPE đã cho chúng em một sân chơi bổ ích như thế này !!!

anhtuan1066
11-05-08, 10:34 AM
Mình có dãy số ví dụ:
1178.38,1179.02,1177.11,1175.2.................... ..............
Bạn nào giúp mình viết 1 function tách nó thành từng số riêng từng ô tự động mà không giới hạn số trong dãy đó
ví dụ: dãy đó mình đặt ở ô A1 thì sẽ tách tự động sang các cột riêng B1, C1...
Đầu tiên thay ký tự "," thành " " (thay dấu phẩy thành ký tự rổng)
Tiếp theo đưa bài toán về bài toán tách họ và tên
Đây cũng là 1 giãi pháp!
(Search tìm trên diển đàn với từ khóa "TÁCH TÊN")
Mến
ANH TUẤN

nanabi
09-01-09, 02:42 PM
anh ơi thế em có 1 số 789642 em muốn tách làm 6 cột mỗi cột 1 số thì phải dùng đoạn code như thế nào

ThuNghi
09-01-09, 02:51 PM
anh ơi thế em có 1 số 789642 em muốn tách làm 6 cột mỗi cột 1 số thì phải dùng đoạn code như thế nào
Thì dùng hàm mid(789642,1,1), mid(789642,2,1),..., mid(789642,6,1)

cadafi
09-01-09, 03:05 PM
anh ơi thế em có 1 số 789642 em muốn tách làm 6 cột mỗi cột 1 số thì phải dùng đoạn code như thế nào

Giả sử ô A1=789642
Ô B1 bạn gõ công thức:

B1 = CHOOSE((LEN($A$1)>=COLUMN()-1)+1,"",MID($A$1,COLUMN()-1,1))

Sau đó copy qua các cột kế tiếp.

BNTT
09-01-09, 03:07 PM
anh ơi thế em có 1 số 789642 em muốn tách làm 6 cột mỗi cột 1 số thì phải dùng đoạn code như thế nào
Góp 1 cách củ chuối:

Giả sử con số 789642 của bạn đang ở ô A1.

Nếu bạn muốn tách con số có 6 chữ số này vào 6 ô liên tiếp (nằm trên cùng 1 dòng), bạn chọn hết 6 ô đó rồi nhập công thức này:

=MID($A$1, COLUMN(A$1), 1)
Nhập xong, nhấn Ctrl+Enter. Hoặc nhập công thức trong ô đầu tiên rồi copy đến ô thứ 6 cũng được.

Nếu thích sau khi tách xong, mà chúng vẫn là những con số (cộng trừ nhân chia được), thì bạn thêm *1 (hay +0, ^1,...) vào sau công thức trên.

BNTT
09-01-09, 03:16 PM
Giả sử ô A1=789642
Ô B1 bạn gõ công thức:

B1 = CHOOSE((LEN($A$1)>=COLUMN()-1)+1,"",MID($A$1,COLUMN()-1,1))

Sau đó copy qua các cột kế tiếp.
Công thức này, thứ nhất là dài quá mức cần thiết, thứ hai là chỉ đúng khi không nhâp vào cột A!

cadafi
09-01-09, 03:20 PM
Công thức này, thứ nhất là dài quá mức cần thiết, thứ hai là chỉ đúng khi không nhâp vào cột A!

Dạ em biết công thức của em thừa rồi! Cẩn thận quá mức nhiều khi cũng không hay! Khi làm thì nghĩ nếu lấy MID với thứ tự lớn hơn độ dài chuỗi thì nó sẽ báo lỗi, rốt cục nó lại không báo lỗi! Hóa ra bẫy lỗi thừa!

Cảm ơn anh BNTT!

nanabi
10-01-09, 10:45 AM
Góp 1 cách củ chuối:

Giả sử con số 789642 của bạn đang ở ô A1.

Nếu bạn muốn tách con số có 6 chữ số này vào 6 ô liên tiếp (nằm trên cùng 1 dòng), bạn chọn hết 6 ô đó rồi nhập công thức này:
=MID($A$1, COLUMN(A$1), 1)Nhập xong, nhấn Ctrl+Enter. Hoặc nhập công thức trong ô đầu tiên rồi copy đến ô thứ 6 cũng được.

Nếu thích sau khi tách xong, mà chúng vẫn là những con số (cộng trừ nhân chia được), thì bạn thêm *1 (hay +0, ^1,...) vào sau công thức trên.

cảm ơn bạn nhưng cái công thức này chỉ làm được với 1 dòng thôi hả, còn nhiều dòng thì phải đổi thành =MID($A1, COLUMN(A$1), 1) /-*+/ mà mình chỉ làm được khi số ở cột A thôi hả còn mình thử để số ở ô khác thì lại không được ví dụ mình số 789642 ở ô G10 mình đánh hàm =MID($G10,COLUMN(G$10),1) ở ô H10 lại không được

cadafi
10-01-09, 11:06 AM
cảm ơn bạn nhưng cái công thức này chỉ làm được với 1 dòng thôi hả, còn nhiều dòng thì phải đổi thành =MID($A1, COLUMN(A$1), 1)
Thì đúng rồi! Tùy từng bài toán cụ thể mà bạn đặt dấu $ vào đâu chứ! Cái này căn bản mà bạn!

Thêm nữa, bạn phải biết hàmn Column() nó trả về giá trị gì thì mới dùng được! Bây giờ bạn thử gõ =Column(G10) vào một ô nào đó xem coi giá trị của nó bao nhiêu rồi rút ra kết luận!

nanabi
10-01-09, 09:55 PM
cảm ơn bạn rất nhiều hóa ra là như vậy

longnh
10-07-09, 02:07 AM
anh ơi thế em có 1 số 789642 em muốn tách làm 6 cột mỗi cột 1 số thì phải dùng đoạn code như thế nào

MID cũng hay nhưng nếu lập trình thì MID là họ các hàm xử lý chuỗi, một số ngôn ngữ phân kiểu rạch ròi thì có giải pháp thế này.

789642 = 7*10^5 + 8*10^4 + 9*10^3 ... + 2*10^0

789642/10 lấy nguyên và 789642 - 789640 được 2 là số hàng đơn vị
tiếp tục với các số hàng chục hàng trăm...

Tuy hơn buồn cười xong thực tế lập trình đôi khi tư duy đơn giản như vậy :D

phamduylong
10-07-09, 09:50 AM
Mình có dãy số ví dụ:
1178.38,1179.02,1177.11,1175.2.................... ..............
Bạn nào giúp mình viết 1 function tách nó thành từng số riêng từng ô tự động mà không giới hạn số trong dãy đó
ví dụ: dãy đó mình đặt ở ô A1 thì sẽ tách tự động sang các cột riêng B1, C1...
Vấn đề nảy đã có nhiều trên GPE, nhưng thường chỉ giải quyết trong 1 trường hợp cụ thể.
Để hàm mang tính tổng quát, phải giải quyết 2 yêu cầu:
1. Cho phép thay đổi dấu tách trong hàm.
2. Có thể fill công thức sang ô khác mà hàm tách đúng số 1, số 2, ... theo thứ tự fill. Tức là hàm phải có khả năng nhận biết vị trí của nó so với ô chứa hàm đầu tiên.
Muốn thế, hàm cần thiết phải có 3 đối số:
number: chuỗi cần tách số
str: chuỗi ngăn cách các số trong number
idCol hoặc idRow: số thứ tự cột, dòng ô đầu tiên chứa hàm tách số. Hàm các ô khác căn cứ vào số này để biết vị trí số cần tách.
Do có thể fill cột, fill dòng nên có 2 hàm riêng biệt


Function TachSoCol(number As String, str As String, idC1 As Long) As Double
Dim idC2 As Long, arNum, SoTach
idC2 = Application.Caller.Column
arNum = Split(number, str)
SoTach = Trim(arNum(idC2 - idC1))
If IsNumeric(SoTach) Then
TachSoCol = CDbl(SoTach)
Else
For i = 1 To Len(SoTach)
If IsNumeric(Mid(SoTach, i, 1)) Then
TachSoCol = TachSoCol & Mid(SoTach, i, 1)
End If
Next
End If
End Function


Function TachSoRow(number As String, str As String, idR1 As Long) As Double
Dim idR2 As Long, arNum, SoTach
idR2 = Application.Caller.Row
arNum = Split(number, str)
SoTach = Trim(arNum(idR2 - idR1))
If IsNumeric(SoTach) Then
TachSoRow = CDbl(SoTach)
Else
For i = 1 To Len(SoTach)
If IsNumeric(Mid(SoTach, i, 1)) Then
TachSoRow = TachSoRow & Mid(SoTach, i, 1)
End If
Next
End If
End Function


|
A|
B|
C|
D|
E|
F|
G|

1|
|
Số cần tách|
Tách cột 1|
Tách cột 2|
Tách cột 3|
Tách cột 4|
Tách cột 5|

2| |12/345/678A/89,10|
12|
345|
678|
89,1| #VALUE!|

3| | |TachSoCol($B$2;"/";3)|TachSoCol($B$2;"/";3)|TachSoCol($B$2;"/";3)|TachSoCol($B$2;"/";3)|TachSoCol($B$2;"/";3)|

4| | | | | | | |

5|Tách dòng 1|
12|TachSoRow($B$2;"/";5)| | | | |

6|Tách dòng 2|
345|TachSoRow($B$2;"/";5)| | | | |

7|Tách dòng 3|
678|TachSoRow($B$2;"/";5)| | | | |

8|Tách dòng 4|
89,1|TachSoRow($B$2;"/";5)| | | | |

Chuỗi cần tách tại B2
Công thức tách cột tại C2=TachSoCol($B$2;"/";3)
số 3 là số thứ tự cột C2, fill công thức sang các ô D2, E2, F2, G2. Tại G2 báo lỗi #VALUE! vì vượt số cần tách.
Công thức tách dòng B5=TachSoRow($B$2;"/";5)
số 5 là số thứ tự dòng B5, fill công thức xuống B6, B7, B8.

Chú ý:
1. Hàm sau khi tách chuỗi, kiểm tra chuỗi cần tách, nếu không phải là số sẽ loại tất cả các ký tự không phải số ra khỏi chuỗi.
2. Đối với dấu ngàn, dấu thập phân: nếu Excel nhận dạng đúng sẽ giữ nguyên, nếu sai sẽ loại các dấu đó ra khỏi chuỗi,

ngocvinh75
29-01-10, 07:08 PM
Bạn chép đoạn code này vào module, sau đó tạo một nút lệnh (hoặc phím tắt) kích thủ tục này chạy, trước khi chạy phải chọn vùng cần tách số (có thể là 1 ô hoặc nhiều dòng, nhưng chỉ duy nhất 1 cột)

Trong file ví dụ, bạn kéo chuột chọn từ ô A4:A6, sau đó click nút [Process]
trong hộp input box gõ vào B8, dữ liệu sẽ được tách ra và copy bắt đầu từ ô B8.


Sub TextToColumn()
On Error GoTo ErrorText
a = InputBox("Chon vung can luu du lieu", "Input Box")
Selection.TextToColumns Destination:=Range(a), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True

Exit_ErrorText:
Exit Sub

ErrorText:
MsgBox Err.Number & Space(2) & Err.Description & Chr(13) & _
"Co le ban chua chon o can tach so lieu, vui long chon o can tach so lieu"
Resume Exit_ErrorText

End Sub



Em muốn xuất dữ liệu theo dòng trong 1 cột thì Edit code ra làm sao các bác chỉ giúp em voi "TextToRows"

HYen17
29-01-10, 09:19 PM
Em muốn xuất dữ liệu theo dòng trong 1 cột thì Edit code ra làm sao các bác chỉ giúp em voi "TextToRows"


Function TachChuoiSo(NumString As String, PhC As String)
Dim Arr, jJ As Integer, SoFT As Byte

Arr = Split(NumString, PhC)
SoFT = 1 + UBound(Arr): ReDim MDL(SoFT, 1) As Long
For jJ = 1 To SoFT
MDL(jJ, 1) = CLng(Arr(jJ - 1))
Next jJ
TachChuoiSo = MDL
End FunctionCách dùng: Dùng chuột tô chọn gần chục ô liên tục trong 1 cột chưa dữ liệu;
Sau đó bấm chuột lên thanh công thức & nhập cú fáp =TachChuoiSo(B3,",")
Cuối cùng kết thúc bằng tổ hợp fím giành cho hàm mảng.