Tôi nghĩ bạn áp dụng cách thứ nhất vẫn được mà, tốc độ vẫn nhanh hơn dùng For.Ví dụ em có một range [A1:A5]
code vba em có thể viết như sau
' Trường hợp công thức ngắn
' Trường hợp công thức quá dàiMã:with range("a1:a5") .formular1c1 = "5" .value = .value end with
Cho em hỏi có cách viết code nào phối hợp cả hai thằng trên để tốc độ làm việc tăng lên không vì for i = 1 đến 40.000 dòng sẽ chậm hợn khi viết code dạng with rangeMã:for i = 1 to 5[INDENT]cells(i,"a") = 5[/INDENT] next
Kiểu như
Mã:with range("a1:a5")[INDENT]cells(i,"a") = 5[/INDENT] end with
em xin cảm ơn
Public Sub test()
Dim i As Long
With Range("a1:a65000")
.FormulaR1C1 = "5"
.Value = .Value
End With
End Sub
dạ em cũng hiểu điều đó, nhưng công thức của em quá dài không dùng cách thứ nhất được, viết hết hàng ngang rồi mà vẫn chưa hết (chủ yếu and, or) mà dạngTôi nghĩ bạn áp dụng cách thứ nhất vẫn được mà, tốc độ vẫn nhanh hơn dùng For.
Bạn có thể đưa một công thức(ví dụ thôi) của bạn nên được không?dạ em cũng hiểu điều đó, nhưng công thức của em quá dài không dùng cách thứ nhất được, viết hết hàng ngang rồi mà vẫn chưa hết (chủ yếu and, or) mà dạng
.formular1c1 = "" không được phép xuống dòng dưới
Tôi không nghĩ công thức xếp học lực nó dài như vậy, bạn đưa file tính dăm ba trường hợp để xem có thể rút gọn công thức này không.Công thức xét học lực của học sinh
Bạn thử dùng For each xem có nhanh hơn không.Công thức xét học lực của học sinh
Public Sub test1()
Dim i As Long, t As Double, cll As Range
t = Timer
i = 0
For Each cll In Sheet1.Range("A1:A40000")
cll = 5
Next cll
Debug.Print Timer - t
End Sub
không rút gọn được nữa đâu bác ơi nó là ngắn nhất rồi đó ạ, đó là công thức của bác [URL=Tôi không nghĩ công thức xếp học lực nó dài như vậy, bạn đưa file tính dăm ba trường hợp để xem có thể rút gọn công thức này không.
Bạn thử đưa lên, biêt đâu rút gọn được một chút.không rút gọn được nữa đâu bác ơi nó là ngắn nhất rồi đó ạ, đó là công thức của bác le phuong van
chỉ nhìn vào công thức bác sẽ hiểu được ngành giáo dục giờ nó rối rắm lắm
Sub Button3_Click()
With Sheet1.Range("S5:S40000")
.FillDown
.Value = .Value
End With
End Sub
Cái này là bạn tự nghĩ hay là bạn đọc ở đâu?.formular1c1 = "" không được phép xuống dòng dưới
không rút gọn được nữa đâu bác ơi nó là ngắn nhất rồi đó ạ, đó là công thức của bác le phuong van
chỉ nhìn vào công thức bác sẽ hiểu được ngành giáo dục giờ nó rối rắm lắm
Thông thường thì tôi làm thế này:Công thức xét học lực của học sinh
=IF(R5="","",IF(AND(COUNTIF(O5:Q5,"CĐ")=0,R5>=8,M IN(D5:Q5)>6.4,OR(D5>=8,H5>=8)),"GIỎI",IF(OR(AND(COUNTIF(O5:Q5,"CĐ")=0,R5>=8,MIN(D5:Q5)>3.4,OR (D5>=8,H5>=8),COUNT(D5:Q5)-COUNTIF(D5:Q5,">6.4")=1,COUNTIF(D5:Q5,"<5")=1),AND(COUNTIF(O5:Q5,"CĐ")=0,R5>=6.5,MIN(D5:Q5)>4.9 ,OR(D5>=6.5,H5>=6.5))),"KHÁ",IF(OR(AND(R5>6.4,MIN(D5:Q5)>1.9,OR(D5>6.4,H5>6.4),COUNT (D5:Q5)-COUNTIF(D5:Q5,">=5")=1,COUNTIF(D5:Q5,"<3.5")=1,COU NTIF(O5:Q5,"CĐ")=0),AND(R5>=6.5,MIN(D5:Q5)>4.9,OR (D5>=6.5,H5>=6.5),COUNTIF(O5:Q5,"CĐ")=1),AND(R5>=5,MIN(D5:Q5)>3.4,OR(D5>=5,H5>=5),COUNTIF(O 5:Q5,"CĐ")=0)),"TB",IF(OR(AND(R5>6.4,OR(D5>6.4,H5>6.4),COUNT(D5:Q5)-COUNTIF(D5:Q5,">=5")=1,COUNTIF(D5:Q5,"<2")=1,COUNT IF(O5:Q5,"CĐ")=0),AND(R5>6.4,OR(D5>6.4,H5>6.4),MI N(D5:Q5)>=5,COUNTIF(O5:Q5,"CĐ")=1),AND(R5>3.4,MIN(D5:Q5)>1.9)),"YẾU","KÉM")))))
dạ em làm thế rồi nhưng mà code dài quá màn hình nên nó bị tràn xuống dòng dưới em thêm dấu _ để nối tiếp dòng mà nó vẫn không đượcThông thường thì tôi làm thế này:
1. Bật công cụ Record Macro lên.
2. Chọn 1 ô (Z5 chẳng hạn, hay đại loại một ô nào đó mà công thức cho kết quả đúng), dán công thức này vào và Enter.
3. Tắt công cụ Record Macro, tôi sẽ có được công thức tương ứng dưới dạng FormulaR1C1. Copy cái đoạn loằng ngoằng này.
4. Vào chỗ viết code, gõ lệnh: [Z5:Z100].FormulaR1C1= và dán cái đoạn vừa copy lúc nãy vào. Vậy là xong.
.formular1c1 =
Đường nào thì cũng dùng đến VBA, theo tôi thì bạn nên chuyển qua xếp loại học lực bằng hàm tự tạo có thể vấn đề sẽ đơn giản hơn đấy.dạ em làm thế rồi nhưng mà code dài quá màn hình nên nó bị tràn xuống dòng dưới em thêm dấu _ để nối tiếp dòng mà nó vẫn không được
Ví dụ như vầybác chỉ em cách viết xuống dòng đối với cái này với em không biết
[A5:A10].FormulaR1C1 = _
"=IF(RC[17]="""","""",IF(AND(COUNTIF(RC[14]:RC[16],""CD"")=0,RC[17]>=8,MIN(RC[3]:RC[16])>6.4,OR(RC[3]>=8,RC[7]>=8)),""GIOI"",IF(OR(AND(COUNTIF(RC[14]:RC[16],""CD"")=0,RC[17]>=8,MIN(RC[3]:RC[16])>3.4,OR(RC[3]>=8,RC[7]>=8),COUNT(RC[3]:RC[16])-COUNTIF(RC[3]:RC[16],"">6.4"")=1,COUNTIF(RC[3]:RC[16],""<5"")=1),AND(COUNTIF(RC[14]:RC[16],""CD"")=0,RC[17]>=6.5,MIN(RC[3]:RC[16])>4.9,OR(RC[3]>=6.5,RC[7]>=6.5))),""KHA""," & _
"IF(OR(AND(RC[17]>6.4,MIN(RC[3]:RC[16])>1.9,OR(RC[3]>6.4,RC[7]>6.4),COUNT(RC[3]:RC[16])-COUNTIF(RC[3]:RC[16],"">=5"")=1,COUNTIF(RC[3]:RC[16],""<3.5"")=1,COUNTIF(RC[14]:RC[16],""CD"")=0),AND(RC[17]>=6.5,MIN(RC[3]:RC[16])>4.9,OR(RC[3]>=6.5,RC[7]>=6.5),COUNTIF(RC[14]:RC[16],""CD"")=1),AND(RC[17]>=5,MIN(RC[3]:RC[16])>3.4,OR(RC[3]>=5,RC[7]>=5),COUNTIF(RC[14]:RC[16],""CD"")=0)),""TB""," & _
"IF(OR(AND(RC[17]>6.4,OR(RC[3]>6.4,RC[7]>6.4),COUNT(RC[3]:RC[16])-COUNTIF(RC[3]:RC[16],"">=5"")=1,COUNTIF(RC[3]:RC[16],""<2"")=1,COUNTIF(RC[14]:RC[16],""CD"")=0),AND(RC[17]>6.4,OR(RC[3]>6.4,RC[7]>6.4),MIN(RC[3]:RC[16])>=5,COUNTIF(RC[14]:RC[16],""CD"")=1),AND(RC[17]>3.4,MIN(RC[3]:RC[16])>1.9)),""YEU"",""KEM"")))))"
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2