Giúp chuyển công thức sang macro (7 người xem)

Liên hệ QC

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

Cảm ơn bạn hyên nhiều nhưng môn toán hệ số 2 thì ta tính trung binh như thế nào?
có chí ít 2 cách sau:

(1) ta format cột tính trung bình này trước hay sau khi chạy macro;

(2) dùng lệnh format trong vba:
PHP:
clls.offset(, 5).value = format(.average(clls.resize(, 4)), "#.#")
 

File đính kèm

Bạn sửa lại macro cuối như sau

Option Explicit
Sub TTong
()
Dim Rng As Range, Clls As Range
'Chi Lay Cac O Tai Cot "B" có dữ liệu kiểu (hằng) số:'
Set Rng = Range("B2:B" & [A65500].End(xlUp).Row).SpecialCells(xlCellTypeConstants, 1)
'Tính Trung Bình Cho Các O Dó:'
Rng.Offset(, 5).NumberFormat = "#,##0.0"
For Each Clls In Rng
With Application
.WorksheetFunction
Clls
.Offset(, 5).Value = .Average(Union(Clls, Clls.Resize(, 4)))
End With
Next Clls
End Sub
 
Lần chỉnh sửa cuối:
Nhưng nếu điểm môn toán hệ số 2 thì phải làm sao vậy bạn
 
Xin lỗi bạn, đúng là tính theo công thức không được

Bạn thử kiểm theo macro sau:
PHP:
Option Explicit
    Sub TBinh()
    Dim Rng As Range, Clls As Range
  
    Set Rng = Range("B2:B" & [A65500].End(xlUp).Row).SpecialCells(xlCellTypeConstants, 1)
    'Tính Trung Bình Cho Các O Dó:'
    Rng.Offset(, 5).NumberFormat = "#,##0.0"
    For Each Clls In Rng
    With Application.WorksheetFunction
    Clls.Offset(, 4).Value = (.Sum(Clls.Resize(, 4)) + Clls.Value) / 5
    End With
    Next Clls
    End Sub
 
Trong trường hợp này các bạn dùng macro như thế nào chỉ mình với cảm ơn nhiều
 

File đính kèm

Lần chỉnh sửa cuối:
Có một vấn đề như sau hỏi các anh chị giúp đở
Trong Ẽcel cột A là tên Cột B là Điểm Toán, C (Lý), D(Hóa), E(trung bình môn) Cột TBM = (Toán*2+Lý+Hóa)/4 làm tròn 2 chữ số ở phần thập phân nếu dùng công thức thì Round((B1*2+c1+d1)/4,1) còn nếu dùng chức năng format như trong code thì giả sử kết quả là 4.76 trên màng hình là 4.8 như so kết quả đó với kết quả 4.8 thì là sai do đó mình mong các bạn giúp đở 1 code để làm mình cảm ơn nhiều. Mình có tập tin đính kèm theo ở phía dưới là hoi.rar
 
Trong Ẽcel cột A là tên Cột B là Điểm Toán, C (Lý), D(Hóa), E(trung bình môn) Cột TBM = (Toán*2+Lý+Hóa)/4 làm tròn 2 chữ số ở phần thập phân nếu dùng công thức thì Round((B1*2+c1+d1)/4,1) còn nếu dùng chức năng format như trong code thì giả sử kết quả là 4.76 trên màng hình là 4.8 như so kết quả đó với kết quả 4.8 thì là sai do đó mình mong các bạn giúp đở 1 code để làm mình cảm ơn nhiều. Mình có tập tin đính kèm theo ở phía dưới là hoi.rar

Bạn thử với hàm tự tạo sau:
PHP:
Option Explicit
Function FormatTB(HS1 As Range, HS2 As Range, HS3 As Range)
 Dim Clls As Range, Dem As Byte, Rng As Range
 Dim jJ As Byte
 
 For jJ = 1 To 3
   Set Rng = Switch(jJ = 1, HS1, jJ = 2, HS2, jJ = 3, HS3)
   For Each Clls In Rng
      If Clls <> "" Then
         FormatTB = FormatTB + jJ * Clls.Value
         Dem = Dem + jJ
      End If
   Next Clls
 Next jJ
 FormatTB = FormatTB / Dem
 FormatTB = Application.WorksheetFunction.Round(FormatTB, 1)
End Function

Tại [Al5] bạn nhập cú fáp: =FormatTB(V5:AB5,AC5:AI5,AJ5)
 
Mình có cái công thức thống kê tổng số (ts), nữ (n), dân tộc (dt), nữ dân tộc (ndt) mình muốn chuyển sang mác rô có cái nút tên thông kê cho nhẹ sau khi nhập điểm xong rùi nhấn cái nút thống kê thì chương trình thông kê mới chạy mới hiện lên dữ liệu thông kê. Cảm ơn các anh chị nhiều

ví dụ mẫu
Bạn tham khảo thêm cái này nữa nhé! có code trong sheet
 

File đính kèm

Cảm ơn bạn rất là nhiều với code này à mình muốn hỏi thêm vấn đề này bạn có thể thiết kế giúpmình 1 cái nút trong đó khi chọn học kỳ I, thì phần học kỳ II ẩn đi còn chọn học kỳ II thì phần học kỳ I ẩn đi cảm ơn bạn nhiều. À mà mình muốn nó có cái nút tính điểm khi nhấn nút đó thì công thức mới làm việc thì làm như thế nào bạn ơi?
Bạn thử với hàm tự tạo sau:
PHP:
Option Explicit
Function FormatTB(HS1 As Range, HS2 As Range, HS3 As Range)
 Dim Clls As Range, Dem As Byte, Rng As Range
 Dim jJ As Byte
 
 For jJ = 1 To 3
   Set Rng = Switch(jJ = 1, HS1, jJ = 2, HS2, jJ = 3, HS3)
   For Each Clls In Rng
      If Clls <> "" Then
         FormatTB = FormatTB + jJ * Clls.Value
         Dem = Dem + jJ
      End If
   Next Clls
 Next jJ
 FormatTB = FormatTB / Dem
 FormatTB = Application.WorksheetFunction.Round(FormatTB, 1)
End Function
Tại [Al5] bạn nhập cú fáp: =FormatTB(V5:AB5,AC5:AI5,AJ5)
 
Lần chỉnh sửa cuối:
(1) À, mình hỏi thêm vấn đề này bạn có thể thiết kế giúpmình 1 cái nút trong đó khi chọn học kỳ I, thì phần học kỳ II ẩn đi còn chọn học kỳ II thì phần học kỳ I ẩn đi . (2) mà mình muốn nó có cái nút tính điểm khi nhấn nút đó thì công thức mới làm việc thì làm như thế nào bạn ơi?

(1) Mình đã gán macro với tổ hợp fím {CTRL}+{SHIFT}+M

Để chuyển đổi sự ẩn hiện 2 học kỳ, bạn cứ nhấn tổ hợp fím, khi nào chán thì nghỉ!

(*) Bạn sẽ quan sát thấy rằng các nút tính điểm cũng ẩn hiện theo.
Cho nên để làm 2 cái nút cho chạy macro (thay vì bấm tổ hợp fím) bạn cần đặt nó đúng chổ. để không bị ẩn đi

Cách tạo nút lệnh để chạy macro có trên diễn đàn; Chịu khó tìm cái nha.

(Bạn xem thêm trong file kèm theo nha)

(2) Chưa rõ bạn cần tính vào cột nào?
Hàm tự tạo bên trên tính cho bạn đủ số liệu theo yêu cầu chưa vậy? Còn thiếu cột nào bạn cần tính?
 

File đính kèm

Tính tại ba cột lạ trung bình học kỳ I, TBMHKII, TBMCN, mình muốn là tạo cái nút khi nhấn nút thì mới tính còn chưa nhấn nút tính điểm thì không tính gì cả. điều kiện là ở cột C và cột HS3 <>"" thì công thức mới tính tới còn không thì bỏ qua. Nút lệnh Macro thì mình biết rồi nhưng muốn viết thủ tục tính theo yêu cầu trên thì chưa biết các bạn giúp đở mình nhen
(1) Mình đã gán macro với tổ hợp fím {CTRL}+{SHIFT}+M

Để chuyển đổi sự ẩn hiện 2 học kỳ, bạn cứ nhấn tổ hợp fím, khi nào chán thì nghỉ!

(*) Bạn sẽ quan sát thấy rằng các nút tính điểm cũng ẩn hiện theo.
Cho nên để làm 2 cái nút cho chạy macro (thay vì bấm tổ hợp fím) bạn cần đặt nó đúng chổ. để không bị ẩn đi

Cách tạo nút lệnh để chạy macro có trên diễn đàn; Chịu khó tìm cái nha.

(Bạn xem thêm trong file kèm theo nha)

(2) Chưa rõ bạn cần tính vào cột nào?
Hàm tự tạo bên trên tính cho bạn đủ số liệu theo yêu cầu chưa vậy? Còn thiếu cột nào bạn cần tính?
 
Lần chỉnh sửa cuối:
Xuân hiếu
Tính tại ba cột lạ trung bình học kỳ I, TBMHKII, TBMCN, mình muốn là tạo cái nút khi nhấn nút thì mới tính còn chưa nhấn nút tính điểm thì không tính gì cả. điều kiện là ở cột C và cột HS3 <>"" thì công thức mới tính tới còn không thì bỏ qua.

Hai cột đầu bạn dùng hàm tại #47 mà tính thôi; Còn cột cả năm thì mỗi năm tính 1 lần thì cứ gì fải macro; Bạn lập fép tính ở ô đầu cột , sau đó kéo xuống dưới thôi.

Còn không bạn tự ghi lại macro thử xem sao.
 
ghi macro không cho dùng hàm if do đó hơi khó khăn bạn giúp mình đi. cảm ơn nhiều.
Hai cột đầu bạn dùng hàm tại #47 mà tính thôi; Còn cột cả năm thì mỗi năm tính 1 lần thì cứ gì fải macro; Bạn lập fép tính ở ô đầu cột , sau đó kéo xuống dưới thôi.

Còn không bạn tự ghi lại macro thử xem sao.
 
À đúng rồi; Fải chỉnh sửa nhiều mới ổn.

ghi macro không cho dùng hàm if do đó hơi khó khăn bạn giúp mình đi. cảm ơn nhiều.

Bạn có thể chỉ cần dùng hàm tự tạo sau đây; Nó đúng với trường hợp 'Tên HS' còn để trống & điểm HS3 cũng vậy

Nội dung hàm bài #47 trên được sửa như sau:
PHP:
Option Explicit
Function FormatTB(HS1 As Range, HS2 As Range, HS3 As Range, Ten As Range)
 Dim Clls As Range, Dem As Byte, Rng As Range
 Dim jJ As Byte
 If Ten.Value = "" Or HS3.Value = "" Then
   FormatTB = "":                         Exit Function
 End If
 For jJ = 1 To 3
   Set Rng = Switch(jJ = 1, HS1, jJ = 2, HS2, jJ = 3, HS3)
   For Each Clls In Rng
      If Clls <> "" Then
         FormatTB = FormatTB + jJ * Clls.Value
         Dem = Dem + jJ
      End If
   Next Clls
 Next jJ
 FormatTB = FormatTB / Dem
 FormatTB = Application.WorksheetFunction.Round(FormatTB, 1)
End Function
Lúc đó cú fáp hàm tại ô [T5] sẽ là =formatTB(E5:K5,L5:R5,S5,C5)



Nếu bạn vẫn giữ quan điểm chạy macro, thì xin mời bạn macro tính diểm trung bình cho HK I như sau:
PHP:
Sub TinhDiemHK1()
 Dim Clls As Range, HS3 As Range
 
 For Each Clls In Range([C5], [C65500].End(xlUp))
   Set HS3 = Cells(Clls.Row, "S")
   If Clls.Value <> "" And HS3.Value <> "" Then
      HS3.Offset(, 1).Value = FormatTB(Clls.Offset(, 2).Resize(, 7), Clls.Offset(, 9).Resize(, 7), HS3, Clls)
   End If
 Next Clls
End Sub

Để tính cho HK 2 bạn thử trước việc thay các vùng tương đương cho học kỳ 2 vào macro đó xem sao.

Rất mong bạn sẽ thành công mỹ mãn!
 
Lần chỉnh sửa cuối:
Thật sự rất cảm ơn bạn. Cảm ơn rất là nhiều. Nhưng bạn giúp mình macro ma trong hoc ky II thì tính luôn cột TBCN (Trung bình môn của cả năm):= Trung bình môn của học kỳ I + Trung bình môn của học kỳ II *2 tất cả chia ba. các bạn giup mình nhen
 
Lần chỉnh sửa cuối:
Một lần nữa cảm ơn bạn nhưng mình muốn như sau là thiết kế 1 hộp có hai cái nút 1 là học kỳ I, hai là học Kỳ II có cột cả năm phần này ở trang bìa. Khi mình kích chọn học kỳ I thì tất các các cột của học kỳ II và cả năm của các môn học Toán, Lý, Hóa,... đều ẩn hết còn khi muốn kích vào học kỳ II thì phần học kỳ I của các môn đều ẩn hết bạn giúp mình với nhen.
(1) Mình đã gán macro với tổ hợp fím {CTRL}+{SHIFT}+M

Để chuyển đổi sự ẩn hiện 2 học kỳ, bạn cứ nhấn tổ hợp fím, khi nào chán thì nghỉ!

(*) Bạn sẽ quan sát thấy rằng các nút tính điểm cũng ẩn hiện theo.
Cho nên để làm 2 cái nút cho chạy macro (thay vì bấm tổ hợp fím) bạn cần đặt nó đúng chổ. để không bị ẩn đi

Cách tạo nút lệnh để chạy macro có trên diễn đàn; Chịu khó tìm cái nha.

(Bạn xem thêm trong file kèm theo nha)

(2) Chưa rõ bạn cần tính vào cột nào?
Hàm tự tạo bên trên tính cho bạn đủ số liệu theo yêu cầu chưa vậy? Còn thiếu cột nào bạn cần tính?
 
Cung cấp macro 2 trong 1 luôn đây

Nhưng bạn giúp mình macro mả trong hoc ky II thì tính luôn cột TBCN (Trung bình môn của cả năm):= Trung bình môn của học kỳ I + Trung bình môn của học kỳ II *2 tất cả chia ba. các bạn giup mình nhen

PHP:
Option Explicit
Sub TinhDiemHK()
 Dim Clls As Range, HS3 As Range, Rng As Range
 Dim jJ As Integer
 
 jJ = InputBox("Ban Càn Tính Cho HK Nào?", , "1")
 For Each Clls In Range([C5], [C65500].End(xlUp))
   Set HS3 = Cells(Clls.Row, Switch(jJ = 1, "S", jJ = 2, "AJ")) '*'
   If Clls.Value <> "" And HS3.Value <> "" Then
      HS3.Offset(, 1).Value = FormatTB(HS3.Offset(, -14).Resize(, 7), _
         HS3.Offset(, -7).Resize(, 7), HS3, Clls)
9      If jJ = 2 Then
         With HS3.Offset(, 2)
            .Value = (2 * .Offset(, -1).Value + .Offset(, -18).Value) / 3
            .Value = Application.WorksheetFunction.Round(.Value, 1)
         End With
      End If
   End If
 Next Clls
End Sub

Nhưng dù sao mình vẫn khuyên bạn nên dùng hàm.
 
Lần chỉnh sửa cuối:
- Cảm ơn bạn nhiều nhưng ở cột trung bình cả năm nếu một trong hai học kỳ chưa tính điểm trung bình thì cột cả năm cũng chưa tính điểm trung bình chứ bạn trong trường hợp trên cột cả năm vẫn tính điểm trung bình trong khi một trong hai học kỳ chưa tính điểm.
- Mình muốn có một button chon học kỳ I thì tất các các phần của học kỳ II đều ẩn hết còn nếu chọn học kỳ II thì cột học kỳ I ẩn hết (của tất cả các môn). Mong các bạn giúp đở nhiều.
PHP:
Option Explicit
Sub TinhDiemHK()
 Dim Clls As Range, HS3 As Range, Rng As Range
 Dim jJ As Integer
 
 jJ = InputBox("Ban Càn Tính Cho HK Nào?", , "1")
 For Each Clls In Range([C5], [C65500].End(xlUp))
   Set HS3 = Cells(Clls.Row, Switch(jJ = 1, "S", jJ = 2, "AJ")) '*'
   If Clls.Value <> "" And HS3.Value <> "" Then
      HS3.Offset(, 1).Value = FormatTB(HS3.Offset(, -14).Resize(, 7), _
         HS3.Offset(, -7).Resize(, 7), HS3, Clls)
      If jJ = 2 Then
         With HS3.Offset(, 2)
            .Value = (2 * .Offset(, -1).Value + .Offset(, -18).Value) / 3
            .Value = Application.WorksheetFunction.Round(.Value, 1)
         End With
      End If
   End If
 Next Clls
End Sub

Nhưng dù sao mình vẫn khuyên bạn nên dùng hàm.
 
(1) -nhưng ở cột trung bình cả năm nếu một trong hai học kỳ chưa tính điểm trung bình thì cột cả năm cũng chưa tính điểm trung bình chứ bạn trong trường hợp trên cột cả năm vẫn tính điểm trung bình trong khi một trong hai học kỳ chưa tính điểm.

(2)- Mình muốn có một button chon học kỳ I thì tất các các phần của học kỳ II đều ẩn hết còn nếu chọn học kỳ II thì cột học kỳ I ẩn hết (của tất cả các môn). Mong các bạn giúp đở nhiều.

(1) Nếu HS3 chưa có thì cột HK(x) tương ứng với nó cũng sẽ không được tính. Vậy bạn không thể giả lập những gì mà trong thực tiển không sẩy ra. Chẳng lẽ mới học kỳ I mà đã bấm tính học kỳ 2?

(2) Bạn tự ên đi; Bạn làm được mà!

Chúc thành công.
 
(1) Mình hỏi như sau trong macro hai trong một của bạn thì mình thấy như thế này. Ở cột cả năm nếu em học sinh A nào đó mà học kỳ I vì một lý do nào đó chưa tổng kết nhưng sang học kỳ II thì điểm trung bình được tổng kết trong trường hợp này thì cột cả năm phải không được tổng kết chứ bạn nhưng trong macro của bạn viết thì trong trường hơp45 này cũng tổng kết nên nhờ bạn sữa giúp.
(2) Mình không biết là giữa hàm và macro thì cái nào sẽ thực hiện nhanh hơn bạn hay là sao mà bạn khuyên mình nên dùng hàm. và hàm tự tạo vào dùng hàm có sẵng cái nào hoạt động chậm hơn xin chỉ giúp cảm ơn bạn nhiều.
(1) Nếu HS3 chưa có thì cột HK(x) tương ứng với nó cũng sẽ không được tính. Vậy bạn không thể giả lập những gì mà trong thực tiển không sẩy ra. Chẳng lẽ mới học kỳ I mà đã bấm tính học kỳ 2?

(2) Bạn tự ên đi; Bạn làm được mà!

Chúc thành công.
 
Web KT

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

Back
Top Bottom