Nhờ giúp về đánh STT (1 người xem)

Liên hệ QC

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

longlt08

Thành viên thường trực
Tham gia
23/3/08
Bài viết
322
Được thích
401
Xin chào ACE trên GPE !
Tôi có macro đánh STT nhưng hiện tại việc đánh STT không đúng. Nhờ mọi người giúp đỡ chỉnh giúp macro chỉ đánh STT các hạng mục không trùng nhau. Tôi xin cảm ơn !(có file gửi kèm theo).
 

File đính kèm

Xin chào ACE trên GPE !
Tôi có macro đánh STT nhưng hiện tại việc đánh STT không đúng. Nhờ mọi người giúp đỡ chỉnh giúp macro chỉ đánh STT các hạng mục không trùng nhau. Tôi xin cảm ơn !(có file gửi kèm theo).
Sao bạn không điền bằng tay STT đúng vào file để mọi người hiểu ý muốn của bạn
Tuy nhiên tôi đoán và làm như vầy:
PHP:
Sub STT()
  Dim SrcRng As Range, sArray, Arr(), Dic As Object
  Dim lR As Long, r As Long, i As Long, WF As WorksheetFunction
  On Error Resume Next
  Set SrcRng = Range("A12:C1000")
  Set WF = Application.WorksheetFunction
  Set Dic = CreateObject("Scripting.Dictionary")
  sArray = SrcRng.Value
  ReDim Arr(1 To UBound(sArray, 1), 1 To 1)
  For lR = 1 To UBound(sArray)
    If CStr(sArray(lR, 2)) <> "" Then
      lCount = lCount + 1
      If CStr(sArray(lR, 3)) = "" Then
        n = 0
        r = r + 1
        Arr(lR, 1) = WF.Roman(r)
      Else
        tmp = CStr(sArray(lR, 2))
        If Not Dic.Exists(tmp) Then
          Dic.Add tmp, lR
          n = n + 1
          Arr(lR, 1) = n
        End If
      End If
    End If
  Next
  If lCount Then SrcRng.Resize(lCount, 1).Value = Arr
End Sub
Kiểm tra xem có đúng không nha
 
Tôi có đánh STT bằng tay ở sheet DT(1) bên cạnh mà. Những mục trùng nhau có bôi màu vàng.
 
Xin cảm ơn anh ndu ! Tôi đã thử code anh viết giúp. Kết quả như ý muốn. Chân thành cảm ơn anh !
 
Xin cảm ơn anh ndu ! Tôi đã thử code anh viết giúp. Kết quả như ý muốn. Chân thành cảm ơn anh !
Bạn cho hỏi: Có khi nào các hạng mục con ở 2 mục lớn lại trùng nhau không?
Ví dụ mục lớn I có mục con tên là "abc" và mục lớn II cũng có 1 mục con tên "abc" luôn
Nếu có trường hợp này thì code phải sửa lại 1 chút:
PHP:
Sub STT()
  Dim SrcRng As Range, sArray, Arr(), Dic As Object
  Dim lR As Long, r As Long, i As Long, WF As WorksheetFunction
  On Error Resume Next
  Set SrcRng = Range("A12:C1000")
  Set WF = Application.WorksheetFunction
  sArray = SrcRng.Value
  ReDim Arr(1 To UBound(sArray, 1), 1 To 1)
  For lR = 1 To UBound(sArray)
    If CStr(sArray(lR, 2)) <> "" Then
      lCount = lCount + 1
      If CStr(sArray(lR, 3)) = "" Then
        Set Dic = CreateObject("Scripting.Dictionary")
        n = 0
        r = r + 1
        Arr(lR, 1) = WF.Roman(r)
      Else
        tmp = CStr(sArray(lR, 2))
        If Not Dic.Exists(tmp) Then
          Dic.Add tmp, lR
          n = n + 1
          Arr(lR, 1) = n
        End If
      End If
    End If
  Next
  If lCount Then SrcRng.Resize(lCount, 1).Value = Arr
End Sub
Tuy nhiên trường hợp này sẽ cho tốc độ chậm hơn! Vậy bạn hãy cân nhắc theo dữ liệu của mình mà chọn giải pháp phù hợp
 
Xin chào ACE trên GPE !
Tôi có macro đánh STT nhưng hiện tại việc đánh STT không đúng. Nhờ mọi người giúp đỡ chỉnh giúp macro chỉ đánh STT các hạng mục không trùng nhau. Tôi xin cảm ơn !(có file gửi kèm theo).

Bạn thử phương pháp đơn giản này xem sao

Sub STT()
[a12:a1000].Clear
n = [b65000].End(3).Row
LaMa = "I"
For a = 12 To n
If Cells(a, 3) = "" Then
Cells(a, 1) = LaMa
LaMa = LaMa & "I"
b = 1
ElseIf Cells(a, 2) = Cells(a - 1, 2) Then
Cells(a, 1) = ""
Else
Cells(a, 1) = b
b = b + 1
End If
Next
End Sub
 
Bạn thử phương pháp đơn giản này xem sao

Sub STT()
[a12:a1000].Clear
n = [b65000].End(3).Row
LaMa = "I"
For a = 12 To n
If Cells(a, 3) = "" Then
Cells(a, 1) = LaMa
LaMa = LaMa & "I"
b = 1
ElseIf Cells(a, 2) = Cells(a - 1, 2) Then
Cells(a, 1) = ""
Else
Cells(a, 1) = b
b = b + 1
End If
Next
End Sub
Trời ơi! Số La Mã mà bạn đánh kiểu vậy à? 20 La Mã là 20 chữ I chắc?
Ngoài ra, nếu 2 hạng mục con trùng nhau nhưng không nằm gần nhau thì bạn tính sao?
Ẹc... Ẹc...
 
Trời ơi! Số La Mã mà bạn đánh kiểu vậy à? 20 La Mã là 20 chữ I chắc?
Ngoài ra, nếu 2 hạng mục con trùng nhau nhưng không nằm gần nhau thì bạn tính sao?
Ẹc... Ẹc...

Giờ anh nói mình mới để ý, đúng là khả năng mình còn kém thiệt, không nhìn thấy xa hơn. Minh sẽ mò mẫm xem có làm được không. Không biết thế này có đúng không, cảm ơn anh đã nhắc nhở

Sub STT()
[a12:a1000].Clear
n = [b65000].End(3).Row
LaMa = 1
For a = 12 To n
If Cells(a, 3) = "" Then
Cells(a, 1) = Application.Roman(LaMa)
LaMa = LaMa + 1
b = 1
ElseIf Cells(a, 2) = Cells(a - 1, 2) Then
Cells(a, 1) = ""
Else
Cells(a, 1) = b
b = b + 1
End If
Next
End Sub
 
Lần chỉnh sửa cuối:
Giờ anh nói mình mới để ý, đúng là khả năng mình còn kém thiệt, không nhìn thấy xa hơn. Minh sẽ mò mẫm xem có làm được không. Không biết thế này có đúng không, cảm ơn anh đã nhắc nhở

Sub STT()
[a12:a1000].Clear
n = [b65000].End(3).Row
LaMa = 1
For a = 12 To n
If Cells(a, 3) = "" Then
Cells(a, 1) = Application.Roman(LaMa)
LaMa = LaMa + 1
b = 1
ElseIf Cells(a, 2) = Cells(a - 1, 2) Then
Cells(a, 1) = ""
Else
Cells(a, 1) = b
b = b + 1
End If
Next
End Sub
Tạm được, nhưng chưa giải quyết được vấn đề 2 mục con giống nhau nhưng không nằm gần nhau
- Một là bạn dùng COUNTIF để kiểm tra nhưng sẽ vướng trường hợp như đề cập ở bài 6... dù làm được nhưng code sẽ khó hơn
- Hai là bạn dùng Dictionary ---> Món này thì kiểu gì cũng giải quyết được
 
Cảm ơn anh, dic phức tạp quá mình không biết sử dụng, cũng đang nghiên cứu mấy bài viết của anh. Kiến thức VBA mình học được phần lớn là của anh đó.
 
Số thứ tự theo điều kiện.

Xin lỗi đã chen ngang (vì nội dung câu hỏi gần giống nhau)nhờ các bạn giúp mình sửa lại công thức tự động điền số thứ tự theo điều kiện:nếu từ A2:A15 có ô nào có giá trị là: "0" hoặc "-" thì sẽ bỏ qua ko đếm,các bạn xem file đính kèm,cảm ơn.
 

File đính kèm

Thử công thức này coi sao nha

=IF(OR(A2="-",A2=0),"",MAX($B$1:B1)+1)
 

File đính kèm

Thử công thức này coi sao nha

=IF(OR(A2="-",A2=0),"",MAX($B$1:B1)+1)

Dấu "-" chẳng qua là số 0 do format hàng ngàn mà thành. Do đó chỉ cần:

=IF(A2=0,"",MAX($B$1:B1)+1)

Hoặc cẩn thận hơn thì loại luôn các ô trống:

=IF(OR(A2="",A2=0),"",MAX($B$1:B1)+1)
 
Chào bạn ndu !
Bữa nay bận quá, xin lỗi các bạn giờ mới vào lại diễn đàn. Buổi sáng mình đã thử code do ndu viết, thấy đánh STT rất nhanh. Có điều này đề nghị bạn xem lại giúp:
1. Macro của bạn không xoá cột trước khi đánh STT, mình không biết ghép với macro cũ nên chưa biết cách xoá cột
2. Macro của mình có tô đậm STT là chữ lama và cho màu đỏ, nhờ bạn chuyển lại giúp
3. STT này dùng để đánh STT cho bảng pivottable nên mình không hiểu ý bạn hỏi trường hợp " 2 mục con giống nhau nhưng không nằm gần nhau". Trong pivot các mục giống nhau tự động ẩn, chỉ khi đánh dấu cho hiện lên thì chúng mới hiện lên đầy đủ.(Như trong file mình gửi lên đã cho hiện các mục giống nhau-Repeat item labels ở mục field seting... của pivot)
* Mình muốn ndu giúp mình viết đoạn code đánh được STT nhưng thêm chức năng như macro cũ thì thuận tiện hơn. Xin cảm ơn bạn đã giúp đỡ !
 
Xịn chào bạn ndu !
Do chưa biết cách kết hợp giữa đoạn code bạn mới viết với Conditional Formating nên tôi đã chạy macro cũ(đoạn code đã gửi bạn), sau đó mới chạy đoạn code của bạn mới viết. Cũng hơi bất tiện. Nếu có thể được, nhờ bạn giúp đỡ cho việc đánh STT được hoàn chỉnh. Xin cảm ơn bạn !
 
Xịn chào bạn ndu !
Do chưa biết cách kết hợp giữa đoạn code bạn mới viết với Conditional Formating nên tôi đã chạy macro cũ(đoạn code đã gửi bạn), sau đó mới chạy đoạn code của bạn mới viết. Cũng hơi bất tiện. Nếu có thể được, nhờ bạn giúp đỡ cho việc đánh STT được hoàn chỉnh. Xin cảm ơn bạn !
Conditional Formating bạn làm bằng tay cơ mà, đâu có liên quan gì đến code chứ
Conditional Formating chỉ làm 1 lần, xài mãi mãi ---> Đừng nói là bạn không biết dùng cái này nha
 

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

Back
Top Bottom