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.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.
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
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]
[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]
Chào bạntruong.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.
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
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"
TDNMã: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
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 AnhTuanVNUNI đã 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
Bạn có thể nhập công thức này vào ô A2, sau đó copy xuốngtruong.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
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
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ốngtruong.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
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