Đổi dạng công thức sang dạng Code VBA (1 người xem)

Liên hệ QC

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

a.nguoidensau

Thành viên hoạt động
Tham gia
12/4/12
Bài viết
138
Được thích
28
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.
 
Lần chỉnh sửa cuối:
/(hông viết dùm bạn đâu, chỉ hướng thôi nghen!

[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

Chúc bạn có kết quả VBA ngày càng mĩ mãn!
 
Upvote 0
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.
Mã:
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:
 
Upvote 0

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

Back
Top Bottom