Hỏi về hàm CountIf và Max trong VBA (1 người xem)

Liên hệ QC

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

anhtotbung35

Thành viên hoạt động
Tham gia
16/2/09
Bài viết
149
Được thích
26
Nghề nghiệp
Kế toán
Trong Excell Sheet "Baocao" mình có công thức cho các cell như sau:
Cell C4=COUNTIF($J$4:$J4;$J4))=1)*(MAX(C$3:C3)+1))
Cell C5=COUNTIF($J$4:$J5;$J5))=1)*(MAX($C$3:C4)+1))
Cell C5=COUNTIF($J$4:$J6;$J6))=1)*(MAX($C$3:C5)+1))
Cell C6=...
Cho mình hỏi trong VBA viết code như thế nào cho các dòng ở cột C?
 
Trong Excell Sheet "Baocao" mình có công thức cho các cell như sau:
Cell C4=COUNTIF($J$4:$J4;$J4))=1)*(MAX(C$3:C3)+1))
Cell C5=COUNTIF($J$4:$J5;$J5))=1)*(MAX($C$3:C4)+1))
Cell C5=COUNTIF($J$4:$J6;$J6))=1)*(MAX($C$3:C5)+1))
Cell C6=...
Cho mình hỏi trong VBA viết code như thế nào cho các dòng ở cột C?
Không có công thức nào COUNTIF($J$4:$J4;$J4))=1)*(MAX(C$3:C3)+1)) như thế này cả (cả bên excel). Phải chăng Bạn muốn lọc dữ liệu trùng và đánh số thứ tự bằng hàm IF?
Mã:
Cells(4,3).FormulaR1C1 = "=IF(COUNTIF(R4C10:RC10,RC10)=1,(MAX(R3C:R[-1]C)+1),"""")"
 ActiveCell.Offset(1).Select
 
Upvote 0
Không có công thức nào COUNTIF($J$4:$J4;$J4))=1)*(MAX(C$3:C3)+1)) như thế này cả (cả bên excel). Phải chăng Bạn muốn lọc dữ liệu trùng và đánh số thứ tự bằng hàm IF?
Mã:
Cells(4,3).FormulaR1C1 = "=IF(COUNTIF(R4C10:RC10,RC10)=1,(MAX(R3C:R[-1]C)+1),"""")"
ActiveCell.Offset(1).Select
Đúng như bạn nói, lọc dữ liệu trùng ở cột J và đánh số thứ tự ở cột C. Nhưng công thức trong Excell mình vẫn chạy bình thường. Công thức đầy đủ là:
C4=IF(J4="";"";(J4<>"")*((COUNTIF($J4:$J$4;$J4))=1)*(MAX($C$3:C3)+1))
C5=IF(J5="";"";(J5<>"")*((COUNTIF($J$4:$J5;$J5))=1)*(MAX($C$3:C4)+1))

Cho mình hỏi thêm trong code của bạn Cells(4,3), nghĩa là Cell C4, có phải ActiveCell.Ofset(1).Select là thực hiện chọn ô C5 và tiếp tục cho ô phía dưới của cột C không. Mình muốn sau khi Cells(4,3) tính xong công thức và gán giá trị tính được là .Value và tiếp tục cho ô dưới thì phải làm thế nào? Mình viết thế này có đúng không:
Cells(4,3).FormulaR1C1 = "=IF(COUNTIF(R4C10:RC10,RC10)=1,(MAX(R3C:R[-1]C)+1),"""")"
Cells(4,3).Value = Cells(4,3).Value
ActiveCell.Offset(1).Select
 
Upvote 0
Cảm ơn bạn, sau khi mình nghiêu cứu và viết như thế này:
With Sheets("BCT")
i = xlLastRow([BCT!D:D])'dòng cuối của bảng tính
If i < 4 Then i = 4 'dòng bắt đầu đặt công thức
.Range("BCT!C4:C" & i).FormulaR1C1 = "=If(COUNTIF(R4C10:RC10,RC10)=1,(MAX(R3C:R[-1]C)+1),"""")"
.Range("BCT!C4:C" & i).Value = .Range("BCT!C4:C" & i).Value
End With
 
Upvote 0
Cho mình hỏi thêm trong code của bạn Cells(4,3), nghĩa là Cell C4, có phải ActiveCell.Ofset(1).Select là thực hiện chọn ô C5 và tiếp tục cho ô phía dưới của cột C không. Mình muốn sau khi Cells(4,3) tính xong công thức và gán giá trị tính được là .Value và tiếp tục cho ô dưới thì phải làm thế nào? Mình viết thế này có đúng không:
Cells(4,3).FormulaR1C1 = "=IF(COUNTIF(R4C10:RC10,RC10)=1,(MAX(R3C:R[-1]C)+1),"""")"
Cells(4,3).Value = Cells(4,3).Value
ActiveCell.Offset(1).Select
Đúng rồi đó Bạn, số 4 thể hiện dòng bắt đầu đánh số thứ tự, số 3 thể hiện cột C.
Mã:
Sub STT()
Dim i, endR As Long
  With Sheets("BCT")
   endR = .[D65536].End(xlUp).Row
     For i = 4 To endR
      .Cells(i, 3).FormulaR1C1 = "=IF(COUNTIF(R4C10:RC10,RC10)=1,(MAX(R3C:R[-1]C)+1),"""")"
      .Cells(i, 3).Value = .Cells(i, 3).Value
      .Cells(i, 3).Offset(1).Select
     Next
  End With
End Sub
 
Upvote 0
Đúng rồi đó Bạn, số 4 thể hiện dòng bắt đầu đánh số thứ tự, số 3 thể hiện cột C.
Mã:
Sub STT()
Dim i, endR As Long
  With Sheets("BCT")
   endR = .[D65536].End(xlUp).Row
     For i = 4 To endR
      .Cells(i, 3).FormulaR1C1 = "=IF(COUNTIF(R4C10:RC10,RC10)=1,(MAX(R3C:R[-1]C)+1),"""")"
      .Cells(i, 3).Value = .Cells(i, 3).Value
      .Cells(i, 3).Offset(1).Select
     Next
  End With
End Sub
Chú ý:
- Dùng FormulaR1C1 thì chẳng cần For.. Next đâu nha ---> Có thể gán công thức cho nguyên cột 1 lần luôn! Xem code tại đây mà áp dụng: http://www.giaiphapexcel.com/forum/...à-thu-gọn-code-tính-điểm.&p=249081#post249081
- Không hiểu .Cells(i, 3).Offset(1).Select để làm giống gì
Sửa lại:
PHP:
Sub STT()
  With Range(Sheets("BCT").[C4], Sheets("BCT").[D65536].End(xlUp).Offset(, -1))
    .FormulaR1C1 = "=IF(COUNTIF(R4C10:RC10,RC10)=1,(MAX(R3C:R[-1]C)+1),"""")"
    .Value = .Value
  End With
End Sub
Không vòng lập, cũng không có biến nào luôn!
 
Lần chỉnh sửa cuối:
Upvote 0
Các anh/chị cho em hỏi với.
Em cần lấy giá trị theo hàm MATCH("abc",$A$1:$A$100,0) ở sheet 1 vào biến s thì dùng hàm như thế nào trong vba ạ?

Em cảm ơn nhiều!
 
Upvote 0
Sub Ma()
TMP = WorksheetFunction.Match("abc", Sheet1.[A1:A100], 0)
MsgBox TMP
End Sub

Bài này người ta dùng Find Method sẽ hay hơn
Mã:
Sub Ma()
  Dim rFind As Range
  Set rFind = Sheet1.Range("A1:A100").Find("abc", , xlValues, xlWhole)
  If Not rFind Is Nothing Then MsgBox rFind.Row
End Sub
WorksheetFunction chỉ nên dùng trong 1 số trường hợp bất khả kháng mà thôi.
Ngoài ra, code của bạn nếu không tìm thấy "abc" thì code sẽ báo lỗi đấy nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Giúp mình viết code này với: [TABLE="width: 745"]
[TR]
[TD="colspan: 9"]· Dùng ngôn ngữ lập trình VBA định nghĩa hàm CountHN_HU theo các yêu cầu sau:[/TD]
[/TR]
[TR]
[TD="colspan: 9"]Ø Hàm nhận vào 1 đối số: Số hành khách kiểu dữ liệu là Range[/TD]
[/TR]
[TR]
[TD="colspan: 9"]Ø Hàm trả về giá trị kiểu Byte với yêu cầu xử lý như sau: [/TD]
[/TR]
[TR]
[TD="colspan: 9"]Đếm xem có bao nhiêu ô trong cột số hành khách có số lượng từ 50 đến 100

[/TD]
[/TR]
[/TABLE]
 
Upvote 0
Giúp mình viết code này với:[TABLE="class: cms_table, width: 745"]
[TR]
[TD="colspan: 9"]· Dùng ngôn ngữ lập trình VBA định nghĩa hàm CountHN_HU theo các yêu cầu sau:[/TD]
[/TR]
[TR]
[TD="colspan: 9"]Ø Hàm nhận vào 1 đối số: Số hành khách kiểu dữ liệu là Range[/TD]
[/TR]
[TR]
[TD="colspan: 9"]Ø Hàm trả về giá trị kiểu Byte với yêu cầu xử lý như sau:[/TD]
[/TR]
[TR]
[TD="colspan: 9"]Đếm xem có bao nhiêu ô trong cột số hành khách có số lượng từ 50 đến 100[/TD]
[/TR]
[/TABLE]
 
Upvote 0
hi all! các bạn có thể giúp mình đếm dữ liệu ở cột B tương ứng với từng nhân viên được không? mình có gửi file điính kèm, thanks all.
 

File đính kèm

Upvote 0
Code:
Sub STT()
With Range(Sheet1.[B4], Sheet1.[B65536].End(xlUp).Offset(, 0))
.FormulaR1C1 = "=IF(RC4="""","""",COUNTIF(R4C3:RC3,RC3))"
.Value = .Value
End With
End Sub
Sao code này của em lại chạy từ B4 đến B1 chứ không phải từ B4 đến B65536 các anh chị nhỉ, sai chỗ nào ạ. Tiện thể cho em hỏi cách Post code lên diễn đàn, em là thành viên mới nên chưa biết ạ. Xin cảm ơn
 
Upvote 0
Code:
Sub STT()
With Range(Sheet1.[B4], Sheet1.[B65536].End(xlUp).Offset(, 0))
.FormulaR1C1 = "=IF(RC4="""","""",COUNTIF(R4C3:RC3,RC3))"
.Value = .Value
End With
End Sub
Sao code này của em lại chạy từ B4 đến B1 chứ không phải từ B4 đến B65536 các anh chị nhỉ, sai chỗ nào ạ. Tiện thể cho em hỏi cách Post code lên diễn đàn, em là thành viên mới nên chưa biết ạ. Xin cảm ơn
Bạn thử Code:
PHP:
Sub ABC()
    Dim LR As Long
    LR = Range("D" & Rows.Count).End(xlUp).Row
    Range("B4:B" & LR).Formula = "=IF(RC4="""","""",COUNTIF(R4C3:RC3,RC3))"
End Sub

+ Bạn muốn Post Code thì đọc bài viết này:
http://www.giaiphapexcel.com/forum/misc.php?do=bbcode

+ Mẹo nhỏ: Bạn Click vào " Trả Lời Với Trích Dẫn" ( Bài của thành viên khác) sẽ biết Code họ Post như thế nào nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Bài này người ta dùng Find Method sẽ hay hơn
Mã:
Sub Ma()
  Dim rFind As Range
  Set rFind = Sheet1.Range("A1:A100").Find("abc", , xlValues, xlWhole)
  If Not rFind Is Nothing Then MsgBox rFind.Row
End Sub
WorksheetFunction chỉ nên dùng trong 1 số trường hợp bất khả kháng mà thôi.
Ngoài ra, code của bạn nếu không tìm thấy "abc" thì code sẽ báo lỗi đấy nhé
Thầy ơi cho em hỏi, "WorksheetFunction chỉ nên dùng trong 1 số trường hợp bất khả kháng mà thôi" , nói chung nên hạn chế dùng nó là vì sao ạ ?
 
Upvote 0
Web KT

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

Back
Top Bottom