Làm thế nào để lấy được các số trong một chuỗi ký tự bất kỳ? (1 người xem)

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

duycuong0120

Thành viên mới
Tham gia
4/2/08
Bài viết
7
Được thích
0
Xin chào các anh chị.
Đầu xuân mới em chúc mọi người một năm mới dồi dào sức khỏe và gặt hái được nhiều thành công trong sự nghiệp của mình.
Tiện đây em cũng có một câu hỏi muốn nhờ các anh chị giúp:
em đang băn khoăn k biết có công thức nào có thể lấy được các chữ số trong một chuỗi ký tự?
anh chị nào biết thì giúp em nhé!
 
Bạn đưa lên một ví dụ cụ thể và kết quả mong muốn lên để mọi người dễ hướng dẫn hơn, tránh trường hợp đoán ý và làm rồi lại không đúng ý bạn.
 
vd: em có một cột mahang gồm các hàng như sau:

SA567TP
TH56VT
GL7684HP
Em muốn tách lấy các số tại các hàng trên. các bác giúp em nhé
 

File đính kèm

Thanks bác nhiều nhé!
Nhưng em vào visual basic editor ngin cứu không thấy cái "HÀM" của bác đâu!(em lúa lắm).
Bác COP_KH để nó ở đâu vậy.
 
Lần chỉnh sửa cuối:
Bạn vào Insert -> Name -> Define sẽ thấy Name nằm trong đó.
Đây là công thức chứ ko phải Code đâu bạn.
Thân.
 
Hê hê! em tìm thấy em nó rồi.
thank you so much!
để em ngẫm nghĩ xem nguyên lý nó như thế nào.
chết thật càng đọc càng không biết gì!
 
Muốn dùng VBA thì dùng Function này:
PHP:
Function tachso(cel As String) As Long
Dim temp As String, i As Integer
For i = 1 To Len(cel)
If IsNumeric(Mid(cel, i, 1)) Then
temp = temp & Mid(cel, i, 1)
End If
Next
tachso = Val(temp)
End Function
Thân.
 

File đính kèm

Po_Pikachu ơi em muốn nó tự tách và tính luôn có được không anh chẳng hạn như thế này nhé nhập vào: tôn boong mũi = 8+[10+2*(4+6)]*2mặt*3bên thì xell bên sẽ tự động tính kếtt quả là 188. các ah ai bioết chi cho em với nhé
 
Muốn dùng VBA thì dùng Function này:
PHP:
Function tachso(cel As String) As Long
Dim temp As String, i As Integer
For i = 1 To Len(cel)
If IsNumeric(Mid(cel, i, 1)) Then
temp = temp & Mid(cel, i, 1)
End If
Next
tachso = Val(temp)
End Function
Thân.

Nếu chỉ có 1 số (VD như SA567TP; TH56VT; GL7684HP) chứ không phải 2 số (jkhfgufg4fg5fg4f5g) thì hãy đơn giản hơn :
PHP:
Function TS(cel As String) As Long
    TS = Val(cel)
End Function
--CV--
 
Po_Pikachu ơi em muốn nó tự tách và tính luôn có được không anh chẳng hạn như thế này nhé nhập vào: tôn boong mũi = 8+[10+2*(4+6)]*2mặt*3bên thì xell bên sẽ tự động tính kếtt quả là 188. các ah ai bioết chi cho em với nhé
Bạn tham khảo file này xem!
(Chỉnh sửa từ bài Tách số không dùng vòng lập)
PHP:
Function ValExp(Cell As Range) As String
  Dim Temp, Temp1
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp1 = Replace(Cell, "[", "(")
  Temp1 = Replace(Temp1, "]", ")")
  Temp1 = Replace(Temp1, "{", "(")
  Temp1 = Replace(Temp1, "}", ")")
  Temp1 = Replace(Temp1, "x", "*")
  Temp1 = Replace(Temp1, ":", "/")
  Temp.Pattern = "[^0-9,+,.,*,/,:,(,),-]"
  ValExp = Evaluate(Temp.Replace(Temp1, ""))
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Tôi đang định hỏi làm thế nào để đếm được số lần một ký nào đó xuất hiện trong một chuối bất kỳ, vd:trong chuỗi ch0912ch218ch219 thì ch =3; 9 = 2; 1 = 3;... Thì thấy bài này có nội dung tương tự nên post vào đây luôn.
Nhờ các bạn viết giúp công thức hoặc code cho yêu cầu này. Thanks !
 
Tôi đang định hỏi làm thế nào để đếm được số lần một ký nào đó xuất hiện trong một chuối bất kỳ, vd:trong chuỗi ch0912ch218ch219 thì ch =3; 9 = 2; 1 = 3;... Thì thấy bài này có nội dung tương tự nên post vào đây luôn.
Nhờ các bạn viết giúp công thức hoặc code cho yêu cầu này. Thanks !
Nguyên tắc chung:
- Dùng Replace (đối với VBA) hoặc SUBSTITUTE (với công thức Excel) để thay từ cần đếm thành rổng
- Lấy độ dài chuổi gốc trừ cho độ dài chuổi sau khi thay thế (dùng hàm LEN())
- Lấy kết quả vừa ra, chia cho số ký tự cần đếm (ví dụ ch có 2 ký tự, sẽ chia cho 2)
===> KQ cuối cùng là KQ cần tìm
Anh tham khảo bài này:
http://www.giaiphapexcel.com/forum/showthread.php?t=6127
Công thức hay VBA đều sử dụng thuật toán này mà không cần FOR Phiếc gì ráo
----------
Lấy ví dụ anh đưa ở trên, ta có:
A1 = ch0912ch218ch219
B1 = ch
Vậy KQ là:
=(LEN(A1)-LEN(SUBSTITUTE(A1,B1,"")))/LEN(B1)
và UDF:
PHP:
Function DemTu(Chuoi As String, Tu As String) As Long
  DemTu = (Len(Chuoi) - Len(Replace(Chuoi, Tu, ""))) / Len(Tu)
End Function

 
Lần chỉnh sửa cuối:
Việc thay thế thì rất hay.
Tuy nhiên thay thế thì cũng phải quét hết cả chuỗi (tức là giải thuật của hàm Replace), vậy thì liệu thay thế có nhanh hơn InStr không nhỉ ?? Có lẽ nhanh hơn ?!
Vì cùng là VBA mà.


--CV--
 
Bạn có thể làm giúp luôn cho ví dụ trên được không ? tôi chưa biết sử dụng InStr như thế nào. Thanks!
 
Sáng nay, mình đọc bài thấy ý tưởng tính toán từ các số cho trong chuỗi thấy cũng hay, nhất là khi giải trình một việc gì đó. Bận quá tối về mới viết hàm VBA để làm việc này.Chắc là còn rất nhiều lỗi, mong các bạn cùng bổ xung.
Lưu ý: Viết m vuông, không m2
Trong reference tham chiếu đến thư viện của Access vì hàm Eval() là hàm riêng của Access
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn có thể làm giúp luôn cho ví dụ trên được không ? tôi chưa biết sử dụng InStr như thế nào. Thanks!
InStr gần giống như hàm FIND trong công thức Excel đấy anh à!
Làm thì được, nhưng ăn chắc code sẽ rất dài
Anh xem code của anh Sealand, có dùng InStr đấy!
Ví dụ nhò:
Cell A2 = Cong thuc=5+12/6+(934+9)
Vậy:
InStr([A2], "+") là tìm xem dấu + nằm ở vị trí thứ mấy ---> Theo dử liệu tại A2, kết quả thu được = 12 ...
(ở đây viết rút gọn, xem như mặc định, start = 1)
Việc thay thế thì rất hay.
Tuy nhiên thay thế thì cũng phải quét hết cả chuỗi (tức là giải thuật của hàm Replace), vậy thì liệu thay thế có nhanh hơn InStr không nhỉ ?? Có lẽ nhanh hơn ?!
Vì cùng là VBA mà.


--CV--
Tốc độ nhanh hơn hay không thì mình chưa dám xác định (nội tạng của bác Bill mà, đâu biết được) ---> Có điều là code sẽ ngắn hơn, và cũng rất dể hiểu nữa
 
Lần chỉnh sửa cuối:
bác nào có công thức nhập trực tiếp vào ex luôn, không dùng qua define thì cho em xin. thank...
 
To truonghagpex

Bạn có đề nghị bổ xung vào hàm tính trong chuỗi SETVAL() của mình việc chủ động xác định ký tự bắt đầu tính toán (=) và ký tự kết thúc (;). Theo mình nên sử lý như sau:

1/Để nguyên hàn SETVAL()
2/Bổ xung thêm hàm MyStr(Tr,Cstar,Cend)
Mã:
Function MyStr(Tr As String, Cstar As String, Cend As String) As String
Dim vt1, vt2 As Integer
vt1 = 1
vt2 = Len(Tr)
If InStr(Tr, Cstar) > 0 Then vt1 = InStr(Tr, Cstar)
If InStr(Tr, Cend) > 0 Then vt2 = InStr(Tr, Cend)
MyStr = Mid(Tr, vt1, vt2 - vt1)
End Function

Ví dụ: ô A3 chứa chuỗi ta có chuỗi cần tính =MyStr(A3,"=",";")

3/ Công thức theo yêu cầu của bạn là

=SETVAL(MyStr(A3,"=",";"))
 

File đính kèm

em xem bài của anh rồi nhưng khi em làm thử thì nó không chạy được anh xem lại và giúp em với nhé vì em không thể tìm được ai có thể giúp được cả. cảm ơn anh nhiều nhiều, em gữi bảng tính của em choi anh thử nhé còn nửa bài hôm trước của anh không tính được số lẻ sau dấu phẩy anh xem lại cho em anh nhé. thanks FILE ĐỂ THỬ
 
lập công thức tính tổng cho bảng tính

Mình có bảng tính theo dõi công của nhân viên , trong bảng công này có rất nhiều ký tự khác nhau , mỗi ký tự này đại diện cho một chức năng công việc khác nhau .
Khi tổng kết công cuối tháng mình rất lúng túng vì chưa biết thiết lập công thức như thế nào . mong các anh / chị giúp đỡ .
Hoặc anh /chị nào có cách thiết lập bảng công tốt hơn xin chỉ dùm ?
Chân thành cảm ơn các anh chị !
 
To truonghagpex:
1/Bạn thêm dòng dưới vào đầu mỗi hàm thì mỗi khi bảng tính thay đổi nó sẽ reset lại kết quả ngay:

Application.Volatile

2/Dấu thập phân phải là dấu chấm (.) sẽ tính toán bình thường

(Xem dòng mình tô màu nhé)
 

File đính kèm

Mình có bảng tính theo dõi công của nhân viên , trong bảng công này có rất nhiều ký tự khác nhau , mỗi ký tự này đại diện cho một chức năng công việc khác nhau .
Khi tổng kết công cuối tháng mình rất lúng túng vì chưa biết thiết lập công thức như thế nào . mong các anh / chị giúp đỡ .

1/Nếu ít (Ít ký tự đại diện chứ không phải danh sách công nhân ít) thì dùng hàm if để định trị cho các ký tự đại diện.
2/Nếu nhiều:
-Tạo bảng Danh mục rồi dùng dùng công thức dò tìm.
-Viết hàm UDF

Vì không có file cụ thể nên mình chỉ tham gia được vậy thôi
 
Anh ơi bài này
ValExp_01.xls;
PHP:
Function ValExp(Cell As Range) As String
  Dim Temp, Temp1
  Set Temp = CreateObject("VBScript.RegExp")
  Temp.Global = True
  Temp1 = Replace(Cell, "[", "(")
  Temp1 = Replace(Temp1, "]", ")")
  Temp1 = Replace(Temp1, "{", "(")
  Temp1 = Replace(Temp1, "}", ")")
  Temp1 = Replace(Temp1, "x", "*")
  Temp1 = Replace(Temp1, ":", "/")
  Temp.Pattern = "[^0-9,+,.,*,/,:,(,),-]"
  ValExp = Evaluate(Temp.Replace(Temp1, ""))
End Function
bài này rất tốt nhưng trong trường hợp này thì không được
vis dụ" bu lông M16x20 =(4+6)*3 hàng; linhx kho 10 cais" cho kết quả sai
"trọng lượng bu lông M16x20 = trọng lượng loại 60*5 =(5+6)*3 Kg/Đvđ;" kết quả sai
vì nó dùng cả 16x20 làm phép tính. chính vì thế em muốn anh thêm là chỉ tính từ dấu (=) đến dấu (;) nếu có. tức là dùng option gì đó khi khai báo.
khi đó nếu gặp trường hợp này thì em sẽ thêm giấu (=) và dấu (;) còn bình thường thì không cần
em đang rất cần mà em lại chi học passcal thôi nên nhờ anh giúp em luôn với nhe
 
Lần chỉnh sửa cuối:
Mình dùng code này để xử lý vấn đề của bạn. Bạn test xem thử ha!
Mã:
Function vale(cell As Range)
Dim temp As Long
vale = "Khong co gia tri"
For i = 1 To UBound(Split(cell, " "))
If InStr(1, Split(cell, " ")(i), "=") > 0 And Len(Split(cell, " ")(i)) > 1 Then
temp = temp + Evaluate(Split(cell, " ")(i))
End If
vale = temp
Next
End Function
Thân.
 
tim hiểu cách tạo bảng nghiệm thu

chào các anh chị em hiện đang vướng mắc đoạn code sau mà không tìm được ai giúp, anh chị giúp em làm hộ nhé. em xin cảm ơn nhiều. hôm qua em đưa lên nhưng bị cho vào thùng rác mà em cũng không biết vì sao? Anh chị nào có thể viết cho em đoạn code trong exell với nhé
untitled.jpg
 

File đính kèm

Lần chỉnh sửa cuối:
chào các anh chị em hiện đang vướng mắc đoạn code sau mà không tìm được ai giúp, anh chị giúp em làm hộ nhé. em xin cảm ơn nhiều. hôm qua em đưa lên nhưng bị cho vào thùng rác mà em cũng không biết vì sao? Anh chị nào có thể viết cho em đoạn code trong exell với nhé
untitled.jpg

Bạn gửi file cụ thể lên đi, có gì thì mọi người cùng làm, chứ gửi hình không vẫn chưa đủ, yêu cầu của bạn vẫn không rõ ràng, lọc về vấn đề gì? Điều kiện nào? ...
 
Em up cả phai đính kèm

chào các anh chị em hiện đang vướng mắc đoạn code sau mà không tìm được ai giúp, anh chị giúp em làm hộ nhé. em xin cảm ơn nhiều. hôm qua em đưa lên nhưng bị cho vào thùng rác mà em cũng không
biết vì sao? Anh chị nào có thể viết cho em đoạn code trong exell với nhé
EM GỮI KÈM THEO PHAI ĐỂ CÁC ANH XEM HỘ EM NHÉ
untitled.jpg
 

File đính kèm

hu hu vậy alf lại không có ai giúp em rồi
càng chờ càng mất hút phải chăng như thế là khó khăn lắm chăng
 
mình xin góp ý thế này:
với bảng tính:"tính toán trong chuỗi" của tác giả GPE
Nếu như trong dự toán bóc tách khối lượng tường xây.Tôi thường diễn giải là tường xây trục mấy.Ví dụ "tường truc1 : 5*3*0.22" thì đúng ra khối lượng sẽ là 3,3(m3).Nhưng nếu đánh vào trong bảng tính của bạn thì không cho ra ra kết quả như vây,mà ra kết quả là 10(m3).liệu bạn có cách nào khác không ví dụ như viết code:chỉ lấy số liệu sau dấu " : " để tính toán không.
Thứ 2 là:khi tôi đánh số vào ô A2ví dụ "0.22 " thì ô kết quả B2=setval(A2) không cho kết quả gì
Thứ 3 là:Tối nhập vào ô A2=5*3*0.22 thì ô kết quả B2=setval(A2)=3.đúng ra kết quả là 3,3 chứ.
Mong bạn sớm hồi âm.
 

File đính kèm

Function ValExp(Cell As Range) As String
Dim Temp
, Temp1
Set Temp
= CreateObject("VBScript.RegExp")
Temp.Global = True
Temp1
= Replace(Cell, "[", "(")
Temp1 = Replace(Temp1, "]", ")")
Temp1 = Replace(Temp1, "{", "(")
Temp1 = Replace(Temp1, "}", ")")
Temp1 = Replace(Temp1, "x", "*")
Temp1 = Replace(Temp1, ":", "/")
Temp.Pattern = "[^0-9,+,.,*,/,:,(,),-]"
ValExp = Evaluate(Temp.Replace(Temp1, ""))
End Function

Các bác giúp em với. Em dùng hàm này nhưng không thể tăng hay giảm được số ký tự sau dấu ,. Các bác sửa giúp em với. Chân thành cảm ơn.

 
Bạn tham khảo file này xem!
(Chỉnh sửa từ bài Tách số không dùng vòng lập)
PHP Code:
Function ValExp(Cell As Range) As String
Dim Temp
, Temp1
Set Temp
= CreateObject("VBScript.RegExp")
Temp.Global = True
Temp1
= Replace(Cell, "[", "(")
Temp1 = Replace(Temp1, "]", ")")
Temp1 = Replace(Temp1, "{", "(")
Temp1 = Replace(Temp1, "}", ")")
Temp1 = Replace(Temp1, "x", "*")
Temp1 = Replace(Temp1, ":", "/")
Temp.Pattern = "[^0-9,+,.,*,/,:,(,),-]"
ValExp = Evaluate(Temp.Replace(Temp1, ""))
End Function

Anh cho em nhờ chút là, trong excel, em định dạng dấu thập phân là dấu ",", dấu nhóm hàng nghìn là "." thì sử dụng hàm này không ra kết quả. Cái này sửa lại thế nào được anh? EM cảm ơn!
 
=VALUE(MID(T8,3,LEN(T8)-4)) bạn có thể dùng hàm này để lọc T8 là ô chứa cái SA567TP nhé
 
=VALUE(MID(T8,3,LEN(T8)-4)) bạn có thể dùng hàm này để lọc T8 là ô chứa cái SA567TP nhé
Đọc bài viết của bạn tôi thấy giống kiểu có ông giao bán thuốc trị muỗi, muỗi nào cũng diệt được: Bí quyết bắt từng con muỗi vạch mồm nhét thuốc vào.
 

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

Back
Top Bottom