LamNA
Thành viên tích cực


- Tham gia
- 3/6/14
- Bài viết
- 897
- Được thích
- 725
- Giới tính
- Nam
- Nghề nghiệp
- Quản Lý Cửa Hàng
Nó là thế này:Chào anh chị
Anh chị cho em hỏi với công thức bên dưới làm sao khi chạy công thức xong nó sẽ gán kết quả bằng giá trị Value
Mã:Sub Test() Range("F2").value = "=SUMIFS(B1:B14,A1:A14,E2)" End Sub
Sub Test()
Range("F2") = [=SUMIFS(B1:B14,A1:A14,E2)]
End Sub
Bạn click vào chỗ Evaluate phía dưới chữ ký của tôi, có bài viết của anh Lê Văn Duyệt viết về phương thức này.Cám ơn anh nhe
Anh cho em hỏi ý nghĩa ý nghĩa của [...] trong VBA là gì vậy anh?
Anh cho em hỏi thêm nếu trường hợp này thì viết nó như thế nào là gọn nhấtBạn click vào chỗ Evaluate phía dưới chữ ký của tôi, có bài viết của anh Lê Văn Duyệt viết về phương thức này.
Sub Test()
Range("G2") = [=SUMIFS(B1:B14,A1:A14,F2,C1:C14,D2)]
Range("G3") = [=SUMIFS(B1:B14,A1:A14,F3,C1:C14,D2)]
Range("G4") = [=SUMIFS(B1:B14,A1:A14,F4,C1:C14,D2)]
End Sub
Chắc là thế này.Anh cho em hỏi thêm nếu trường hợp này thì viết nó như thế nào là gọn nhất
Mã:Sub Test() Range("G2") = [=SUMIFS(B1:B14,A1:A14,F2,C1:C14,D2)] Range("G3") = [=SUMIFS(B1:B14,A1:A14,F3,C1:C14,D2)] Range("G4") = [=SUMIFS(B1:B14,A1:A14,F4,C1:C14,D2)] End Sub
Sub Test()
Dim i As Integer
For i = 2 To 4
Range("G" & i) = Evaluate("SUMIFS(B1:B14,A1:A14,F" & i & ",C1:C14,D2)")
Next i
End Sub
Đúng rồi, em cám ơn anh nheChắc là thế này.
Mã:Sub Test() Dim i As Integer For i = 2 To 4 Range("G" & i) = Evaluate("SUMIFS(B1:B14,A1:A14,F" & i & ",C1:C14,D2)") Next i End Sub
Dạ anh, em vọc VBA vài cái cơ bản trước thôi anh, nếu trường hợp này thì dung công thức có sẵn sẽ nhanh và tiện hơn.(Trao đổi thôi nhé):
- Không rõ mục đích dùng VBA để viết công thức, chưa kể viết công thức ấy trong code sẽ khó hơn hẳn viết trên bảng tính.
- Về phương diện áp dụng VBA vì cái ưu điểm của nó, nhưng giải pháp ở đây thì không áp dụng được ưu điểm đó.
Anh Nghĩa cho em hỏi trường hợp công thức sumifs như trong file thì trong VBA mình viết như thế nào là ngắn nhấtNó là thế này:
Mã:Sub Test() Range("F2") = [=SUMIFS(B1:B14,A1:A14,E2)] End Sub
Ví dụ là thế này:Anh Nghĩa cho em hỏi trường hợp công thức sumifs như trong file thì trong VBA mình viết như thế nào là ngắn nhất
Em cám ơn
Sub Test2()
With [F5:AJ10]
.FormulaR1C1 = "=SUMIFS(C2,C1,RC5,C3,R4C)"
.Value = .Value
End With
End Sub
Có lẽ là do thói quen thôi anh, chứ như em chẳng hạn thì cũng không nhận ra sự khác biệt về tốc độ giữa 2 cách viết này, với em thì code chạy được là ngon rồi, hay dở tính sau. Bình thường em hay viết [A1], nhưng đôi khi cần sự gợi ý của VBE (khi gõ dấu chấm sau đối tượng) thì em viết Range("A1").Chú: hàm Evaluate làm chậm code 1 chút (tuy không đáng kể)
Tôi vẫn thường thắc mắc tại sao quý vị ở đây rất chú trọng về tốc độ nhưng lại thích viết [A1] thay vì Range("A1"). Nhưng hình như luật ở đây điều kiện viết code ngắn đứng trên điều kiện tốc độ.
Quá cần thiết cho những người muốn biết về VBA như em.Cám ơn anh nhiều.Chắc là thế này.
Mã:Sub Test() Dim i As Integer For i = 2 To 4 Range("G" & i) = Evaluate("SUMIFS(B1:B14,A1:A14,F" & i & ",C1:C14,D2)") Next i End Sub
Thiệt hôn đó hay là chọc em vậy anh ?Úm ba la, cám ơn anh nha
Vậy có kết luận luôn đi, hỏi gì nửa.Em thấy rồi anh. Mà value3,value4,value5 đâu ta ?
View attachment 202186
Cám ơn anh.Vậy có kết luận luôn đi, hỏi gì nửa.
Ví dụ là thế này:
Mã:Sub Test2() With [F5:AJ10] .FormulaR1C1 = "=SUMIFS(C2,C1,RC5,C3,R4C)" .Value = .Value End With End Sub
Sub Test2()
With [F5:AJ10,H5:H10.........] 'Em thử như vậy kết quả không chính xác
.FormulaR1C1 = "=SUMIFS(C2,C1,RC5,C3,R4C)"
.Value = .Value
End With
End Sub
Thử thế này xem, với 31 vùng như vậy thì đưa vào cái range kia dài dòng lắm:Anh cho em hỏi thêm nếu trong trường hợp các cột không liên tiếp thì mình viết thế nào để chạy kết quả đúng
Em cám ơn
Mã:Sub Test2() With [F5:AJ10,H5:H10.........] 'Em thử như vậy kết quả không chính xác .FormulaR1C1 = "=SUMIFS(C2,C1,RC5,C3,R4C)" .Value = .Value End With End Sub
Sub Test3()
Dim Cll As Range
For Each Cll In Sheet1.[F4:BN4].SpecialCells(xlCellTypeConstants)
With Cll.Offset(1).Resize(6)
.FormulaR1C1 = "=SUMIFS(C2,C1,RC5,C3,R4C)"
.Value = .Value
End With
Next
End Sub
1 cách:Anh cho em hỏi thêm nếu trong trường hợp các cột không liên tiếp thì mình viết thế nào để chạy kết quả đúng
Em cám ơn
Mã:Sub Test2() With [F5:AJ10,H5:H10.........] 'Em thử như vậy kết quả không chính xác .FormulaR1C1 = "=SUMIFS(C2,C1,RC5,C3,R4C)" .Value = .Value End With End Sub
Sub abc()
Dim i&, j%, LR&, LC%
LR = Cells(Rows.Count, "E").End(xlUp).Row
Range("F5:F" & LR).Formula = "= SUMIFS($B:$B,$A:$A,$E5,$C:$C,F4)"
For i = 5 To LR
For j = 6 To 66 Step 2
Cells(i, 6).Copy Cells(i, j)
Next
Next
End Sub
Cám ơn anh NghĩaThử thế này xem, với 31 vùng như vậy thì đưa vào cái range kia dài dòng lắm:
Mã:Sub Test3() Dim Cll As Range For Each Cll In Sheet1.[F4:BN4].SpecialCells(xlCellTypeConstants) With Cll.Offset(1).Resize(6) .FormulaR1C1 = "=SUMIFS(C2,C1,RC5,C3,R4C)" .Value = .Value End With Next End Sub
Cám ơn anh phulien19021 cách:
PHP:Sub abc() Dim i&, j%, LR&, LC% LR = Cells(Rows.Count, "E").End(xlUp).Row Range("F5:F" & LR).Formula = "= SUMIFS($B:$B,$A:$A,$E5,$C:$C,F4)" For i = 5 To LR For j = 6 To 66 Step 2 Cells(i, 6).Copy Cells(i, j) Next Next End Sub
Cái chỗ F4 không ổn rồi anh, phải là F$4 mới đúng.1 cách:
PHP:Sub abc() Dim i&, j%, LR&, LC% LR = Cells(Rows.Count, "E").End(xlUp).Row Range("F5:F" & LR).Formula = "= SUMIFS($B:$B,$A:$A,$E5,$C:$C,F4)" For i = 5 To LR For j = 6 To 66 Step 2 Cells(i, 6).Copy Cells(i, j) Next Next End Sub
Sub defghij()
Dim j%, LR&, LC%
LR = Cells(Rows.Count, "E").End(xlUp).Row
Range("F5:F" & LR).Formula = "=SUMIFS($B:$B,$A:$A,$E5,$C:$C,F$4)"
For j = 8 To 66 Step 2
Cells(5, 6).Resize(LR - 4).Copy Cells(5, j)
Next
End Sub
Nếu các cột cách đều thì dùng vòng For với Step là khoảng cách giữa các cột chứa công thức. Nói chung là chế biến cái này dễ mà.Cám ơn anh Nghĩa
Chạy kết quả nhanh
Theo code em hiểu đoạn SpecialCells(xlCellTypeConstants) là công thức chỉ tính các ô có chứa hằng số, các ô trống bỏ qua không tính
Nó sẽ phát sinh tính toán công thức khi các ô trống có chứa giá trị.
Dạ em cám ơn anh Phúc nhe, thấy bài toán cũng đã được giải quyếtCái chỗ F4 không ổn rồi anh, phải là F$4 mới đúng.
Giữ ý tưởng đó, em sửa lại thế này, sẽ nhanh hơn chút vì giảm đi số lần copy:
Mã:Sub defghij() Dim j%, LR&, LC% LR = Cells(Rows.Count, "E").End(xlUp).Row Range("F5:F" & LR).Formula = "=SUMIFS($B:$B,$A:$A,$E5,$C:$C,F$4)" For j = 8 To 66 Step 2 Cells(5, 6).Resize(LR - 4).Copy Cells(5, j) Next End Sub
Bài đã được tự động gộp:
Nếu các cột cách đều thì dùng vòng For với Step là khoảng cách giữa các cột chứa công thức. Nói chung là chế biến cái này dễ mà.
Đính chính: Mình tên là Phúc (Hoàng Nghĩa Phúc) chứ không phải Nghĩa.
Anh cho em hỏi thêm ý nghĩa của dấu % của 2 biến này nheCái chỗ F4 không ổn rồi anh, phải là F$4 mới đúng.
Giữ ý tưởng đó, em sửa lại thế này, sẽ nhanh hơn chút vì giảm đi số lần copy:
Mã:Sub defghij() Dim j%, LR&, LC% LR = Cells(Rows.Count, "E").End(xlUp).Row Range("F5:F" & LR).Formula = "=SUMIFS($B:$B,$A:$A,$E5,$C:$C,F$4)" For j = 8 To 66 Step 2 Cells(5, 6).Resize(LR - 4).Copy Cells(5, j) Next End Sub
Bài đã được tự động gộp:
Nếu các cột cách đều thì dùng vòng For với Step là khoảng cách giữa các cột chứa công thức. Nói chung là chế biến cái này dễ mà.
Đính chính: Mình tên là Phúc (Hoàng Nghĩa Phúc) chứ không phải Nghĩa.
Dim j%, LC%
À, hình như j% tương ứng với j As Integer, LR& tương ứng với LR As Long, d# tương ứng với d As Double. Mình không dùng cách khai báo biến kiểu này nên không rành.Anh cho em hỏi thêm ý nghĩa của dấu % của 2 biến này nhe
Mã:Dim j%, LC%