Đánh số thự tự tự động những ô đã được merge. (1 người xem)

Liên hệ QC

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

chuot0106

Thành viên gắn bó
Tham gia
20/1/13
Bài viết
2,567
Được thích
1,670
Ở cột A em có các ô bị Merge(vùng màu xanh). Em thử viết code để đánh số thự tự 1 cách tự đông liên tục(Xem File đính kèm) nhưng kết quả không chính xác(Các số TT không liên tục). Em xin hỏi các anh chị 3 vấn đề như sau:
+ Code em bị sai ở đâu? Cách khắc phục?
+ Nếu các ô đã bị Merge như vậy thì có thể dùng code để giải quyết không? Nếu có cho em xin code tham khảo?
+ Nếu không thể dùng code thi có cách giải quyết tự động nào khác không(Công thức chẳng hạn).
Em xin cảm ơn!
Mã:
Option Explicit


Public Sub DanhSTT()
Dim i As Long, cll As Range
    For Each cll In Selection
        If cll = "" Then
            i = i + 1
            cll = i
        End if
        Next cll
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Ở cột A em có các ô bị Merge(vùng màu xanh). Em thử viết code để đánh số thự tự 1 cách tự đông liên tục(Xem File đính kèm) nhưng kết quả không chính xác(Các số TT không liên tục). Em xin hỏi các anh chị 3 vấn đề như sau:
+ Code em bị sai ở đâu? Cách khắc phục?
+ Nếu các ô đã bị Merge như vậy thì có thể dùng code để giải quyết không? Nếu có cho em xin code tham khảo?
+ Nếu không thể dùng code thi có cách giải quyết tự động nào khác không(Công thức chẳng hạn).
Em xin cảm ơn!
Mã:
Option Explicit


Public Sub DanhSTT()
Dim i As Long, cll As Range
    For Each cll In Selection
        If cll = "" Then
            i = i + 1
            cll = i
        End if
        Next cll
End Sub
Câu 1: Tôi lấy ví dụ: Lúc chưa chạy code thì các ô A3, A4, A5 đều trống (Cll="") nên khi chọn vùng A1:A20 và chạy code, chúng sẽ được gán lần lượt các giá trị 3, 4, 5, và tất nhiên là câu lệnh i = i + 1 đều được thực thi (tuy nhiên chỉ có ô đầu của vùng đã merge là A3 được giữ giá trị lại). Do đó khi Cll là ô A6 thì i đã có giá trị là 6, chính vì vậy mà sau khi chạy code, ô A6 có giá trị là 6.

Câu 2: Một code để tham khảo như sau (có thể còn luộm thuộm và chưa hay nhưng giải quyết được vấn đề):
[GPECODE=vb]Sub DanhSTT1()
Dim i As Long, Cll As Range
Set Cll = Selection(1, 1)
Do While Cll.Row < Selection.Row + Selection.Rows.Count
i = i + 1
Cll = i
Set Cll = Cll.Offset(1)
Loop
End Sub[/GPECODE]

Câu 3: Tôi bó tay!
 
Upvote 0
Câu 1: Tôi lấy ví dụ: Lúc chưa chạy code thì các ô A3, A4, A5 đều trống (Cll="") nên khi chọn vùng A1:A20 và chạy code, chúng sẽ được gán lần lượt các giá trị 3, 4, 5, và tất nhiên là câu lệnh i = i + 1 đều được thực thi (tuy nhiên chỉ có ô đầu của vùng đã merge là A3 được giữ giá trị lại). Do đó khi Cll là ô A6 thì i đã có giá trị là 6, chính vì vậy mà sau khi chạy code, ô A6 có giá trị là 6.

Câu 2: Một code để tham khảo như sau (có thể còn luộm thuộm và chưa hay nhưng giải quyết được vấn đề):
[GPECODE=vb]Sub DanhSTT1()
Dim i As Long, Cll As Range
Set Cll = Selection(1, 1)
Do While Cll.Row < Selection.Row + Selection.Rows.Count
i = i + 1
Cll = i
Set Cll = Cll.Offset(1)
Loop
End Sub[/GPECODE]

Câu 3: Tôi bó tay!
Code rất hay. Đã giải quyết được vấn đề rồi, cảm ơn anh Phúc nhiều lắm! Em loay hoay từ sáng tới giờ mà chưa nghĩ ra cách giải quyết!

Câu 2: Một code để tham khảo như sau (có thể còn luộm thuộm và chưa hay nhưng giải quyết được vấn đề):
[GPECODE=vb]Sub DanhSTT1()
Dim i As Long, Cll As Range
Set Cll = Selection(1, 1)
Do While Cll.Row < Selection.Row + Selection.Rows.Count
i = i + 1
Cll = i
Set Cll = Cll.Offset(1)
Loop
End Sub[/GPECODE]
Mong anh giải thích giúp em ý nghĩa của đoạn code này với ạ! Cảm ơn anh!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Công thức của Mr.Bum cho kết quả đúng trong trường hợp ô A1 không bị Merge nếu A1 bị merge thì cũng bị sai.

Giải pháp công thức thì chỉ còn cách đó thôi, nếu A1:A2 bị Merge thì A1 gõ 1, chọn A3:An và gõ =MAX(A$1:A2)+1, Ctrl+Enter. Cứ vậy mà quét chọn vùng và sửa công thức nếu ô đầu Merge nhiều ô.
 
Upvote 0
Ở cột A em có các ô bị Merge(vùng màu xanh). Em thử viết code để đánh số thự tự 1 cách tự đông liên tục(Xem File đính kèm) nhưng kết quả không chính xác(Các số TT không liên tục). Em xin hỏi các anh chị 3 vấn đề như sau:
+ Code em bị sai ở đâu? Cách khắc phục?
+ Nếu các ô đã bị Merge như vậy thì có thể dùng code để giải quyết không? Nếu có cho em xin code tham khảo?
+ Nếu không thể dùng code thi có cách giải quyết tự động nào khác không(Công thức chẳng hạn).
Em xin cảm ơn!
Mã:
Option Explicit


Public Sub DanhSTT()
Dim i As Long, cll As Range
    For Each cll In Selection
        If cll = "" Then
            i = i + 1
            cll = i
        End if
        Next cll
End Sub

Bài này dùng code đơn giản mà. Kể cả Merge cell tại A1 cũng chỉ cần for next trong cái Selection là được. Chỉ cần 3 dòng code. Thử đi. Bảo đảm ngắn hơn code bài số 2
 
Lần chỉnh sửa cuối:
Upvote 0
Bài này dùng code đơn giản mà. Kể cả Merge cell tại A1 cũng chỉ cần for next trong cái Selection là được. Chỉ cần 3 dòng code. Thử đi. Bảo đảm ngắn hơn code bài số 2
Quả thật em nghĩ hoài không sao ra code chỉ có 3 dòng.
Anh xem thử:
Option Explicit
Public Sub danh_stt()
Dim i As Long, Cll As Range
Set Cll = Selection(1, 1)
For i = 1 To Selection.Rows.Count
If Cll.Row < Selection.Rows.Count Then
Cll = i
Set Cll = Cll.Offset(1)
End If
Next i
End Sub
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Bài này dùng code đơn giản mà. Kể cả Merge cell tại A1 cũng chỉ cần for next trong cái Selection là được. Chỉ cần 3 dòng code. Thử đi. Bảo đảm ngắn hơn code bài số 2

Thật sự không biết 3 dòng code của QuangHai thế nào chứ mình nghĩ code của NghiaPhuc là đã OK rồi còn muốn for next thì e phải lồng hàm if vào

[GPECODE=vb]
Sub Test1()
Dim i As Long, Cll As Range
Dim k As Long
Set Cll = Selection(1, 1)
For i = 1 To Selection.Rows.Count
If Cll.Row < Selection.Rows.Count Then
k = k + 1
Cll = k
Set Cll = Cll.Offset(1)
End If
Next
End Sub


[/GPECODE]
 
Upvote 0
Giống code của bài số 9, nhưng nếu thêm vài cái dấu ":" thì chỉ còn có 1 dòng code à nha.
PHP:
Sub abc()
Dim cell As Range
For Each cell In Selection
    cell = Application.Max(Selection) + 1
Next
End Sub
 
Upvote 0

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

Back
Top Bottom