So sánh và sửa số liệu theo điều kiện?

Liên hệ QC

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
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 ạ.
 

File đính kèm

  • so sanh.xlsx
    13.3 KB · Đọc: 55
Upvote 0
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

Xin chào hiénlinh197,
Cảm ơn bạn đã quan tâm, đây là vấn đề khó khăn OT đang gặp phải trong công việc và tự bản thân chưa thể giải quyết được nên gửi lên đây nhờ Thầy và các bạn giúp đỡ ạ.
 
Upvote 0
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 ạ.
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
 
Upvote 0
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
Xin chào snow25,
Cảm ơn bạn đã giúp đỡ,kết quả đúng ý OT mong muốn rồi bạn ạ, không ngờ code lại ngắn vậy.
Chạy code của bạn ra kết quả mới biết là ô "F12" của OT minh họa bị sai (OT sửa số lượng C12 mà quên không sửa lại F12) :)
Chúc bạn ngày mới vui khỏe.
 
Upvote 0
@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
 
Lần chỉnh sửa cuối:
Upvote 0
@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)

Xin chào HeSanbi,
Cảm ơn bạn đã quan tâm ạ.
2 lỗi trên gần như không thể xảy ra ạ vì: dữ liệu xuất ra từ phần mềm (có quy định,tiêu chuẩn rõ ràng)

Để code chạy thì Dữ liệu cần phải đủ điều kiện hoặc code lại
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 ạ.
Ít nhất là cũng đề phòng được có thể sảy ra, nhiều hơn nữa là OT và các bạn khác cũng có thể học hỏi thêm được cách làm khác ạ.
 
Upvote 0
@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
Vậy cho thêm điều kiện nữa là được.
 
Upvote 0
@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 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
 
Lần chỉnh sửa cuối:
Upvote 0
@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
Xin cảm ơn HeSanbi nhiều ,code chạy ra kết quả OK ạ.
 
Upvote 0
@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
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"
 
Upvote 0
Upvote 0
Tốt nhất nên sửa lại là:
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 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
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Web KT
Back
Top Bottom