Các câu hỏi về hàm SUMIF

Liên hệ QC
Gởi Hiếu
Thoạt đầu mình cũng theo cách của Hiếu nhưng sau lại thôi vì trong công thức có bảng dò tìm. Nếu sau này ThanhTam có thay đổi giá trị nào đó trong bảng thì kết quả sẽ không còn chính xác nữa.

Thân !
 
Tôi chả hiểu tại sao hàm sumif của MS quá chuẩn rồi mà thanhtam lại cần VBA làm gì. MỘt lần công thức và copy là xong.
 
Ha ha, ừ nhỉ. Chỉ 1 lần copy công thức là xong, tội gì dùng đủ thứ. Hi hi
 
ThuNghi đã viết:
Tôi chả hiểu tại sao hàm sumif của MS quá chuẩn rồi mà thanhtam lại cần VBA làm gì. MỘt lần công thức và copy là xong.
các bạn nói phải, nghĩ thoáng qua có thể mình hỏi ngớ thật, nhưng trong trường hợp của mình không hiểu sao làm 1 bảng tính nặng máy ghê nên mình nghĩ nhờ VBA cho nhẹ bớt, và vì cột công thức đó tôi Hide nên mổi lần muốn copy phải Unhide bất tiện.
 
Lần chỉnh sửa cuối:
1':
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 7 Then Range("H" & Target.Row).Value = WorksheetFunction.SumIf(Range("B4:B30"), Range("G" & Target.Row), Range("C4:C30"))
End Sub
Mã:
2':
[B]Private Sub Worksheet_Change(ByVal Target As Range)[/B]
 If Target.Column = 7 Then Range("H" & Target.Row) = "=SUMIF($B$4:$B$30,G" & Target.Row & " ,$C$4:$C$30)"
[B]End Sub[/B]
/)/(ình xin hỏi các bạn một khía cạnh khác nữa: Tốc độ thực thi:
Nếu dùng phương thức Intersect có nhanh hơn không vậy?:
Mã:
[B]Private Sub Worksheet_Change(ByVal Target As Range)[/B]
 If not Intersect(Target, Range("G:G")) Is Nothing then  Range("H" & Target.Row) = "=SUMIF($B$4:$B$30,G" & Target.Row & " ,$C$4:$C$30)"
[B]End Sub[/B]
 
Viết Code tự động tính toán

Các bác kính mến.
Em chưa hiểu biết gì về VBA ,
EM cần các bác giúp viết một đoạn Code tự động tính toán khi nhập liệu
Yêu cầu rất đơn giản: Khi nhập dữ liệu vào cột A và cột B thì cột C sẽ tự động điền kết quả phép nhân A*B vào.
Các bác Xem file đính kèm nhé
 

File đính kèm

truong.japfa đã viết:
EM cần các bác giúp viết một đoạn Code tự động tính toán khi nhập liệu
Yêu cầu rất đơn giản: Khi nhập dữ liệu vào cột A và cột B thì cột C sẽ tự động điền kết quả phép nhân A*B vào.
Chào bạn
Bạn có thể sử dụng đoạn code này cho yêu cầu của mình, có bẫy lỗi khi dữ liệu nhập vào không phải Nuber thì cột C là "data error"
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Thoat
If Target.Column > 2 Then Exit Sub
Cells(Target.Row, 3).Value = Cells(Target.Row, 1).Value * Cells(Target.Row, 2).Value
Exit Sub
Thoat:
Cells(Target.Row, 3).Value = "data error"
End Sub
TDN
 
Cách dùng Worksheet_Change

tedaynui đã viết:
Chào bạn
Bạn có thể sử dụng đoạn code này cho yêu cầu của mình, có bẫy lỗi khi dữ liệu nhập vào không phải Nuber thì cột C là "data error"
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Thoat
If Target.Column > 2 Then Exit Sub
Cells(Target.Row, 3).Value = Cells(Target.Row, 1).Value * Cells(Target.Row, 2).Value
Exit Sub
Thoat:
Cells(Target.Row, 3).Value = "data error"
End Sub
TDN

Worksheet_Change là sự kiện được chạy khi có sự thay đổi về giá trị trên các ô, trong VBA khi ta gán thuộc tính Value=... Chính vì thế nếu trong sự kiện này mà gán Value =.... là chúng ta đã buộc Excel chạy sự kiện Worksheet_Change liên tục nhiêù lần cho một vấn đề. Tôi thường làm theo một nguyên tắc an toàn sau:

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Goto Done:
Dim bEvt As Boolean
bEvt = Application.EnableEvents ' Lưu trang thái trước
Application.EnableEvents = False 'Ngưng hoạt động của các sự kiện
....
....Value=....

...

Done:
Application.EnableEvents = bEvt ' Hoàn trả trạng thái cũ

End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Goto Done:
Dim bEvt As Boolean
bEvt = Application.EnableEvents ' Lưu trang thái trước
Application.EnableEvents = False 'Ngưng hoạt động của các sự kiện
....
....Value=....

...

Done:
Application.EnableEvents = bEvt ' Hoàn trả trạng thái cũ

End Sub

Cái này thì đúng quá rồi. Đơn giản thì không sao, hơi phức tạp thêm một chút là có vấn đề ngay

Giải pháp dùng Combobox thay Validation là một VD.

Cảm ơn bác nhiều.
 
TuanVNUNI đã viết:
Worksheet_Change là sự kiện được chạy khi có sự thay đổi về giá trị trên các ô, trong VBA khi ta gán thuộc tính Value=... Chính vì thế nếu trong sự kiện này mà gán Value =.... là chúng ta đã buộc Excel chạy sự kiện Worksheet_Change liên tục nhiêù lần cho một vấn đề. Tôi thường làm theo một nguyên tắc an toàn sau:

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Goto Done:
Dim bEvt As Boolean
bEvt = Application.EnableEvents ' Lưu trang thái trước
Application.EnableEvents = False 'Ngưng hoạt động của các sự kiện
....
....Value=....

...

Done:
Application.EnableEvents = bEvt ' Hoàn trả trạng thái cũ

End Sub
Chào Anh
Em vẫn biết trong những trường hợp thế này hoặc tương tự thì bảng tính sẽ làm việc liên tục --> bảng tính chậm hẳn. Nhưng vẫn không biết khắc phục thế nào. Giờ thì đã hiểu rõ hơn.
Cảm ơn Anh Tuân rất nhiều !

Thân!
 
Sao không viết giùm 1 đaọn code hoàn chỉnh luôn đi.
cách của TuanVNUNI + của tedaynui sẽ cho ra đoạn code thế nào.
Thông cảm nha, minh dở excel mà.

Thân chào
 
Thêm một kiểu đánh số TT và chuyển mã tự động

Cám ơn các bác đã trợ giúp cho em.
Em có một vấn đề nữa lại phiền các bác chỉ giáo đây.
Các bác xem file đính kèm hộ em nhé.
NVT
 

File đính kèm

truong.japfa đã viết:
Cám ơn các bác đã trợ giúp cho em.
Em có một vấn đề nữa lại phiền các bác chỉ giáo đây.
Các bác xem file đính kèm hộ em nhé.
NVT
Bạn có thể nhập công thức này vào ô A2, sau đó copy xuống
=IF(B2="","",COUNTA($B$2:B2))

TDN
 
Tự động nhập số TT theo DK

Chào bác
Không được mà bác, nó sẽ đánh số TT từ 1 đến bất kỳ.
Vấn đề ở đây là em cần đánh số TT theo DK sau:
1. Một Hóa đơn có thể có từ 1 đến tối đa 13 dòng trong đó thôi, nên cột E chỉ được đánh số từ 1 đến 13 và nếu hóa đơn có 1 mục thì chỉ đánh số 1, hóa đơn có 2 mục thì đánh số 2, ......, . Nếu HD có 13 mục thì đánh số đến 13.
2. Khi chuyển sang HD mới (số HD) ở cột C, thì quay lại đánh số 1, ....
3. Cột A đánh số theo ngày tháng, số HD và số mục trên HD đó. Ví dụ: Hóa đơn ngày 20/08/2007 có 2 hóa đơn là 15 và 16, trong HD số 15 sẽ có 13 mục hàng, số HD 16 chỉ có 1 mục hàng, cột A cần phân biệt thành:
39314.15.1,39314.15.2,39314.15.3,......, 39314.15.13
(Ở đây 39314 là ngày 20/08/07 ở dạng số), 15 là số HD 15, sau đó 1,2,...13 là các mục trong HD số 15.
Sang HD số 16 nó sẽ đánh số khác thành: 39314.16.1.
Yêu cầu của em có thể hơi rắc rối một chút.
Nhờ bác viết code dùm để không cần copy các công thức nữa
Chào bác
 
Bạn viêt thêm 1 hàm if vào nữa. Cụ thể ở ô A3 như sau:
=if(and(B3<>"",A2=13),1,if(B3="","",B2+1))
Tuy nhiên công thức này chỉ đánh số đúng khi các ô ở cột B là liên tục, không có ô trống xen giữa 2 ô có ký tự.
 
Chào bạn
Mình không rành mấy cái hoá đơn này lắm nên đọc thấy như đám rừng. Nhưng hiểu sau làm vậy. Bạn nhập công thức sau vào ô E2, sau đó copy xuống. Mong rằng được như ý bạn
=IF(OR(C2="",F2=""),"",COUNTIF($C$2:C2,C2))

TDN
 
Lần chỉnh sửa cuối:
Sau khi đánh số thứ tự ở cột E, bạn có thể dùng đoạn code sau để tạo mã ở cột A:
Sub taoma()
Dim iRow As Integer
For iRow = 2 To Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row - 1
Cells(iRow, 1) = Format(Cells(iRow, 2), "#####") & "." & Cells(iRow, 3) & "." & Cells(iRow, 5)
Next
Cells(1, 1).Select
End Sub
 
tạo mã với dữ liệu mới thôi

Cám ơn bác
Tuy nhiên bác chỉ giùm làm thế nào để nó chỉ tạo mã những dữ liệu vừa nhập vào?
Nếu không nó sẽ tính toán lại toàn bộ dữ liệu, sẽ tốn phí thời gian bác ạ!
NVT
 
truong.japfa đã viết:
Cám ơn bác
Tuy nhiên bác chỉ giùm làm thế nào để nó chỉ tạo mã những dữ liệu vừa nhập vào?
Nếu không nó sẽ tính toán lại toàn bộ dữ liệu, sẽ tốn phí thời gian bác ạ!
NVT
Sao bạn không dùng công thức. Mình nghĩ công thức cũng đáp ứng được yêu cầu của bạn mà. Nhập công thức tại ô A2, rồi copy xuống
=B2&"."&C2&"."&E2

TDN
 
Bạn thử dùng code dưới đây xem (cái này mới học được ở trên GPE đấy, hay ra phết).
Mã:
Sub worksheet_change(ByVal target As Range)
If target.Column >= 2 And target.Column <= 3 And target.Row > 1 Then
    If Cells(target.Row, 3) <> "" And Cells(target.Row, 3) <> Cells(target.Row - 1, 3) Then
        Cells(target.Row, 5) = 1
    Else: Cells(target.Row, 5) = Cells(target.Row - 1, 5) + 1
    End If
Cells(target.Row, 1) = Format(Cells(target.Row, 2), "#####") & "." & Cells(target.Row, 3) & "." & Cells(target.Row, 5)
End If
End Sub
 
Web KT

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

Back
Top Bottom