hongphuong1997
Thành viên tiêu biểu
- Tham gia
- 12/11/17
- Bài viết
- 727
- Được thích
- 293
- Giới tính
- Nữ
Công thức được không bạn.Nhờ anh chị và thầy cô viết giúp hàm như file đính kèm ạ
Em xin cảm ơn
Không được cũng làm, ai dám cấmCông thức được không bạn.
Lúc trước cháu có trả lời anhKhông được cũng làm, ai dám cấm
Hi hi... em cảm ơn anh @snow25 rất nhiều, chuẩn quá rùi anh oiThử nhé em.
Function LocSo(chuoi As String) As String() ' As Variant cũng được
' lấy tất cả các số trong mọt chuỗi, trả về môt mảng những số này
Static RX As Object
If RX Is Nothing Then
Set RX = CreateObject("vbscript.regexp")
RX.Global = True
End If
RX.Pattern = "[^\d]+" ' khi hàm chạy êm rồi thì đem dòng này cho vào vùng IF ở trên
LocSo = Split(Application.Trim(RX.Replace(chuoi, " ")), " ")
End Function
Ai đã hướng dẫn bạn cách sử dụng Regexp vậy, bạn có cần được hướng dẫn thêm không.Bạn thử dùng cách này xem !
Sub PhanTich_1()
Dim SArr, Result, aDuLieu, i, t, j
SArr = Sheet1.Range("A1", Sheet1.Range("A1").End(xlDown))
ReDim Result(1 To UBound(SArr), 1 To 3)
With CreateObject("VbScript.RegExp")
.Pattern = "(\d+)"
.Global = True
For i = 1 To UBound(SArr)
If .test(SArr(i, 1)) Then
Set t = .Execute(SArr(i, 1))
For j = 1 To t.Count
Result(i, j) = t(j - 1)
Next
End If
Next i
Sheet1.Range("B2").Resize(UBound(SArr), 3).NumberFormat = "@"
Sheet1.Range("B2").Resize(UBound(SArr), 3) = Result
End With
End Sub
Sub PhanTich_2()
Dim SArr, Result, aDuLieu, i, t, j
SArr = Sheet1.Range("A1", Sheet1.Range("A1").End(xlDown))
ReDim Result(1 To UBound(SArr), 1 To 3)
With CreateObject("VbScript.RegExp")
.Pattern = "[\D]+(\d{9,})[\D]+(\d{9,})[\D]+(\d+)[\D]*"
.Global = False
For i = 1 To UBound(SArr)
If .test(SArr(i, 1)) Then
Set t = .Execute(SArr(i, 1))
Result(i, 1) = t(0).submatches(0)
Result(i, 2) = t(0).submatches(1)
Result(i, 3) = t(0).submatches(2)
End If
Next i
Sheet1.Range("B2").Resize(UBound(SArr), 3).NumberFormat = "@"
Sheet1.Range("B2").Resize(UBound(SArr), 3) = Result
End With
End Sub
Dạ vâng ! em Vân cảm ơn anh @HeSanbi nhiều ạ !Ai đã hướng dẫn bạn cách sử dụng Regexp vậy, bạn có cần được hướng dẫn thêm không.
Học thêm cặp dấu ngoặc tròn () này này, nó là một Group
(?:\d+) có nghĩa là lấy các số nhưng nó không phải một group
(?=\d+) có nghĩa là lấy ký tự đằng trước nếu kết hợp với số
(?!\d+) nó ngược với ?=
.Pattern = "(\d+)"
Ở trường hợp này nên viết như thế này sẽ tốt hơn:
.Pattern = "[\D]*(\d{9,})[\D]*(\d{9,})[\D]*(\d+)[\D]*"
Mặc dù dài hơn nhưng phân tích chính xác hơn
PHP:Sub PhanTich_1() Dim SArr, Result, aDuLieu, i, t, j SArr = Sheet1.Range("A1", Sheet1.Range("A1").End(xlDown)) ReDim Result(1 To UBound(SArr), 1 To 3) With CreateObject("VbScript.RegExp") .Pattern = "(\d+)" .Global = True For i = 1 To UBound(SArr) If .test(SArr(i, 1)) Then Set t = .Execute(SArr(i, 1)) For j = 1 To t.Count Result(i, j) = t(j - 1) Next End If Next i Sheet1.Range("B2").Resize(UBound(SArr), 3).NumberFormat = "@" Sheet1.Range("B2").Resize(UBound(SArr), 3) = Result End With End Sub Sub PhanTich_2() Dim SArr, Result, aDuLieu, i, t, j SArr = Sheet1.Range("A1", Sheet1.Range("A1").End(xlDown)) ReDim Result(1 To UBound(SArr), 1 To 3) With CreateObject("VbScript.RegExp") .Pattern = "[\D]*(\d{9,})[\D]*(\d{9,})[\D]*(\d+)[\D]*" .Global = False For i = 1 To UBound(SArr) If .test(SArr(i, 1)) Then Set t = .Execute(SArr(i, 1)) Result(i, 1) = t(0).submatches(0) Result(i, 2) = t(0).submatches(1) Result(i, 3) = t(0).submatches(2) End If Next i Sheet1.Range("B2").Resize(UBound(SArr), 3).NumberFormat = "@" Sheet1.Range("B2").Resize(UBound(SArr), 3) = Result End With End Sub
Em cảm ơn anhAi đã hướng dẫn bạn cách sử dụng Regexp vậy, bạn có cần được hướng dẫn thêm không.
Học thêm cặp dấu ngoặc tròn () này này, nó là một Group
(?:\d+) có nghĩa là lấy các số nhưng nó không phải một group
(?=\d+) có nghĩa là lấy ký tự đằng trước nếu kết hợp với số
(?!\d+) nó ngược với ?=
.Pattern = "(\d+)"
Ở trường hợp này nên viết như thế này sẽ tốt hơn:
.Pattern = "[\D]+(\d{9,})[\D]+(\d{9,})[\D]+(\d+)[\D]*"
Mặc dù dài hơn nhưng phân tích chính xác hơn
PHP:Sub PhanTich_1() Dim SArr, Result, aDuLieu, i, t, j SArr = Sheet1.Range("A1", Sheet1.Range("A1").End(xlDown)) ReDim Result(1 To UBound(SArr), 1 To 3) With CreateObject("VbScript.RegExp") .Pattern = "(\d+)" .Global = True For i = 1 To UBound(SArr) If .test(SArr(i, 1)) Then Set t = .Execute(SArr(i, 1)) For j = 1 To t.Count Result(i, j) = t(j - 1) Next End If Next i Sheet1.Range("B2").Resize(UBound(SArr), 3).NumberFormat = "@" Sheet1.Range("B2").Resize(UBound(SArr), 3) = Result End With End Sub Sub PhanTich_2() Dim SArr, Result, aDuLieu, i, t, j SArr = Sheet1.Range("A1", Sheet1.Range("A1").End(xlDown)) ReDim Result(1 To UBound(SArr), 1 To 3) With CreateObject("VbScript.RegExp") .Pattern = "[\D]+(\d{9,})[\D]+(\d{9,})[\D]+(\d+)[\D]*" .Global = False For i = 1 To UBound(SArr) If .test(SArr(i, 1)) Then Set t = .Execute(SArr(i, 1)) Result(i, 1) = t(0).submatches(0) Result(i, 2) = t(0).submatches(1) Result(i, 3) = t(0).submatches(2) End If Next i Sheet1.Range("B2").Resize(UBound(SArr), 3).NumberFormat = "@" Sheet1.Range("B2").Resize(UBound(SArr), 3) = Result End With End Sub
Đã bắt đúng dãy số liên tục thì xuất luôn kết quả. Bạn thay 3 dòng trên thành 3 dòng dưới xem saoBạn thử dùng cách này xem !
'Result(i, 1) = Split(t(0), " ")(0)
'Result(i, 2) = Split(t(1), " ")(0)
'Result(i, 3) = Split(t(2), " ")(0)
Result(i, 1) = t(0)
Result(i, 2) = t(1)
Result(i, 3) = t(2)
Dạ vâng em Vân cảm ơn anh @CHAOQUAY ạĐã bắt đúng dãy số liên tục thì xuất luôn kết quả. Bạn thay 3 dòng trên thành 3 dòng dưới xem sao
Mã:'Result(i, 1) = Split(t(0), " ")(0) 'Result(i, 2) = Split(t(1), " ")(0) 'Result(i, 3) = Split(t(2), " ")(0) Result(i, 1) = t(0) Result(i, 2) = t(1) Result(i, 3) = t(2)
Em cảm ơn anhCó sửa lại bài tí tẹo.
PHP:=IF($B2="","",TRIM(MID(SUBSTITUTE(MID($B2,LOOKUP(LEN($B2),FIND({0;1;2;3;4;5;6;7;8;9},$B2)-1),LEN($B2))," ",REPT(" ",100)),1+(2*(COLUMN(A1)-1))*100,100)))
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2