Hàm tách số từ 1 chuổi theo "/"

  • Thread starter Thread starter tam8678
  • Ngày gửi Ngày gửi
Liên hệ QC

tam8678

Đời Xá Chi
Tham gia
30/4/09
Bài viết
417
Được thích
301
Nghề nghiệp
Kế toán
Mong các anh em trên GPE xem và giúp 1 hàm tự tạo dùng để tách số hóa đơn. Yêu cầu cụ thể được ghi trong file đính kèm. Xin được cám ơn trước.
 

File đính kèm

PHP:
Function Tach(ByVal Mystr As String) As String
    Mystr = Trim(Mystr)
    If InStr(1, Mystr, "/") = 0 Then Tach = Mystr: Exit Function
    Tach = Left(Mystr, InStr(1, Mystr, "/") - 1)
    Newstr = Right(Mystr, Len(Mystr) - InStr(1, Mystr, "/"))
End Function

PHP:
Function SuperT(Mystr As String, num As Byte) As String
If num > Len(Mystr) - Len(Replace(Mystr, "/", "")) + 1 Then SuperT = "": Exit Function
If num = 1 Then
    SuperT = Tach(Mystr)
    Exit Function
Else
    Tmp = Left(Tach(Mystr), Len(Tach(Mystr)) - 2)
    Newstr = Mystr
    For i = 1 To num
        Tmp2 = Tach(Newstr)
    Next
    SuperT = Tmp & Tmp2
End If
    Newstr = ""
End Function

Cú pháp:

=SuperT($A7;1)

=SuperT($A7;2)

=SuperT($A7;3)

...
 

File đính kèm

Upvote 0
Mong các anh em trên GPE xem và giúp 1 hàm tự tạo dùng để tách số hóa đơn. Yêu cầu cụ thể được ghi trong file đính kèm. Xin được cám ơn trước.
Anh dùng thử hàm củ chuối này xem +-+-+-+
PHP:
Function MyFunction(Str As String, C As String, i As Long)
Dim MyList As Variant
MyList = Split(Str, C)
If i > UBound(MyList) + 1 Then
    MyFunction = ""
    Exit Function
End If
MyFunction = Left(MyList(0), Len(MyList(0)) - Len(MyList(i - 1))) & MyList(i - 1)
End Function
 

File đính kèm

Upvote 0
Mong các anh em trên GPE xem và giúp 1 hàm tự tạo dùng để tách số hóa đơn. Yêu cầu cụ thể được ghi trong file đính kèm. Xin được cám ơn trước.

Với cấu trúc & dữ liệu như của Anh, thì cũng góp vui một cách bằng Hàm,
Tại B4, dùng công thức:
PHP:
=IF(OR(A4="",LEFT(A4,5)&RIGHT($A4,2)=A4),"",LEFT($A4,5)&MID(SUBSTITUTE($A4,"/",""),COLUMN()*2+2,2))
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu dữ liệu của anh có cả hai loại dấu phân cách "/' và "," thì có thể làm như thế này:
PHP:
Function Func1(Str As String, i As Long) As String
Dim HDs As Variant
    Str = Replace(Str, ",", "/")
    HDs = Split(Str, "/")
    If i <= UBound(HDs) + 1 Then Func1 = Left(HDs(0), Len(HDs(0)) - Len(HDs(i - 1))) & HDs(i - 1)
End Function
Cú pháp: Func1(Str,i)
Str: Chuỗi chứa các số hóa đơn
i: Số hóa đơn thứ i cần lấy
Hoặc tổng quát hơn, không hạn chế về số lượng và loại dấu phân cách:
PHP:
Function Func2(Str As String, Cs As Variant, i As Long) As String
Dim HDs As Variant
For Each C In Cs
    Str = Replace(Str, C, "/")
Next
    HDs = Split(Str, "/")
    If i <= UBound(HDs) + 1 Then Func2 = Left(HDs(0), Len(HDs(0)) - Len(HDs(i - 1))) & HDs(i - 1)
End Function
Cú pháp: Func1(Str,Cs,i)
Str: Chuỗi chứa các số hóa đơn
Cs: Danh sách các loại dấu phân cách (Các dấu phân cách này phải được đặt trong cặp dấu {})
i: Số hóa đơn thứ i cần lấy
Anh xem ví dụ trong file.
 

File đính kèm

Upvote 0
Mong các anh em trên GPE xem và giúp 1 hàm tự tạo dùng để tách số hóa đơn. Yêu cầu cụ thể được ghi trong file đính kèm. Xin được cám ơn trước.

Thực ra có một cách đơn giản và thủ công hơn là dùng VBA hay là tổ hợp các hàm dài
Dùng: =SUBSTITUTE(A4,"/","/"&LEFT(A4,5)) tại một cột nào đó, rồi fill xuống -> Copy & Paste Special -> Values
Sau đó dùng Text to Columns ngay cột đó là sẽ ra thôi (tùy dấu phân cách là / , hay các ký tự khác...)
Nếu 5 số đầu của hóa đơn giống nhau thì dùng Find and Replace
 
Upvote 0
Mong các anh em trên GPE xem và giúp 1 hàm tự tạo dùng để tách số hóa đơn. Yêu cầu cụ thể được ghi trong file đính kèm. Xin được cám ơn trước.
Do không biết VBA, sử dụng một dòng phụ, ẩn đi khi không xài, dùng công thức thấy dễ hơn!
 

File đính kèm

Upvote 0
Thực ra có một cách đơn giản và thủ công hơn là dùng VBA hay là tổ hợp các hàm dài
Dùng: =SUBSTITUTE(A4,"/","/"&LEFT(A4,5)) tại một cột nào đó, rồi fill xuống -> Copy & Paste Special -> Values
Sau đó dùng Text to Columns ngay cột đó là sẽ ra thôi (tùy dấu phân cách là / , hay các ký tự khác...)
Nếu 5 số đầu của hóa đơn giống nhau thì dùng Find and Replace
Làm được đến đó rồi thì làm luôn chứ ---> Text to Columns làm chi
- Đặt con trỏ chuột tại dòng 4 và đặt 1 name
PHP:
Tmp =EVALUATE("{"&SUBSTITUTE(SUBSTITUTE($A4,"/","/"&LEFT($A4,5)),"/",",")&"}")
- Công thức tại cell B4
PHP:
=IF(COUNTA(Tmp)<COLUMNS($A:A),"",INDEX(Tmp,,COLUMNS($A:A)))
Kéo fill sang phải
Giải thuật này tương đương với Split trong VBA
 

File đính kèm

Upvote 0
Làm được đến đó rồi thì làm luôn chứ ---> Text to Columns làm chi
- Đặt con trỏ chuột tại dòng 4 và đặt 1 name
PHP:
Tmp =EVALUATE("{"&SUBSTITUTE(SUBSTITUTE($A4,"/","/"&LEFT($A4,5)),"/",",")&"}")
- Công thức tại cell B4
PHP:
=IF(COUNTA(Tmp)<COLUMNS($A:A),"",INDEX(Tmp,,COLUMNS($A:A)))
Kéo fill sang phải
Giải thuật này tương đương với Split trong VBA

Làm luôn rồi đấy thôi, Bác xem bài #4
Hình như của Ndu hơi dài dòng một chút, nhỉ ?
"Chọt" chơi...
 
Upvote 0
Làm luôn rồi đấy thôi, Bác xem bài #4
Hình như của Ndu hơi dài dòng một chút, nhỉ ?
"Chọt" chơi...
Ẹc... Ẹc... chắc vậy (dài hơn)
Cách của mình có hơi khác với các bạn, đó là biến chuổi thành mảng... Giống y chang như việc dùng Split trong VBA vậy!
 
Upvote 0
Thực ra có một cách đơn giản và thủ công hơn là dùng VBA hay là tổ hợp các hàm dài
Dùng: =SUBSTITUTE(A4,"/","/"&LEFT(A4,5)) tại một cột nào đó, rồi fill xuống -> Copy & Paste Special -> Values
Sau đó dùng Text to Columns ngay cột đó là sẽ ra thôi (tùy dấu phân cách là / , hay các ký tự khác...)
Nếu 5 số đầu của hóa đơn giống nhau thì dùng Find and Replace
---
Cám ơn bạn đã quan tâm xem và góp bài. Trong mong muốn của tôi có nhờ giúp cho 1 hàm tự tạo vì trong thực tế số liệu không được đơn giản như thế ( không phải chỉ có 1 dấu "/"), các trường hợp thường xuyên xảy ra là: 0123456/57/58 - 0123456,57,58 và 0123456-57-58 và là 1 dãy. Về chủ đề của bài tôi chỉ nêu có 1 trường hợp "/" là để tôi tập tành và cố gắng vận dụng thôi. Xin được cám ơn tất cả các bạn đã đóng góp cho chủ đề này .
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom