Đánh số thứ tự tự động (10 người xem)

Liên hệ QC

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

nguyenducbac

Thành viên mới
Tham gia
11/3/08
Bài viết
16
Được thích
0
Mình có bài toán nho nhỏ xin hỏi các cao thủ xíu, bài toán như sau:
Có 3 cột A, B, C. Cột A mang tên: họ và tên, cột B: số tiền ủng hộ, cột C: thứ tự ủng hộ.
Mình muốn mỗi khi có người ủng hộ, mình nhập số tiền vào cột B tự khắc cột C nhẩy số thể hiện đó là người thứ bao nhiêu ủng hộ.
Có thể không dùng VBA được không?
Cám ơn các bác trước.
 
Mình có bài toán nho nhỏ xin hỏi các cao thủ xíu, bài toán như sau:
Có 3 cột A, B, C. Cột A mang tên: họ và tên, cột B: số tiền ủng hộ, cột C: thứ tự ủng hộ.
Mình muốn mỗi khi có người ủng hộ, mình nhập số tiền vào cột B tự khắc cột C nhẩy số thể hiện đó là người thứ bao nhiêu ủng hộ.
Có thể không dùng VBA được không?
Cám ơn các bác trước.

Cái này thì dùng hàm đếm là được thôi!Bạn xem file thử nhé!
 

File đính kèm

Đây là cách dùng VBA, bạn xem file, nhập tên vào cột A, STT sẽ nhảy.
 

File đính kèm

Lần chỉnh sửa cuối:
- Rất cám ơn bạn nhưng ý mình là như thế này nè bạn.
 

File đính kèm

- Rất cám ơn bạn nhưng ý mình là như thế này nè bạn.

Tạm thời có cách này, chưa hoàn thiện, mọi người cải tiến thêm.

Bạn lưu ý trình tự như sau :
Nhập hết tên người ủng hộ, nhập số tiền đến đâu, STT sẽ hiện đến đó.

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Not Intersect(Target, [B:B]) Is Nothing Then _
        Target.Offset(, 1) = WorksheetFunction.Max(Range("C:C")) + 1
    End
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn xem thử File đính kèm.
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn xem thử File đính kèm.

Em Test thấy có mấy điểm như sau :
- Nếu mình nhập số tiền vô liên tục, VD : [E5]=1, [E6]=4 thì STT không nhảy.
- Nếu nhập sai số tiền muốn sửa lại thì STT cũng bị thay đổi theo.

Hic, em thấy bài này chẳng dễ chút nào +-+-+-++-+-+-++-+-+-+
 
Mình có bài toán nho nhỏ xin hỏi các cao thủ xíu, bài toán như sau:
Có 3 cột A, B, C. Cột A mang tên: họ và tên, cột B: số tiền ủng hộ, cột C: thứ tự ủng hộ.
Mình muốn mỗi khi có người ủng hộ, mình nhập số tiền vào cột B tự khắc cột C nhẩy số thể hiện đó là người thứ bao nhiêu ủng hộ.
Có thể không dùng VBA được không?
Cám ơn các bác trước.
Yêu cầu này không dùng VBA không thực hiện được.

Em Test thấy có mấy điểm như sau :
- Nếu mình nhập số tiền vô liên tục, VD : [E5]=1, [E6]=4 thì STT không nhảy.
- Nếu nhập sai số tiền muốn sửa lại thì STT cũng bị thay đổi theo.

Hic, em thấy bài này chẳng dễ chút nào +-+-+-++-+-+-++-+-+-+
Code của bạn nếu nhập sai, sửa lại STT cũng chạy sai luôn.
Sửa lại thế này thử xem.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Intersect(Target, [B:B]) Is Nothing Or Target.Cells.Count > 1 Then Exit Sub
    If Target.Offset(, 1).Value = "" Then
        Target.Offset(, 1) = WorksheetFunction.Max(Range("C:C")) + 1
    End If
End Sub
 

File đính kèm

Em Test thấy có mấy điểm như sau :
- Nếu mình nhập số tiền vô liên tục, VD : [E5]=1, [E6]=4 thì STT không nhảy.
- Nếu nhập sai số tiền muốn sửa lại thì STT cũng bị thay đổi theo.

Hic, em thấy bài này chẳng dễ chút nào +-+-+-++-+-+-++-+-+-+

1. Nhập số tiền vô liên tục Stt không nhảy là lỗi do mình quét theo Areas, đúng ra là phải quét theo Cell. Đã sửa lại file đính kèm bài trên.
2. Nếu nhập sai số tiền muốn sửa lại thì STT cũng bị thay đổi theo là đúng mà nếu không thì lấy gì để phân biệt trước sau. Trường hợp này không thể cẩu thả được (giống như đi tàu xe nhỡ chuyến này thì phải đi chuyến sau thôi).

Mình cũng chưa làm kiểu này bao giờ, tham gia là để ôn luyện và học hỏi thêm vì vậy không thành công trong việc này thì cũng củng cố và mở rộng thêm kiến thức (mọi cái khó đều do ta chưa biết mà thôi).
 
Các bạn dùng Worksheet_Change nhưng lại quên 1 điểm quan trọng: Nếu người ta không nhập mà copy, Paste thì sao? ---> Ví dụ: 10 dòng liên tiếp ta nhập 1 số tiền giống nhau, lý nào các bạn bắt người dùng phải nhập từng cell? Họ cóc thèm xài code của bạn đâu nha
Ẹc... Ẹc...
Tôi thì dùng code này:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Range("B2:B65536"), Target) Is Nothing Then
    Range("C2:C65536").ClearContents
    With Range([B2], [B65536].End(xlUp))
      .Offset(, 1).Value = "=IF(RC[-1]="""","""",Max(R1C:R[-1]C)+1)"
      .Offset(, 1).Value = .Offset(, 1).Value
    End With
  End If
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Các bạn dùng Worksheet_Change nhưng lại quên 1 điểm quan trọng: Nếu người ta không nhập mà copy, Paste thì sao? ---> Ví dụ: 10 dòng liên tiếp ta nhập 1 số tiền giống nhau, lý nào các bạn bắt người dùng phải nhập từng cell? Họ cóc thèm xài code của bạn đâu nha
Ẹc... Ẹc...
Tôi thì dùng code này:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Range("B2:B65536"), Target) Is Nothing Then
    Range("C2:C65536").ClearContents
    With Range([B2], [B65536].End(xlUp))
      .Offset(, 1).Value = "=IF(RC[-1]="""","""",Max(R1C:R[-1]C)+1)"
      .Offset(, 1).Value = .Offset(, 1).Value
    End With
  End If
End Sub
Bạn xem lại yêu cầu của tác giả nha. Người ủng hộ trước không có nghĩa là được nhập ở trên. Nếu như làm theo cách của bạn thì dùng công thức được rồi, đâu cần VBA đâu. Muốn nhập cùng lúc nhiều ô cũng được. Đâu có khó.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Intersect(Target, [B:B]) Is Nothing Then Exit Sub
        For Each Cll In Intersect(Target, [B:B])
            If Cll.Offset(, 1).Value = "" Then
                Cll.Offset(, 1).Value = WorksheetFunction.Max([C:C]) + 1
            End If
        Next
End Sub
 
Các bạn dùng Worksheet_Change nhưng lại quên 1 điểm quan trọng: Nếu người ta không nhập mà copy, Paste thì sao? ---> Ví dụ: 10 dòng liên tiếp ta nhập 1 số tiền giống nhau, lý nào các bạn bắt người dùng phải nhập từng cell? Họ cóc thèm xài code của bạn đâu nha
Ẹc... Ẹc...
Tôi thì dùng code này:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Range("B2:B65536"), Target) Is Nothing Then
    Range("C2:C65536").ClearContents
    With Range([B2], [B65536].End(xlUp))
      .Offset(, 1).Value = "=IF(RC[-1]="""","""",Max(R1C:R[-1]C)+1)"
      .Offset(, 1).Value = .Offset(, 1).Value
    End With
  End If
End Sub

Thế này không đúng yêu cầu của tác giả rồi anh ạ, số tiền của người nào nhập vào sau thì STT của người đó phải là lớn nhất.
 
Bạn xem lại yêu cầu của tác giả nha. Người ủng hộ trước không có nghĩa là được nhập ở trên. Nếu như làm theo cách của bạn thì dùng công thức được rồi, đâu cần VBA đâu. Muốn nhập cùng lúc nhiều ô cũng được. Đâu có khó.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Intersect(Target, [B:B]) Is Nothing Then Exit Sub
        For Each Cll In Intersect(Target, [B:B])
            If Cll.Offset(, 1).Value = "" Then
                Cll.Offset(, 1).Value = WorksheetFunction.Max([C:C]) + 1
            End If
        Next
End Sub
Người ủng hộ trước không có nghĩa là được nhập ở trên ---> Cái này thì hơi bị kỳ ...
Mà cho dù là bạn nhận định thế thì ... ---> Chẳng lẽ nhập xong không cho người ta sửa lại à? (ví dụ như nhập nhầm và người ta xóa đi) ---> Bạn kiểm tra thử trường hợp này trong code của bạn!
Để "rào" hết tất cả mọi trường hợp là điều không thể nào ---> Có điều tôi không nghĩ rằng người ũng hộ sau lại nhập trên người ũng hộ trước ----> Nó làm cho bảng tính trở lên quá lượm thượm
 
Lần chỉnh sửa cuối:
Người ủng hộ trước không có nghĩa là được nhập ở trên ---> Cái này thì hơi bị kỳ ...
Mà cho dù là bạn nhận định thế thì ... ---> Chẳng lẽ nhập xong không cho người ta sửa lại à? (ví dụ như nhập nhầm và người ta xóa đi) ---> Bạn kiểm tra thử trường hợp này trong code của bạn!
Để "rào" hết tất cả mọi trường hợp là điều không thể nào ---> Có điều tôi không nghĩ rằng người ũng hộ sau lại nhập trên người ũng hộ trước ----> Nó làm cho bảng tính trở lên quá lượm thượm
Xem file và yêu cầu của tác giả trong bài #4 bạn sẽ hiểu tác giả cần gì. Ví dụ bạn có sẵn một danh sách nhân viên trong công ty. Bây giờ ai ủng hộ thì tìm tên và nhập số tiền vào. Không có gì là vô lý và lượm thượm cả. Sẽ đỡ mất thời gian hơn là ai ủng hộ mới nhập tên, số tiền vào. Vì biết trước danh sách những người sẽ ủng hộ. Còn nếu ai ủng hộ trước nhập tên trước thì hàm Counta() ở bài #2 đã giải quyết yêu cầu nay.

Rào hết các trường hợp không có nghĩa là phải rào cả trường hợp sai do người dùng. Muốn sửa khi người ta nhập nhầm thì cũng được thôi. Nhưng như thế sẽ ảnh hưởng đến tốc độ. Vậy tại sao không cẩn thận một chút khi nhập liệu.
 
Người ủng hộ trước không có nghĩa là được nhập ở trên ---> Cái này thì hơi bị kỳ ...
Mà cho dù là bạn nhận định thế thì ... ---> Chẳng lẽ nhập xong không cho người ta sửa lại à? (ví dụ như nhập nhầm và người ta xóa đi) ---> Bạn kiểm tra thử trường hợp này trong code của bạn!
Để "rào" hết tất cả mọi trường hợp là điều không thể nào ---> Có điều tôi không nghĩ rằng người ũng hộ sau lại nhập trên người ũng hộ trước ----> Nó làm cho bảng tính trở lên quá lượm thượm

Cái yêu cầu bị kỳ đó tác giả có yêu cầu ở bài số 4 đó thầy NDU ơi!Em cũng thấy rất kỳ và rõ ràng là tự làm khó mình nhưng mọi người cố gắng giải để làm đề tài nâng cao trình độ cũng hay!Đã vậy lại còn yêu cầu không dùng code nữa đó!!$@!!Em có từng nghĩ qua là dùng hàm rank để xếp hạng theo thời gian nhập giá trị tiền ủng hộ nhưng cái vụ thời gian nhập giá trị này không biết dùng cách nào để gọi.Thầy có thể giúp với ý tưởng này được không?
 
Có điều tôi không nghĩ rằng người ũng hộ sau lại nhập trên người ũng hộ trước ----> Nó làm cho bảng tính trở lên quá lượm thượm

Em nghĩ thế này, danh sách tên đã có, ví dụ đó là ds cán bộ trong Cty, ai cũng phải có nghĩa vụ đóng góp tiền, người nào đóng trước thì nhập tiền vào cho người ta, lúc này cột STT sẽ hiện số thứ tự đóng tiền của người đó.
 
Cái yêu cầu bị kỳ đó tác giả có yêu cầu ở bài số 4 đó thầy NDU ơi!Em cũng thấy rất kỳ và rõ ràng là tự làm khó mình nhưng mọi người cố gắng giải để làm đề tài nâng cao trình độ cũng hay!Đã vậy lại còn yêu cầu không dùng code nữa đó!!$@!!Em có từng nghĩ qua là dùng hàm rank để xếp hạng theo thời gian nhập giá trị tiền ủng hộ nhưng cái vụ thời gian nhập giá trị này không biết dùng cách nào để gọi.Thầy có thể giúp với ý tưởng này được không?
Thời gian nhập liệu ở đâu mà có? Không lẽ bạn dùng Now()??? Không VBA không được.
 
Xem yêu cầu tại bài #4, tôi cải tiến thế này:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Clls As Range, k As Long
  If Not Intersect(Range("B2:B65536"), Target) Is Nothing Then
    Range([B65536].End(xlUp).Offset(1, 1), [C65536]).ClearContents
    For Each Clls In Target
      k = Evaluate("Max(C:C)")
      If Clls = "" Then
        Clls(, 2) = ""
      Else
        Clls(, 2) = k + 1
      End If
    Next Clls
  End If
End Sub
Các bạn test lại giùm! ---> Cho phép nhập nhầm có thể xóa sửa ---> Đương nhiên lúc này nhập sau sẽ có số TT lớn nhất
 

File đính kèm

Lần chỉnh sửa cuối:
Thời gian nhập liệu ở đâu mà có? Không lẽ bạn dùng Now()??? Không VBA không được.

Dĩ nhiên là không dùng hàm now được rồi!Nếu dùng VBA thì ý tưởng này cũng có thể giải quyết được vấn đề sửa giá trị sẽ không ảnh hưởng j.Tuy nhiên lại phải có cột phụ!
@thầy NDU: Code của thầy bị sai khi sửa lại số tiền ủng hộ rồi!KHi sửa thì thứ tự không thay đổi mới đúng ý đồ chứ!
 
Lần chỉnh sửa cuối:
@thầy NDU: Code của thầy bị sai khi sửa lại số tiền ủng hộ rồi!KHi sửa thì thứ tự không thay đổi mới đúng ý đồ chứ!
Như tôi nói ở trên: Sửa đồng nghĩa với nhập mới, STT sẽ thay đổi theo
Nếu bạn muốn STT này không đổi (tức đã có thỉ giũ nguyên) cũng làm được
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Clls As Range, k As Long
  If Not Intersect(Range("B2:B65536"), Target) Is Nothing Then
    Range([B65536].End(xlUp).Offset(1, 1), [C65536]).ClearContents
    For Each Clls In Target
      k = Evaluate("Max(C:C)")
      If Clls = "" Then
        Clls(, 2) = ""
      ElseIf Clls(, 2) = "" Then
        Clls(, 2) = k + 1
      End If
    Next Clls
  End If
End Sub
Vận cho phép xóa (xóa cột B thì cột C xóa theo)
 

File đính kèm

Web KT

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

Trả lời
42
Đọc
17K
Back
Top Bottom