Tách số không dùng vòng lặp (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,972
Sưu tầm được 1 hàm tách số khá hay, xin chia sẽ với mọi người!
Điểm đặc biệt là không dùng tí vòng lập nào!
PHP:
Function TachSo(Cell As Range) As Double
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp.Pattern = "[^0-9]"
  TachSo = Temp.Replace(Cell, "")
End Function
Các bạn có thể tham khảo và phát triển thêm tùy theo yêu cầu riêng!
 

File đính kèm

Góp vui

Tách lấy số

PHP:
Function TachSo(Cell As Range) As Double
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp.Pattern = "\D"
  TachSo = Temp.Replace(Cell, "")
End Function


Tách lấy chữ
PHP:
Function TachChu(Cell As Range) As String
Set Temp = CreateObject("VBScript.RegExp")
Temp.Global = True
Temp.Pattern = "\d"
TachChu = Temp.Replace(Cell, "")
End Function

Tham khảo thêm để tùy biến:

Symbol​
|
Description​
|
\|Marks the next character as either a special character (such as \n for the newline character) or as a literal (if that character otherwise has special meaning in a pattern search string). The special characters are:|
| |
|\f|
| |
|form feed character|
| |
|\n|
| |
|newline character|
| |
|\r|
| |
|carriage return character|
| |
|\t|
| |
|tab character|
| |
|\v|
| |
|vertical tab character|
| |
^|Matches the beginning of input.|
$|Matches the end of input.|
*|Matches the preceding atom zero or more times.|
+|Matches the preceding atom one or more times.|
?|Matches the preceding atom zero or one time.|
.|Matches any single character except a newline character.|
( )|Defines a subexpression within the larger subexpression. A subexpression:|
| |
|Overrides the order of precedence used in evaluating pattern strings.|
| |
|Can be referenced again in the pattern string. To insert the result of the subexpression later in the pattern string, reference it by its one-based ordinal position among subexpressions, preceded by the backslash symbol (e.g., \1). See the example using the \num syntax in the "Programming Tips and Gotchas" section.|
| |
|Can be referenced again in the replacement string in calls to the RegExp.Replace method. To use the result of the original subexpression as a replacement string, reference its one-based ordinal position among subexpressions, preceded by a dollar sign (e.g., $1). See RegExp.Replace Method for an example.|
| |
x|y|Matches either x or y.|
{n}|Matches exactly n times, where n is a nonnegative integer.|
{n,}|Matches at least n times, where n is a nonnegative integer. o{1,} is the same as o+, and o{0,} is the same as o*.|
{n,m}|Matches at least n and at most m times, where m and n are nonnegative integers. o{0,1} is the same as o?.|
[abc]|Matches any one of the enclosed characters (represented by abc) in the character set.|
[^xyz]|Matches any character (represented by xyz) not enclosed in the character set. For example, [^abc] matches the "p" in "plain."|
[a-z]|Matches any character in a range of characters (represented by a-z).|
[^m-z]|Matches any character not included in a range of characters (represented by m-z).|
\b|Matches a word boundary; that is, the position between a word and a space. The word boundary symbol does not include newline characters or the end of input (see the \s symbol).|
\B|Matches a nonword boundary. ea*r\B matches the "ear" in "never early."|
\d|Matches a digit character. Equivalent to [0-9].|
\D|Matches a nondigit character. Equivalent to [^0-9].|
\s|Matches any whitespace, including space, tab, form-feed, etc. Equivalent to [ \f\n\r\t\v].|
\S|Matches any nonwhitespace character. Equivalent to [^ \f\n\r\t\v].|
\w|Matches any word character including underscore. Equivalent to [A-Za-z0-9_].|
\W|Matches any nonword character, including whitespace and carriage returns. Equivalent to [^A-Za-z0-9_].|
\num|Matches the subexpression (enclosed in parentheses) whose ordinal position in the pattern is num, where num is a positive integer.|
\n|Matches n, where n is the octal value of an ASCII code. Octal escape values must be 1, 2, or 3 digits long and must not exceed 256; if they do, only the first two digits are used.|
\xn|Matches n, where n is the hexadecimal value of an ASCII code. Hexadecimal escape values must be two digits long.|
 
Upvote 0
Âu Dương Phong sưu tầm bài rất hay. Nhưng mình thử tách số thì thấy có 1 vấn đề không giải thích được:
2 function có nội dung hoàn toàn giống nhau, nhưng 1 hàm ra dạng số, 1 hàm ra dạng chuỗi.
|A|B|C
1| | |
2|00abcd123prt7474rur099|001237474099|=TachChu(A2)
3|00abcd123prt7474rur099|1237474099|=TachSo(A3)
Mã:
Function TachSo(Cell As Range) As Double
Set Temp = CreateObject("VBScript.RegExp")
Temp.Global = True
Temp.Pattern = "[^0-9]"
TachSo = Temp.Replace(Cell, "")
End Function
Mã:
Function TachChu(Cell As Range) As String
Set Temp = CreateObject("VBScript.RegExp")
Temp.Global = True
Temp.Pattern = "[^0-9]"
TachChu = Temp.Replace(Cell, "")
End Function
 

File đính kèm

Upvote 0
Âu Dương Phong sưu tầm bài rất hay. Nhưng mình thử tách số thì thấy có 1 vấn đề không giải thích được:
2 function có nội dung hoàn toàn giống nhau, nhưng 1 hàm ra dạng số, 1 hàm ra dạng chuỗi.
|A|B|C
1| | |
2|00abcd123prt7474rur099|001237474099|=TachChu(A2)
3|00abcd123prt7474rur099|1237474099|=TachSo(A3)
Mã:
Function TachSo(Cell As Range) As Double
.....
End Function
Mã:
Function TachChu(Cell As Range) As String
....
End Function

Bác Long xem kiểu trả về phía sau hàm thì thấy khác nhau.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Upvote 0
Âu Dương Phong sưu tầm bài rất hay. Nhưng mình thử tách số thì thấy có 1 vấn đề không giải thích được:
2 function có nội dung hoàn toàn giống nhau, nhưng 1 hàm ra dạng số, 1 hàm ra dạng chuỗi.
Thầy khai báo TachChu là dạng String thì đương nhiên nó phải là chuổi rồi!
Hay ý thầy là... cái gì khác nữa (chứ lý nào thầy lại không biết vụ này)
Ẹc... Ẹc...
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Thầy khai báo TachChu là dạng String thì đương nhiên nó phải là chuổi rồi!
Hay ý thầy là... cái gì khác nữa (chứ lý nào thầy lại không biết vụ này)
Ẹc... Ẹc...
Ồ !!!
Mình copy code trên GPE rồi chỉnh nội dung lại. Thấy 2 code giống nhau nhưng không chú ý khai báo String,Double.
Nếu đi thi chắc là theo Bùi Kiệm rồi !
Thank ndu96081631
 
Upvote 0
Upvote 0
Anh thử vào Tools | References ... | chọn Microsoft VBScript Regular Expressions xx (cái nào mới nhất thì chọn) xem có chạy được không.

Thêm 1 tài liệu tham khảo dạng PDF nữa về VBscript

http://www.indusoft.com/pdf/VBScript Reference.pdf
Không kiếm ra, kiếm hết vần M rồi. Chắc phải cài thêm .dll hay .ocx. Không dám down theo link Microsoft, sợ MS phát hiện gian lận lại hiện ngôi sao.
 
Upvote 0
Mình có một danh sách dãy số 09135665611, vì nó thừa số 3 trong dãy, mình muốn bỏ nó đi phải làm thế nào, các bác giúp với
 
Upvote 0
Bạn muốn loại trừ chữ số 3 tại vị trí thứ 4 (Nếu có) trong số dãy số bạn có thể dùng công thức như sau
Ví dụ: Tư A2:A20 chứa danh sách dãy số , tại C2 gõ công thức: =IF(MID(A2,4,1)="3",REPLACE(A2,4,1,""),A2)
-Fill hết C2:C20 ta được vùng kết quả
-Chép vùng kết quả
-Chọn A2:A20-->PasteSpeacial-->Value-->OK
 
Upvote 0
Tách số trong chuổi text

Mình có dữ liệu như thế này ai có thể giúp mình với!
Menu,18 Parameter,31 => #18.31
Menu,1 Parameter,31 => #1.31
Menu,1 Parameter,3 => #1.3
Menu,18 Parameter,1 => #18.1
Mình không rành về excel
Cám ơn nhiều nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu thuần thế này thì dùng công thức

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A4," ",""),"Menu,","#"),"Parameter,",".")
 
Upvote 0
Cảm ơn bạn nhiều! Gần được rồi nhưng mình ghi thiếu một chút bạn có thể làm lại dùm mình xem sao?
Tách số trong chuổi text

Mình có dữ liệu như thế này ai có thể giúp mình với!
Menu,18 Parameter,31 => #18.31
Menu,1 Parameter,31 => #01.31
Menu,1 Parameter,3 => #01.03
Menu,18 Parameter,1 => #18.01
Menu,0 Parameter,10 => #00.10
Menu,0 Parameter,0 => #00.00




Mình không rành về excel
Cám ơn nhiều nhé!​
 
Upvote 0
Thử lại xem sao

="#"&TEXT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1," ",""),"Menu,",""),"Parameter,","."),"00.00")
 
Upvote 0
--
Tất cả đều được riêng
Menu,11 Parameter 1 thì chưa được => #11.10 phải là #11.01 mới được.
Mong bạn giúp!
Cảm ơn bạn rất nhiều.
Hồi nãy bạn nói chuổi của bạn được viết theo nguyên tắc Menu,11 Parameter, 1 ---> Tức sau chữ MenuParameter là đến dấu phẩy ---> Công thức cũng sẽ theo nguyên tắc này mà tách ---> Giờ bạn lại ghi chuổi thành Menu,11 Parameter 1 ---> Sau chữ Parameter lại không có dấu phẩy nào ---> Vậy nó ra kết quả sai là hiển nhiên thôi
Thử sửa công thức thành vầy xem:
PHP:
="#"&TEXT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1," ",""),"Menu",""),"Parameter","."),",",""),"00.00")
 
Upvote 0
Hồi nãy bạn nói chuổi của bạn được viết theo nguyên tắc Menu,11 Parameter, 1 ---> Tức sau chữ MenuParameter là đến dấu phẩy ---> Công thức cũng sẽ theo nguyên tắc này mà tách ---> Giờ bạn lại ghi chuổi thành Menu,11 Parameter 1 ---> Sau chữ Parameter lại không có dấu phẩy nào ---> Vậy nó ra kết quả sai là hiển nhiên thôi
Thử sửa công thức thành vầy xem:
PHP:
="#"&TEXT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1," ",""),"Menu",""),"Parameter","."),",",""),"00.00")
Nguyên tắc vẩn như củ chỉ mình viết lại thiếu dấu "," thôi.
Vi du: Menu,1 Parameter,1 => #01.01 còn theo công thức bạn làm thì lại là #01.10
Tức các số nhập vào <9 thì trước đó phải thêm số 0.
Bạn xem còn có cách nào nữa không.
Cảm ơn bạn nhiều!
 
Lần chỉnh sửa cuối:
Upvote 0
Còn cách ngon nhất là viết hàm UDF, còn sử theo công thức mà nguồn không đồng nhất kiểu này không thể chắc.
 
Upvote 0
Còn cách ngon nhất là viết hàm UDF, còn sử theo công thức mà nguồn không đồng nhất kiểu này không thể chắc.
Công thức cũng được nhưng hơi cực chút
- Với công thức của anh, ta sẽ đặt nó thành 1 name, bỏ dấu #, chỉ lấy phần định dạng "0.0"
- Sau đó tách định dạng "0.0" thành 2 phần dựa vào dấu chấm phân cách, mổi phần sẽ được định dạng "00"
- Cuối cùng là ráp 2 phần lại
 
Upvote 0

File đính kèm

Upvote 0
Chán bạn quá! Bài số #22 đã hướng dẫn rõ thế rồi mà bạn không chịu suy nghĩ
Xem file nè đại ca
Files này ổn rồi nhưng bây giờ mới có dữ liệu mới như thế này:
A1: P0101_jhluhliu_Bit/0
A2: P0102_khgljlhgkhl_Bit/9
A3: P0102_khgljlhgkhljkjk
A4: P0203_hgluglugljlih;i;_Bit/12
B1: Menu,70 Parameter,2 Routing Slot No.,3 CTnet Node No.,0
B2: Menu,74 Parameter,12 Routing Slot No.,3 CTnet Node No.,2
B3: Menu,72 Parameter,7 Routing Slot No.,3 CTnet Node No.,6
B4: Menu,72 Parameter,9 Routing Slot No.,3 CTnet Node No.,4
Viết hàm lấy Bit ở cột C1,C2,C3,C4 có kết quả là: 0,9, ,12
Viết hàm lấy địa chỉ ở cột D1,D2,D3,D4 có kết quả là: #70.02.0,#74.12.9,#72.07,#72.09.12
Note: Nếu ở cột A hàm không có "_Bit/xx" hoặc "_Bit/x" với "x" là các chử số, thì Cột D không cần ghép thêm vào "#xx.xx" thôi.
Mông các chuyên gia làm giùm với!
 
Upvote 0
A1: P0101_jhluhliu_Bit/0
A2: P0102_khgljlhgkhl_Bit/9
A3: P0102_khgljlhgkhljkjk
A4: P0203_hgluglugljlih;i;_Bit/12

1) Bạn cần tách gì trong dãy số trên?

2) Bạn xem name của công thức (Tmp), theo cách làm của Thầy Ndu để tự chỉnh sửa, nếu sửa không được bạn có thể hỏi tiếp! OK?
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Có thể dùng hàm VBA theo topic này

Cú pháp:

CtoNPlus(chuỗi, Stt chuỗi số, dấu TP)

Tham số dấu TP có thể bỏ trống nếu số nguyên không có thập phân.

Cột C:
C2 =IF(ISERROR(FIND("Bit/";A2;1));"";RIGHT(A2;LEN(A2)-FIND("Bit/";A2;1)-3))

Cột D:
D2 ="#"&CtoNPlus(B2;1)&"."&CtoNPlus(B2;2)&IF(C2="";"" ;"."&C2)
 

File đính kèm

Upvote 0
Có thể dùng hàm VBA theo topic này

Cú pháp:

CtoNPlus(chuỗi, Stt chuỗi số, dấu TP)

Tham số dấu TP có thể bỏ trống nếu số nguyên không có thập phân.

Cột C:
C2 =IF(ISERROR(FIND("Bit/";A2;1));"";RIGHT(A2;LEN(A2)-FIND("Bit/";A2;1)-3))

Cột D:
D2 ="#"&CtoNPlus(B2;1)&"."&CtoNPlus(B2;2)&IF(C2="";"" ;"."&C2)
Cám ơn bạn nhiều!, Công thức gần đứng với yêu cầu nhưng hơi thiếu một chút ở chổ: Parameter,2 =02;Parameter,12 =12
Để mình thử sửa lại công thức xem sao nếu không được thỉ mình nhờ bạn giúp.Cái này Bạn "ndu96081631" có làm công thức chomình rồi nhưng không biết mình có làm tiếp được không.Ồ bạn viết bằng Macro thì mình bó tay mình không biết về cài này
Bạn thử chỉnh lại công thức cho đúng kết quả được không?
Thank!
 
Lần chỉnh sửa cuối:
Upvote 0
D2 ="#"&CtoNPlus(B2;1)&"."&CtoNPlus(B2;2)&IF(C2="" ;"" ;"."&C2)
sửa thành:
D2 ="#"&CtoNPlus(B2;1)&"."&Text(CtoNPlus(B2;2);"00")&IF(C2="" ;"" ;"."&C2)

Nghĩa là:

Hàm CtonPlus lấy ra số ở vị trí số thứ n. Bạn kết hợp với các hàm thông thường của Excel như text, sum, If, tóan tử nối "&" ....

Bạn xem thí dụ ở những dòng dưới, tôi dùng hàm Time kết hợp 2 CtoNPlus còn ra kết quả giờ phút được.
 
Upvote 0
D2 ="#"&CtoNPlus(B2;1)&"."&CtoNPlus(B2;2)&IF(C2="" ;"" ;"."&C2)
sửa thành:
D2 ="#"&CtoNPlus(B2;1)&"."&Text(CtoNPlus(B2;2);"00")&IF(C2="" ;"" ;"."&C2)

Nghĩa là:

Hàm CtonPlus lấy ra số ở vị trí số thứ n. Bạn kết hợp với các hàm thông thường của Excel như text, sum, If, tóan tử nối "&" ....

Bạn xem thí dụ ở những dòng dưới, tôi dùng hàm Time kết hợp 2 CtoNPlus còn ra kết quả giờ phút được.
Cảm ơn Bạn nhiều! Không ngờ bạn Update nhanh đến thế.
Không biết mình muốn lấy "Routing Slot No.,3" =3 ở cột E và "CTnet Node No.,14" =14 ở cột F thì phải làm sao nhỉ Bạn giúp mình với.
Thank! nhiều.
 
Upvote 0
B1: Menu,70 Parameter,2 Routing Slot No.,3 CTnet Node No.,0

Trong chuỗi ký tự có 4 nhóm số ở các vị trí 1: 70, 2: 2, 3: 3, 4: 0

Bạn cho các số vị trí màu xanh vào tham số Stt chuỗi số. Cụ thể là:

E1 = CtoNPlus(B2;3)

F1 =
CtoNPlus(B2;4)

Ghi chú:

Nếu thiêu 1 số ở giữa thì hàm lấy sai, thí dụ thiếu Routing SlotNo như sau:

Menu,70 Parameter,2 Routing Slot No., CTnet Node No.,0

Vì số 0 của Node No. trở thành nhóm số thứ 3 và không có nhóm 4.

 
Lần chỉnh sửa cuối:
Upvote 0
B1: Menu,70 Parameter,2 Routing Slot No.,3 CTnet Node No.,0

Trong chuỗi ký tự có 4 nhóm số ở các vị trí 1: 70, 2: 2, 3: 3, 4: 0

Bạn cho các số vị trí màu xanh vào tham số Stt chuỗi số. Cụ thể là:

E1 = CtoNPlus(B2;3)

F1 =
CtoNPlus(B2;4)

Ghi chú:

Nếu thiêu 1 số ở giữa thì hàm lấy sai, thí dụ thiếu Routing SlotNo như sau:

Menu,70 Parameter,2 Routing Slot No., CTnet Node No.,0

Vì số 0 của Node No. trở thành nhóm số thứ 3 và không có nhóm 4.

Vậy còn cách nào để lấy khác không
B1: Menu,70 Parameter,2
B2: Menu,70 Parameter,2 Routing Slot No.,3 CTnet Node No.,0
E1:=" " (khoảng trống)
F1:=" "
E2:=3
F2:=0
Thank!
 
Lần chỉnh sửa cuối:
Upvote 0
Sửa hàm 1 tí tẹo, không ép kết quả là double.
 

File đính kèm

Upvote 0
Em có chuỗi sau: 1.208*32*(h+450)/1000
Giờ em muốn tính kết quả ra lấy phần chứa số + phần chứa chữ là: 17.3952+0.038656*h
Nghĩa là với định dạng như trên, hàm chỉ tách lấy ra h+, còn phần số và dấu * tự lấy để ra kết quả
Hàm nào có thể tính được thế này không?
 
Upvote 0
Sưu tầm được 1 hàm tách số khá hay, xin chia sẽ với mọi người!
Điểm đặc biệt là không dùng tí vòng lập nào!
PHP:
Function TachSo(Cell As Range) As Double
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp.Pattern = "[^0-9]"
  TachSo = Temp.Replace(Cell, "")
End Function
Các bạn có thể tham khảo và phát triển thêm tùy theo yêu cầu riêng!
chào bạn
mình mở excel của mình ra, đánh lệnh TachSo(A1) như của bạn nhưng nó báo lỗi name
mình không hiểu code của bạn sẽ dán vào đâu trong excel để sử dụng được như bạn
mong bạn chỉ dùm
bạn gửi thư cho mình nhé: thegioiquanhta21082010@gmail.com
xin cảm ơn
 
Upvote 0
Sưu tầm được 1 hàm tách số khá hay, xin chia sẽ với mọi người!
Điểm đặc biệt là không dùng tí vòng lập nào!
PHP:
Function TachSo(Cell As Range) As Double
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp.Pattern = "[^0-9]"
  TachSo = Temp.Replace(Cell, "")
End Function
Các bạn có thể tham khảo và phát triển thêm tùy theo yêu cầu riêng!

Sư phụ Ndu ơi, phiền sư phụ; các anh, chị làm luôn hộ em cả cách dùng vòng lặp, em rất muốn biết thuật toán của nó ra sao?
 
Upvote 0
Sư phụ Ndu ơi, phiền sư phụ; các anh, chị làm luôn hộ em cả cách dùng vòng lặp, em rất muốn biết thuật toán của nó ra sao?
Thì cứ cho một vòng lặp chạy từng ký tự một, từ đầu tới cuối cell chứa dữ liệu, thằng nào là số thì "lụm" nó bỏ vào kết quả, còn lại mấy em kia thì......mặc xác nó
Bạn muốn có bài giải thì cứ đưa đề lên
Híc
 
Upvote 0
Sư phụ Ndu ơi, phiền sư phụ; các anh, chị làm luôn hộ em cả cách dùng vòng lặp, em rất muốn biết thuật toán của nó ra sao?
Nếu dùng vòng lặp thì đơn giản
PHP:
Function TachSo(Cell As Range) As Double
Dim i&
Dim Tmp As String, Str As String
Str = "0123456789"
For i = 1 To Len(Cell.Value)
 If InStr(1, Str, Mid(Cell.Value, i, 1)) > 0Then
   Tmp = Tmp & Mid(Cell.Value, i, 1)
 End If
Next
  TachSo = Tmp
End Function
 
Upvote 0
Sưu tầm được 1 hàm tách số khá hay, xin chia sẽ với mọi người!
Điểm đặc biệt là không dùng tí vòng lập nào!
PHP:
Function TachSo(Cell As Range) As Double
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp.Pattern = "[^0-9]"
  TachSo = Temp.Replace(Cell, "")
End Function
Các bạn có thể tham khảo và phát triển thêm tùy theo yêu cầu riêng!

Em định cho Application.Volatile để hàm tự cập nhật, nhưng không được, xin các thày chỉ cho.
 
Upvote 0
Nhờ sửa lỗi khi dùng VBScript.RegExp

Em mới học phần này, thử tự làm một ví dụ xem nhưng không hiểu tại sao dòng If Tach = "" Then Tach = 0 trong Code

PHP:
Function Tach(Text As String, Pos As Long)
    On Error GoTo NextStp
    Set Tmp = CreateObject("VBScript.RegExp")
    Tmp.Global = True
    Tmp.Pattern = "[^0-9,,]"
    Tach = Tmp.Replace(Text, "")
    Tach = Split(Tach, ",")(Pos - 1)
    If Tach = "" Then Tach = 0
    Exit Function
NextStp:
    Tach = ""
End Function
lại không có tác dụng?
 

File đính kèm

Upvote 0
Em mới học phần này, thử tự làm một ví dụ xem nhưng không hiểu tại sao dòng If Tach = "" Then Tach = 0 trong Code

PHP:
Function Tach(Text As String, Pos As Long)
    On Error GoTo NextStp
    Set Tmp = CreateObject("VBScript.RegExp")
    Tmp.Global = True
    Tmp.Pattern = "[^0-9,,]"
    Tach = Tmp.Replace(Text, "")
    Tach = Split(Tach, ",")(Pos - 1)
    If Tach = "" Then Tach = 0
    Exit Function
NextStp:
    Tach = ""
End Function
lại không có tác dụng?
Đương nhiên không tác dụng rồi, vì nếu Tach không thể "làm việc" tiếp tức là nó bị lỗi thì làm sao mà = "" để cho bạn IF gì gì đó chứ
Vậy nên, nếu bạn muốn trường hợp hợp Tach "không ra cái gì" thì Tach = 0, ta sẽ sửa thế này:
PHP:
Function Tach(Text As String, Pos As Long)
  Dim tmp
    On Error GoTo NextStp
    Set tmp = CreateObject("VBScript.RegExp")
    tmp.Global = True
    tmp.Pattern = "[^0-9,,]"
    Tach = tmp.Replace(Text, "")
    Tach = Split(Tach, ",")(Pos - 1)
    Exit Function
NextStp:
    Tach = 0
End Function
Hoặc ngắn gọn hơn
PHP:
Function Tach(Text As String, Pos As Long) As Long
  On Error Resume Next
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9,]"
    Tach = Split(.Replace(Text, ""), ",")(Pos - 1)
  End With
End Function
Vì khai báo hàm Tach thuộc biến Long (hoặc Double) nên giá trị ban đầu của Tach đương nhiên = 0, khi code bị lỗi, do có On Error Resume Next ở trên, code sẽ đi tiếp và chẳng tách ra được cái giống gì cả, cuối cùng Tach vẫn cứ = 0 (như ban đầu)
 
Upvote 0
Em không muốn Tach = 0 nữa thì thay đổi khai báo như thế nào hả thày?
Không muốn = 0 vậy bạn muốn nó = bi nhiêu?
Muốn bằng cái gì thì thay vào dòng cuối của code này:
Mã:
Function Tach(Text As String, Pos As Long)
  Dim tmp
  On Error GoTo NextStp
  With CreateObject("VBScript.RegExp")
    .Global = True: .Pattern = "[^0-9,,]"
     Tach = Split(.Replace(Text, ""), ",")(Pos - 1)
  End With
  Exit Function
NextStp:
  [B]Tach = ""[/B]  ''<--- Muốn bằng bao nhiêu, thay vào đây
End Function
 
Upvote 0
Thưa thầy ndu96081631 , ví dụ e có chuỗi 153DT0001
e muốn tách phần số bên trái là 153 ra .
Chuỗi bên trái không nhất định là 3 ký tự thì e phải cải biên hàm post#1 như thế nào ?!$@!!
 
Upvote 0
Thưa thầy ndu96081631 , ví dụ e có chuỗi 153DT0001
e muốn tách phần số bên trái là 153 ra .
Chuỗi bên trái không nhất định là 3 ký tự thì e phải cải biên hàm post#1 như thế nào ?!$@!!

Trong VBA có hàm VAL đáp ứng được nhu cầu của bạn:
Val("153DT0001") cho kết quả = 153 ---> Tức nó sẽ tách những con số nằm bên trái ra, đến khi nào gặp ký tự không phải số thì ngưng
 
Upvote 0
vậy nếu trường hợp một dãy ký tự có hai dãy số cách nhau bởi chữ, em muốn lấy dãy số thứ 2 thì làm như thế nào. Giả sử trường hợp đó như sau:
sdsfs-fe5675cdfdfd5675

Thì em muốn lấy kết quả là 5675

Và nâng cao hơn em muốn lấy kết quả là d5675 thì em làm như thế nào?

Em biến đổi hàm của thầy như sau:
PHP:
Function TachSo(Cell As Range) As Double
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp.Pattern = "[^0-9]"
  TachSo = Temp.Replace(Mid(Cell, InStr(Cell, Val(Cell)), 100), "")
End Function

Nhưng phát hiện ra có trường hợp lại còn chuối hơn
BATT-PACK,EB-BJ120CBE(50V),SM-J120F

Em chỉ tách dãy số cuối cùng tính từ bên trái sang thì phải làm như thế nào?
 
Lần chỉnh sửa cuối:
Upvote 0
vậy nếu trường hợp một dãy ký tự có hai dãy số cách nhau bởi chữ, em muốn lấy dãy số thứ 2 thì làm như thế nào. Giả sử trường hợp đó như sau:
sdsfs-fe5675cdfdfd5675

Thì em muốn lấy kết quả là 5675

Và nâng cao hơn em muốn lấy kết quả là d5675 thì em làm như thế nào?

Em biến đổi hàm của thầy như sau:
PHP:
Function TachSo(Cell As Range) As Double
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp.Pattern = "[^0-9]"
  TachSo = Temp.Replace(Mid(Cell, InStr(Cell, Val(Cell)), 100), "")
End Function

Nhưng phát hiện ra có trường hợp lại còn chuối hơn
BATT-PACK,EB-BJ120CBE(50V),SM-J120F

Em chỉ tách dãy số cuối cùng tính từ bên trái sang thì phải làm như thế nào?
Cụ thể bạn muốn kết quả bằng bao nhiêu? Và file đâu?
 
Upvote 0
Thầy xem file đính kèm cho em nhé, kết quả mong muốn em cũng đã làm ví dụ một vài trường hợp ở trên cùng.
Dữ liệu linh tinh quá
- Trường hợp ASSY-BRAKET_R,BG930,BLACK thì kết quả = gì?
- Trường hợp ASSY-BATT-COVER,WHITE,DUOS,J510F thì kết quả = gì?
vân vân
 
Upvote 0
Dữ liệu linh tinh quá
- Trường hợp ASSY-BRAKET_R,BG930,BLACK thì kết quả = gì?
- Trường hợp ASSY-BATT-COVER,WHITE,DUOS,J510F thì kết quả = gì?
vân vân

Vâng trường hợp 1 kết quả là G930, trường hợp 2 kết quả là J510. Quy luật em thấy như sau:
-B1: Tìm dãy số đầu tiên bắt đầu từ bên phải của chuỗi tìm kiếm. Nếu không có dãy số nào thì kết quả trả về là khoảng trống
-B2: Nếu ở B1 có dãy số đó thì lấy ký tự kề bên dãy số này (ở bên trái dãy số)
*Như trường hợp 1 ở trên thì dãy số tìm được là 930, ta lấy thêm một ký tự nữa bên trái dãy số này và đó là G, kết hợp lại cho ra kết quả là G930.
 
Lần chỉnh sửa cuối:
Upvote 0
Mục đích của bạn là tách số hay học cách dùng Regex?
Bài này dùng Regex được, nhưng theo dùng để học thì trình độ tương đối cao, ít nhất là bạn phải hiểu nguyên tắc ghi sổ (capture) của Regex. Mà theo toi thấy thì bạn chưa nắm vững. Tốt hơn hết là bạn tìm hiểu về capture trước.
Nếu chỉ muốn tách số thì dùng vòng lặp duyệt chuỗi dễ hơn nhiều.
 
Upvote 0
Mục đích của bạn là tách số hay học cách dùng Regex?
Bài này dùng Regex được, nhưng theo dùng để học thì trình độ tương đối cao, ít nhất là bạn phải hiểu nguyên tắc ghi sổ (capture) của Regex. Mà theo toi thấy thì bạn chưa nắm vững. Tốt hơn hết là bạn tìm hiểu về capture trước.
Nếu chỉ muốn tách số thì dùng vòng lặp duyệt chuỗi dễ hơn nhiều.


Mục đích của em vừa là giải quyết vấn đề này vừa là học thêm về Regex vì em thấy nó khá thú vị. Có thể em không hiểu sâu hết nhưng nhất thời có khả năng hiểu và áp dụng vào các trường hợp tương tự cho nên mong mọi người mở mang thêm kiến thức cho em :)

Ngoài ra theo chủ đề http://www.giaiphapexcel.com/diendan/threads/vbscript-regexp.76017/
Em thấy có nói về:
^: Trả về chuỗi kết quả trong trường hợp chuỗi này nằm ở vị trí đầu của chuỗi gốc
$: Trả về chuỗi kết quả trong trường hợp chuỗi này nằm ở vị trí cuối của chuỗi gốc


Theo cách em hiểu thì là ^ nghĩa là tìm chuỗi đầu tiên còn $ sẽ tìm chuỗi vị trí cuối cùng
Nhưng em sửa lại của thầy Ndu như sau:

PHP:
Function TachSo(Cell As Range) As Double
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp.Pattern = "[$0-9]"
  TachSo = Temp.Replace(Cell, "")
End Function

thì kết quả là Value. Cái RegExp này nhọc nhằn đây.
 
Lần chỉnh sửa cuối:
Upvote 0
Có thú vị hay không thì cách giải của bạn trật đường rồi.
Với yêu cầu như bài #51 thì nên đi tìm hiểu về hàm Test, hàm Execute và kiểu trả về của hàm Execute.
 
Upvote 0
Có thú vị hay không thì cách giải của bạn trật đường rồi.
Với yêu cầu như bài #51 thì nên đi tìm hiểu về hàm Test, hàm Execute và kiểu trả về của hàm Execute.

Em thử tìm kiếm về hàm Excute nhưng thấy ít thông tin quá.

Với code này:
PHP:
Function TachSo(Cell As Range) As Double
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp.Pattern = "[^0-9]"
  TachSo = Temp.Replace(Mid(Cell, InStr(Cell, Val(Cell)), 100), "")
End Function

Nếu trong chuỗi có hai dãy số thì code bỏ qua không lấy dãy số thứ nhất rồi và chỉ lấy dãy số thứ hai. Nếu có ba dãy số trở lên thì nó bỏ qua dãy số đầu và lấy hai dãy số tiếp theo tính từ trái sang phải của chuỗi đó. Nếu không được thì chắc em dùng tạm cái này trong khi chờ có phương án tối ưu tốt hơn vậy.
 
Lần chỉnh sửa cuối:
Upvote 0
Học Regex mà bỏ qua Execute thì cũng như học bơi mà không bơi sải, chỉ bơi ếch.

rx.Pattern = "[A-Za-z][0-9]+"
If rx.Test(str) Then ' str là chuỗi cần tách
TachChuoi = rx.Execute(str)(rx.Execute(str).Count-1)
Else
TachChuoi = "Khong có để tách" ' nếu là hàm ngừoi dùng thì set nó bằng error ở đây
End If

TachChuoi("ASSY-BATT-COVER,J123F,WHITE,DUOS,J510F") = "J510"
Đúng theo yêu cầu bài #51
 
Upvote 0
Học Regex mà bỏ qua Execute thì cũng như học bơi mà không bơi sải, chỉ bơi ếch.

rx.Pattern = "[A-Za-z][0-9]+"
If rx.Test(str) Then ' str là chuỗi cần tách
TachChuoi = rx.Execute(str)(rx.Execute(str).Count-1)
Else
TachChuoi = "Khong có để tách" ' nếu là hàm ngừoi dùng thì set nó bằng error ở đây
End If

TachChuoi("ASSY-BATT-COVER,J123F,WHITE,DUOS,J510F") = "J510"
Đúng theo yêu cầu bài #51

Cảm ơn anh, không phải bỏ qua Execute mà là tìm tài liệu về cái này không thấy có trong diễn đàn, thông tin trên mạng cũng rất ít. Em ghi từ khóa là Execute vba excel mà kết quả chẳng thấy.
 
Upvote 0
Cảm ơn anh, không phải bỏ qua Execute mà là tìm tài liệu về cái này không thấy có trong diễn đàn, thông tin trên mạng cũng rất ít. Em ghi từ khóa là Execute vba excel mà kết quả chẳng thấy.
https://www.princeton.edu/~mlovett/reference/Regular-Expressions.pdf
https://people.cs.clemson.edu/~goddard/texts/theoryOfComputation/2.pdf

http://regexr.com/

https://docs.microsoft.com/en-us/do...s/regular-expression-language-quick-reference
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Sưu tầm được 1 hàm tách số khá hay, xin chia sẽ với mọi người!
Điểm đặc biệt là không dùng tí vòng lập nào!
PHP:
Function TachSo(Cell As Range) As Double
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp.Pattern = "[^0-9]"
  TachSo = Temp.Replace(Cell, "")
End Function
Các bạn có thể tham khảo và phát triển thêm tùy theo yêu cầu riêng!

Bác ơi, sao em dùng hàm của bác thì chỉ lọc được 15 số trong chuỗi, từ số 16 trở đi thì nó thành số 0. VD: lọc abc0123456789012345xyz thì thành 123456789012345 là đúng nhưng nếu là abc01234567890123456789xyz thì thành 1234567890123460000.
 
Upvote 0
Bác ơi, sao em dùng hàm của bác thì chỉ lọc được 15 số trong chuỗi, từ số 16 trở đi thì nó thành số 0. VD: lọc abc0123456789012345xyz thì thành 123456789012345 là đúng nhưng nếu là abc01234567890123456789xyz thì thành 1234567890123460000.

Hệ thống máy tính bình thường chỉ chứa được con số tới 15 chữ số. Kể từ chữ số thứ 16 được trở thành 0 hết.
Có 2 cách để giữ chứ số kể từ 16:
1. chứa trong dạng chuỗi
2. chia làm 2 phần. Ví dụ phần triệu và phần trăm ngàn.
 
Upvote 0
Hệ thống máy tính bình thường chỉ chứa được con số tới 15 chữ số. Kể từ chữ số thứ 16 được trở thành 0 hết.
Có 2 cách để giữ chứ số kể từ 16:
1. chứa trong dạng chuỗi
2. chia làm 2 phần. Ví dụ phần triệu và phần trăm ngàn.

Cụ thể là em phải dùng hàm vba trường hợp này như thế nào ạ bác?
 
Upvote 0
Bác ơi, sao em dùng hàm của bác thì chỉ lọc được 15 số trong chuỗi, từ số 16 trở đi thì nó thành số 0. VD: lọc abc0123456789012345xyz thì thành 123456789012345 là đúng nhưng nếu là abc01234567890123456789xyz thì thành 1234567890123460000.
Dòng đầu tiên, thay as double thành as string xem sao
 
Upvote 0

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

Back
Top Bottom