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

Liên hệ QC

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

không phải đâu bạn ơi do ở trường mình công tác nhiều người đâu có biết máy tính nhập điểm còn chưa được nữa nên mình sợ mở lộn làm hư công thức thì sửa thì rất là lâu nên mới hỏi mà.
Cảm ơn bạn nhiều

Đã là công thức chạy bằng macro thì sợ quái gì chỉnh sửa thay đổi chứ! Góp ý bạn nè, như hồi này tôi nói cái nút trích dẫn nằm cạnh nút CẢM ƠN, thế mà rất nhiều người giúp bạn, sao không thấy bạn "RỜ" vào nó nhỉ?

Muốn khóa, giấu công thức, chọn tất cả (Ctrl+A) rồi vào Format Cell (Ctrl+1) sau đó, tại thẻ Protection bạn có 2 lựa chọn là Lock và Hidden, bạn bỏ chọn tất cả, OK. Sau đó, bạn chọn những ô chứa công thức của bạn, lại Ctrl+1, lần này, bạn chọn lại lock và hidden. Rồi sau đó bạn muốn khóa ô hay không tùy bạn.
 
Đã là công thức chạy bằng macro thì sợ quái gì chỉnh sửa thay đổi chứ! Góp ý bạn nè, như hồi này tôi nói cái nút trích dẫn nằm cạnh nút CẢM ƠN, thế mà rất nhiều người giúp bạn, sao không thấy bạn "RỜ" vào nó nhỉ?

Muốn khóa, giấu công thức, chọn tất cả (Ctrl+A) rồi vào Format Cell (Ctrl+1) sau đó, tại thẻ Protection bạn có 2 lựa chọn là Lock và Hidden, bạn bỏ chọn tất cả, OK. Sau đó, bạn chọn những ô chứa công thức của bạn, lại Ctrl+1, lần này, bạn chọn lại lock và hidden. Rồi sau đó bạn muốn khóa ô hay không tùy bạn.

Bạn ơi trong lúc reco macro thì có chỗ không cho reco vậy thì bó tay hả bạn
Cảm ơn

Được!
Lại tiếp tục với record macro đi
Cái nào không thể record được thì ta mới tính kiểu khác

Anh ơi như sao có cái công hức không reco được thì làm như thế nào anh.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Anh ơi như sao có cái công hức không reco được thì làm như thế nào anh.

Khi ghi lại những hành động trong sheet, chúng sẽ ghi lại những thao tác mình thực hiện, nhưng khi đang ghi macro, bạn lại sử dụng lệnh macro, nó sẽ không ghi lại hành động này, undo, redo gì đó cũng không ghi và rất nhiều cái khác liên quan đến ứng dụng.

Ưu điểm của chức năng tự ghi macro:

Chức năng Record Macro ghi lại những ghì mà VBA thực hiện là cách học hay, giúp ta có thể nắm bắt được các đối tượng và thuộc tính của nó, nắm được trình tự của các bước thực hiện công việc. Chức năng này hỗ trợ tích cực những người mới bắt đầu tìm hiểu VBA. Có thể ghi lại một số công việc, sau đó xem lại những mã lệnh được ghi và tìm hiểu chức năng của chúng.
Bạn có thể ghi lại các hành động như Sort, Filter v.v... rất dễ dàng.

Nhược điểm của chức năng tự ghi macro:

Bạn không thể ghi lại được nội dung, không so sánh giá trị giữa các ô, không tự tạo hàm người dùng... bằng chức năng ghi macro.
Các công việc mà ghi macro không thể tự thực hiện được:
+ Các kiểu vòng lặp (Do ... Loop)
+ Các kiểu hành động theo điều kiện (If ... Then)
+ Khai báo kiểu giá trị cho biến
+ Gán giá trị cho biến
+ Xử lý và chuyển đổi giữa các kiểu giá trị
+ Hiện các thông báo giao tiếp với người sử dụng (Msgbox)
+ Hiện các hộp thoại điều khiển (Dialog)
+ Tạo liên kết tự động với các chương trình khác trong môi trường Windows, v.v...
Theo như trên, bắt buộc bạn phải bổ sung mã lệnh của VBA vào trong macro tự ghi hoặc phải xây dựng một macro mang tính độc lập để thực hiện những bài toán phức tạp. Khi đó, việc sử dụng chức năng ghi macro thuần túy trở nên không còn hữu dụng nữa. Tuy thế, không có nghĩa là chức năng này đã mất tác dụng mà nó vẫn song song hỗ trợ tích cực cho bạn trên con đường học tập VBA.

Khi bạn mới vào môi trường học VBA, nên tìm hiểu những sách về VBA căn bản như sách "Lập trình VBA trong Excel" của Phan Tự Hướng để tham khảo bạn nhé!
http://www.giaiphapexcel.com/forum/showpost.php?p=153955&postcount=1

Thân ái.
 
PHP:
Option Explicit:        Option Base 1
Function ThongKe(LookUpRange As Range, Chuan As Range)
 ReDim MDL(4, 4) As Integer:           Dim Lop As Double, jJ As Byte
 Dim Rng As Range, Clls As Range
 
 Set Rng = LookUpRange.Cells(1, 1).Resize(LookUpRange.Rows.Count)
 For jJ = 1 To Chuan.Count
   With Application.WorksheetFunction
      MDL(1, jJ) = .CountIf(Rng, Cells(5, 3 + jJ))
   End With
   Lop = Chuan.Cells(1).Offset(, jJ - 1).Value
   For Each Clls In Rng
      If Clls.Offset(, 1).Value <> "Nam" And Clls.Value = Lop Then
         MDL(2, jJ) = MDL(2, jJ) + 1
         If Clls.Offset(, 2).Value <> "Kinh" And Clls.Value = Lop Then _
            MDL(4, jJ) = MDL(4, jJ) + 1
      End If
      If Clls.Offset(, 2).Value <> "Kinh" And Clls.Value = Lop Then _
         MDL(3, jJ) = MDL(3, jJ) + 1
   Next Clls
 Next jJ
 ThongKe = MDL
End Function
Chú í: Đó là hàm mảng nha!
(Xem thêm trong file)
Code bị lỗi runtime error 1004 khi mình chọn môn ở A6
 
Cái đó do thử nghiệm macro trước hàm nhưng quên bỏ đi đó mà, Xin lỗi bạn

Code bị lỗi runtime error 1004 khi mình chọn môn ở A6

Thực ra, lúc đầu chưa rõ hết ý tác giả, nên mình viết 1 macro sự kiện. Macro này báo lỗi khi bạn rờ đến [A6] vì macro muốn thay đổi 1 vài ô của hàm mảng tự tạo có sau này. Tuy nhiên việc chỉ thay 1 bộ fận trong các ô hàm mảng là Excel không chịu;

Để tránh xung đột này bạn sửa lại con số 6 trong dòng báo lỗi thành con số 4 là được; Như sau:

Mã:
[COLOR=Silver]Option Explicit
[B]Private Sub Worksheet_Change(ByVal Target As Range)[/B]
 If Not Intersect(Target, [A6]) Is Nothing Then
  Dim Rng As Range, Sh As Worksheet
  Dim jJ As Byte
  
  Set Sh = Sheet1
  Set Rng = Sh.Range(Sh.[d1], Sh.[d65500].End(xlUp))
   With Application.WorksheetFunction
      For jJ = 4 To 7[/COLOR]
         Cells([B]4[/B], jJ).Value = .CountIf(Rng, Cells(5, jJ).Value) [COLOR=Blue]'Trước đây nó là con 6'[/COLOR]
  [COLOR=Silver]    Next jJ
   End With
 End If
[B]End Sub[/B][/COLOR]
Một lần nữa xin cảm ơn & vô cùng xin lỗi bạn!
 
Cảm ơn Bạn Hyen Bạn giúp chuyển nội dung trong sheet (TH KI) SANG MACRO GIÚP mình với được không vì mình làm bằng công thức thì đúng rùi nhưng nó chạy chậm quá mình muốn chuyển sang Macro bạn giúp mình với nhen. Cách chuyển như sau Mẫu tương tự như trên như khi cột HK (cột hạnh kiểm của Học sinh nhập vào xong) thì nhấn cái nút xếp loại thì các cột điểm, xếp loại mới xuất hiện công thức như trên xin cảm ơn nhiềuCảm ơn Bạn Hyen Bạn giúp chuyển nội dung trong sheet (TH KI) SANG MACRO GIÚP mình với được không vì mình làm bằng công thức thì đúng rùi nhưng nó chạy chậm quá mình muốn chuyển sang Macro bạn giúp mình với nhen.
Cách chuyển như sau
Mẫu tương tự như trên như khi cột HK (cột hạnh kiểm của Học sinh nhập vào xong) thì nhấn cái nút xếp loại thì các cột điểm, xếp loại mới xuất hiện công thức như trên xin cảm ơn nhiều


http://www.4shared.com/file/240236028/6db7e8db/CHUONG_TRINH_DANG_NGHIEN_CUU.html
 
Lần chỉnh sửa cuối:
File của bạn diêm dúa & màu mè quá đi mất;

Bạn nên đưa file khác chỉ vài trang tính liên quan đến câu hỏi thôi nha!

Tốn tiền của & tài nguyên với bạn quá đi mất!
 
bạn chuyển giúp thì chuyển chứ màu mè gì mình đưa cả file mình thiết kế lên mà phải màu mè chứ

Nhờ mọi người giúp đở
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Bạn dùng code sau:
Mã:
Sub Rectangle1_Click()
Dim cl As Range
For Each cl In Sheet1.[a3:a9]
cl = UCase(cl)
If cl <> "" And Asc(cl) > 64 And Asc(cl) < 91 Then cl.Offset(, 1) = Asc(cl) - 64
Next
End Sub
Bạn có thể gõ chữ thường hay chữ hoa, code sẽ chuyển sang chữ hoa
Bạn có thể gõ từ A đến Z
 

File đính kèm

Lần chỉnh sửa cuối:
Hay có thể xài macro sự kiện như sau

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("A3:A99")) Is Nothing Then
   Target.Offset(, 1).Value = Asc(UCase(Target.Value)) - 64
 End If
End Sub

Lúc đó bạn gỏ vô bất kỳ hàng nào trong vùng 'A3:A99' các chữ cái, thì ô bên fải liền kề sẽ cho bạn con số tương ứng.
 
Vậy nếu trong trường hợp này mình làm như thế nào các cao thủ giúp mình với nhen.
Cảm ơn các anh chị nhiều
 

File đính kèm

Dùng thử code này, nếu cột môn nào mà trống thì sẽ không cộng.
Option Explicit
Dim endR As Long
Sub TinhTong()
With Sheet1
endR = .Cells(65000, 1).End(xlUp).Row
If endR = 1 Then Exit Sub
With .Range(.Cells(2, 6), .Cells(endR, 6))
.FormulaR1C1 = "=IF(COUNTA(RC2:RC5)<4,"""",SUM(RC2:RC5))"
.Value = .Value
End With
End With
End Sub
 
Thêm 1 tham khảo

PHP:
Option Explicit
Sub TTong()
 Dim Rng As Range, Clls As Range
 
 Set Rng = Range("B2:B" & [A65500].End(xlUp).Row).SpecialCells(xlCellTypeConstants, 1)
 For Each Clls In Rng
   With Application.WorksheetFunction
      Clls.Offset(, 5).Value = .Sum(Clls.Resize(, 4))
   End With
 Next Clls
End Sub
 
Các bạn đã có nhiều giải pháp giải quyết vấn để, mình muốn đề cập 1 vấn đề khác là tối ưu code. Hầu hết các bạn (Xin lỗi có cả bác Sa_DQ) là vẫn đi soát toàn bộ vùng dữ liệu. Khi dữ liệu lớn thì vấn đề này sẽ ảnh hưởng nhiều đến tốc độ code. Căn cứ yêu cầu của bài, mình đề xuất 1 phương án :
Chỉ chọn các ô trong môn toán có điểm-->Nếu có tên thì cộng: Như vậy số vòng lặp sẽ giảm đi đáng kể nếu dữ liệu không đầy đủ.

Mã:
Option Explicit
Sub Rectangle1_Click()
Dim Rng, cl As Range
Range("F2:F56536").ClearContents
Set Rng = Sheet1.Range("b2:b56536").SpecialCells(2)
For Each cl In Rng.Cells
If cl.Offset(, -1) <> "" Then cl.Offset(, 4) = _
WorksheetFunction.Sum(cl, cl.Offset(, 1).Resize(, 3))
Next
Set Rng = Nothing: Set cl = Nothing
End Sub

Xin lỗi bác Sa_DQ, đây là những vấn đề em rất thích trong các bài của bác đấy.
 

File đính kèm

Lần chỉnh sửa cuối:
Mình áp dụng tính tổng các các anh chị cho tính trung bình nhưng không được mong các cao thủ giúp đỡ
 

File đính kèm

(1) Thực ra macro của Sealand & macro #40 là i chang nhau; Thâm chí Ở #40 sẽ nhanh hơn tẹo í chứ!

(2)
PHP:
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ó:'
 For Each Clls In Rng
   With Application.WorksheetFunction
      Clls.Offset(, 5).Value = .Average(Clls.Resize(, 4))
   End With
 Next Clls
End Sub
 
Làm thế nào để chèn thêm hàm round để làm tròn lấy 1 chữ số ở phần thập phân cảm ơn nhiều
 
Làm thế nào để chèn thêm hàm round để làm tròn lấy 1 chữ số ở phần thập phân cảm ơn nhiều

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)), "#.#")
 
Web KT

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

Back
Top Bottom