Hoàng Nhật Phương
Thành viên gắn bó
- Tham gia
- 5/11/15
- Bài viết
- 1,894
- Được thích
- 1,213
Dạo này ít thàng viên hỏi những bài toán hay. Nên OT đưa ra những bài toán để các thầy giải đáp và tự OT giải đapXin chào các bạn,
Nhờ các bạn giúp đỡ tôi trường hợp trong tập tin gửi kèm gửi với ạ.
Dạo này ít thàng viên hỏi những bài toán hay. Nên OT đưa ra những bài toán để các thầy giải đáp và tự OT giải đap
Bạn chạy thử code này xem.Xin chào các bạn,
Nhờ các bạn giúp đỡ tôi trường hợp trong tập tin gửi kèm gửi với ạ.
Sub sosanh()
Dim arr, T As String, at, T1 As String
Dim lr As Long, i As Long, a As Integer, b As Integer
With Sheet1
lr = .Range("C" & Rows.Count).End(xlUp).Row
arr = .Range("C2:C" & lr).Value
For i = 1 To UBound(arr, 1) - 1
a = Len(arr(i, 1)): b = Len(arr(i + 1, 1))
If a > 30 And b < 30 Then
T = Split(arr(i, 1), "/")(3)
at = Split(arr(i + 1, 1), "/")
arr(i + 1, 1) = at(0) & "/" & at(1) & "/" & T
End If
Next i
.Range("G2:G" & lr).Value = arr
End With
End Sub
Xin chào snow25,Bạn chạy thử code này xem.
Mã:Sub sosanh() Dim arr, T As String, at, T1 As String Dim lr As Long, i As Long, a As Integer, b As Integer With Sheet1 lr = .Range("C" & Rows.Count).End(xlUp).Row arr = .Range("C2:C" & lr).Value For i = 1 To UBound(arr, 1) - 1 a = Len(arr(i, 1)): b = Len(arr(i + 1, 1)) If a > 30 And b < 30 Then T = Split(arr(i, 1), "/")(3) at = Split(arr(i + 1, 1), "/") arr(i + 1, 1) = at(0) & "/" & at(1) & "/" & T End If Next i .Range("G2:G" & lr).Value = arr End With End Sub
arr(i + 1, 1) = at(0) & "/" & at(1) & "/" & T
T = Split(arr(i, 1), "/")(3)
@Nguyễn Hoàng Oanh Thơ
Nếu chuỗi không chứa dấu "/" thì code trên sẽ xảy ra lỗi
Nếu chuỗi dài hơn 30 ký tự mà chỉ chứa 1 dấu "/" gặp lỗi vì sẽ không đủ điều kiện đểPHP:arr(i + 1, 1) = at(0) & "/" & at(1) & "/" & T
PHP:T = Split(arr(i, 1), "/")(3)
Nếu không phiền HeSanbi có thể cho OT 1 tham khảo đoạn code khắc phục trong trường hợp trên được không ạ.Để code chạy thì Dữ liệu cần phải đủ điều kiện hoặc code lại
Vậy cho thêm điều kiện nữa là được.@Nguyễn Hoàng Oanh Thơ
Nếu chuỗi không chứa dấu "/" thì code trên sẽ xảy ra lỗi
PHP:arr(i + 1, 1) = at(0) & "/" & at(1) & "/" & T
Nếu chuỗi dài hơn 30 ký tự mà chỉ chứa 1 dấu "/" gặp lỗi vì sẽ không đủ điều kiện để
PHP:T = Split(arr(i, 1), "/")(3)
Để code chạy thì Dữ liệu cần phải đủ điều kiện hoặc code lại
Sub sosanh2()
Dim Arr, T, lr&, i&, LenStr&, RecentStr$
With Sheets("Sheet1") 'Không nên viết là Sheet1 <> Excel Tiếng Việt
lr = .Range("C" & Rows.Count).End(xlUp).Row
If lr < 2 Then Exit Sub
Arr = .Range("C2:C" & lr).Value
For i = 1 To UBound(Arr)
LenStr& = Len(Arr(i, 1))
T = Split(Arr(i, 1), "/")
If UBound(T) > 2 And LenStr& > 30 Then RecentStr$ = T(3)
If UBound(T) > 1 And LenStr& <= 30 And RecentStr$ <> vbNullString Then _
T(2) = RecentStr$: Arr(i, 1) = Join(T, "/")
'Đã sửa-------------------------------------------------------------------
If UBound(T) < 3 Or LenStr& <= 30 Then RecentStr$ = vbNullString
'--------------------------------------------------------------------------
Next i
.Range("G2:G" & lr).Value = Arr
End With
End Sub
Xin cảm ơn HeSanbi nhiều ,code chạy ra kết quả OK ạ.@Nguyễn Hoàng Oanh Thơ
Mượn lại code của @snow25:
PHP:Sub sosanh2() Dim Arr, T, lr&, i&, LenStr&, RecentStr$ With Sheets("Sheet1") 'Không nên viết là Sheet1 <> Excel Tiếng Việt lr = .Range("C" & Rows.Count).End(xlUp).Row If lr < 2 Then Exit Sub Arr = .Range("C2:C" & lr).Value For i = 1 To UBound(Arr) LenStr& = Len(Arr(i, 1)) T = Split(Arr(i, 1), "/") If UBound(T) > 2 Then RecentStr$ = IIf(LenStr& > 30, T(3), "") If UBound(T) > 1 And LenStr& < 30 And RecentStr$ <> vbNullString Then _ T(2) = RecentStr$: Arr(i, 1) = Join(T, "/") Next i .Range("G2:G" & lr).Value = Arr End With End Sub
Hihi, cảm ơn PacificPR, OT chưa hiểu bạn ạ ... nói nhỏ với được không ạ?Code bài 10 mất "Đô La" đó Bạn ạ
Mượn thì nên dùng hết ý của code, bỏ sót ý nên dòng 12 bị sai "95556966 5551/ /10"@Nguyễn Hoàng Oanh Thơ
Mượn lại code của @snow25:
PHP:Sub sosanh2() Dim Arr, T, lr&, i&, LenStr&, RecentStr$ With Sheets("Sheet1") 'Không nên viết là Sheet1 <> Excel Tiếng Việt lr = .Range("C" & Rows.Count).End(xlUp).Row If lr < 2 Then Exit Sub Arr = .Range("C2:C" & lr).Value For i = 1 To UBound(Arr) LenStr& = Len(Arr(i, 1)) T = Split(Arr(i, 1), "/") If UBound(T) > 2 Then RecentStr$ = IIf(LenStr& > 30, T(3), "") If UBound(T) > 1 And LenStr& < 30 And RecentStr$ <> vbNullString Then _ T(2) = RecentStr$: Arr(i, 1) = Join(T, "/") Next i .Range("G2:G" & lr).Value = Arr End With End Sub
"Chủ quan nên đi đôi với sai sót"Mượn thì nên dùng hết ý của code, bỏ sót ý nên dòng 12 bị sai "95556966 5551/ /10"
T(2) = RecentStr$: Arr(i, 1) = Join(T, "/"):RecentStr$ = ""
Cảm ơn HeSanbi nhiều ạ, vậy là không lo bị mất "đô la" nữa ạ )"Chủ quan nên đi đôi với sai sót"
Thêm ràng buộc nữa nhé @Nguyễn Hoàng Oanh Thơ:
PHP:If UBound(T) > 2 Then RecentStr$ = IIf(LenStr& > 30, T(3), "") Else RecentStr$ = ""
Sub sosanh2()
Dim Arr, T, lr&, i&, LenStr&, RecentStr$
With Sheets("Sheet1") 'Không nên viết là Sheet1 <> Excel Tiếng Việt
lr = .Range("C" & Rows.Count).End(xlUp).Row
If lr < 2 Then Exit Sub
Arr = .Range("C2:C" & lr).Value
For i = 1 To UBound(Arr)
LenStr& = Len(Arr(i, 1))
T = Split(Arr(i, 1), "/")
If UBound(T) > 2 And LenStr& > 30 Then RecentStr$ = T(3)
If UBound(T) > 1 And LenStr& <= 30 And RecentStr$ <> vbNullString Then _
T(2) = RecentStr$: Arr(i, 1) = Join(T, "/")
If UBound(T) < 3 Or LenStr& <= 30 Then RecentStr$ = vbNullString
Next i
.Range("G2:G" & lr).Value = Arr
End With
End Sub
Hay quá, có cách nào giảm bớt IF không, code càng tuyệt vời hơn, dể đọc hơn"Chủ quan nên đi đôi với sai sót"
Thêm đoạn này nữa nhé @Nguyễn Hoàng Oanh Thơ:
PHP:T(2) = RecentStr$: Arr(i, 1) = Join(T, "/"):RecentStr$ = ""
DIỄN ĐÀN GIẢI PHÁP EXCEL