Xin chào tất cả các anh các chị
Chả là tôi đang tìm hiểu về VBA, nên muốn chuyển từ dạng công thức sang Code VBA ( có File kèm theo), tôi nghĩ bài này dùng cấu trúc lệnh For...,nhưng chưa biết cách vận dụng. Vì vậy tôi nhờ mọi người viết Code giùm. Hơn nữa trong tháng dòng nào không có số liệu thì ẩn đi. Xin cảm ơn mọi người.
[ThongBao]
Chả là tôi đang tìm hiểu về VBA, nên muốn chuyển từ dạng công thức sang Code VBA ( có File kèm theo),
(1) Tôi nghĩ bài này dùng cấu trúc lệnh For...,nhưng chưa biết cách vận dụng. Vì vậy tôi nhờ mọi người viết Code giùm.
(2) Hơn nữa trong tháng dòng nào không có số liệu thì ẩn đi. Xin cảm ơn mọi người.[/Thongbao]
(1)
(A) Ghi 1 công thức tính tổng cho duy nhất 1 ô:
A.1 Bật mở bộ thu macro lên;
A.1.1 Ta gán tên macro là "Sum1", nếu VBA có hỏi.
A.2 Chọn ô [AB3] & bấm chuột lên thanh công thức;
A.3 Nhập lên thanh này chuỗi "=Sum(B3:Y3)" & nhấn {enter}
A.4 Kết thúc quá trình thu macro bằng cách nào đó mà bạn đã biết;
Nội dung chủ yếu của macro sẽ là như sau:
PHP:
Sub Sum1() 'Macro 1'
Range("AB3").Select
ActiveCell.FormulaR1C1 = "=SUM(RC[-26]:RC[-3])"
Range("AB4").Select
End Sub
(B) Ghi số liệu tổng của vùng vô cho 1 ô
Bạn tham khảo macro không thể tự ghi như sau:
Mã:
[B]Sub Sum2()[/B] [COLOR="#0000CD"]'Macro 2'[/COLOR]
Dim WF As Object, Rng As Range
Set WF = Application.WorksheetFunction
[AC3].Value = WF.Sum([B3].Resize(, 24))
[B]End Sub[/B]
Khi ta ghi macro 1, tại ô kích hoạt ta có công thức tính tổng của 1 vùng ô, giống như trong file của bạn;
Ở macro 2, ô được kích hoạt chỉ ghi lại giá trị của tổng đó mà thôi
Hai cái này có ưu nhược điểm khác nhau;
Cái đầu sẽ bất tiện khi trang tính quá nhiều dòng (có nghĩa là quá nhiều công thức lặc lè);
Nhưng ngược lại, ta sẽ gán xuống các ô dưới 1 cách nhanh hơn nhờ fương thức FillDown (chuyện này nhường bạn đó nha; Bạn thử ghi 1 macro áp dụng FillDown cho cột [AB] này xem sao)
Cái macro sau ta sẽ ghi kết quả xuống dưới bằng cách duyệt từng ô một cho đến hết
(& như vậy mình cảm giác sẽ chậm hơn cách bên trên. Nhưng bù lại trang tính ít năng nề hơn.)
Để nghiên cứu cách thức duyệt từng ô trong cột, bạn tham khảo 1 cách có trong macro dẫn ra dưới đây;
(2) Bạn thử diễn dịch các dòng lệnh này xem sao:
PHP:
Sub TìmTri0CuaVùng()
Dim Cls As Range, hRg As Range
For Each Cls In [z3].Resize(31)
If Cls.Value = 0 Then
If hRg Is Nothing Then
Set hRg = Cls.EntireRow
Else
Set hRg = Union(hRg, Cls.EntireRow)
End If
End If
Next Cls
If Not hRg Is Nothing Then MsgBox hRg.Address
End Sub
Xin chào tất cả các anh các chị
Chả là tôi đang tìm hiểu về VBA, nên muốn chuyển từ dạng công thức sang Code VBA ( có File kèm theo), tôi nghĩ bài này dùng cấu trúc lệnh For...,nhưng chưa biết cách vận dụng. Vì vậy tôi nhờ mọi người viết Code giùm( Viết code cho dòng Cộng cả tháng,Trung bình tháng,Cột Tổng cả ngày, Trung bình ngày). Hơn nữa trong tháng dòng nào không có số liệu thì ẩn đi. Xin cảm ơn mọi người.
Sub Tinh()
Dim i As Long, j As Long, dem As Long
Dim arrDL
arrDL = Sheet9.Range("B3:AA35")
For i = 1 To UBound(arrDL)
arrDL(i, 25) = 0
arrDL(i, 26) = 0
dem = 0
For j = 1 To 24
If arrDL(i, j) > 0 Then
arrDL(i, 25) = arrDL(i, 25) + arrDL(i, j)
dem = dem + 1
End If
Next
If dem > 0 Then
arrDL(i, 26) = arrDL(i, 25) / dem
End If
Next
For i = 1 To UBound(arrDL, 2)
arrDL(32, i) = 0
arrDL(33, i) = 0
dem = 0
For j = 1 To 31
If arrDL(j, i) > 0 Then
arrDL(32, i) = arrDL(32, i) + arrDL(j, i)
dem = dem + 1
End If
Next
If dem > 0 Then
arrDL(33, i) = arrDL(32, i) / dem
End If
Next
Sheet9.Range("B3:AA35").Value = arrDL
End Sub
Bạn có thể tham khảo code trên cho phần tính tổng và trung bình: