trantuonganh2008
Thành viên thường trực




- Tham gia
- 8/11/08
- Bài viết
- 305
- Được thích
- 53
IF(BA7>0;SUM(IF(BF7<=BE7;BG7;0);IF(BH7<=BE7;BI7;0);IF(BJ7<=BE7;BK7;0);IF(BL7<=BE7;BM7;0);IF(BN7<=BE7;BO7;0));0)/BA7*AZ7
Bác này buồn cười ghê! Nhờ người ta viết code mà lại protect VBA thì viết cóc khô gì nữa chứ (phá chẳng khó, nhưng lười)Bạn xem giúp mình nhé!
Nếu muốn dùng name đó thì phải dùng move or copy sheet đã đặt name đó, sau đó copy dữ liệu của sheet kia dán vào (đây là cách nhanh). Còn không phải dùng name động (đặt cho 1 sheet rồi dùng cho toàn workbook.Cho mình hỏi thêm là nếu có nhiều sheet như vậy thì phải đặt name khác nhau phải không? Vì các sheet có số dòng khác nhau.
Chào mọi người,
Mình có công thức sau, giờ muốn đưa vào VBE thì viết như thế nào?
BQ7 = IF(BA7>0,SUM(IF(BF7<=BE7,BG7/BA7*AZ7,0),IF(BH7<=BE7,BI7/BA7*AZ7,0),IF(BJ7<=BE7,BK7/BA7*AZ7,0),IF(BL7<=BE7,BM7/BA7*AZ7,0),IF(BN7<=BE7,BO7/BA7*AZ7,0)),0)
...
...
...
BQ44 = IF(BA44>0,SUM(IF(BF44<=BE44,BG44/BA44*AZ44,0),IF(BH44<=BE44,BI44/BA44*AZ44,0),IF(BJ44<=BE44,BK44/BA44*AZ44,0),IF(BL44<=BE44,BM44/BA44*AZ44,0),IF(BN44<=BE44,BO44/BA44*AZ44,0)),0)
Mình muốn khi có giá trị ở các ô trong công thức thì cho ra kết quả tại ô BQ này. Có nghĩa là mình không muốn ô BQ có công thức, như thế sẽ làm file nặng thêm.
Nhờ mọi người giúp mình, cám ơn nhiều!
P/S: Vì tất cả các sheet đều giống như vậy nên có thể áp dụng chung cho tất cả được không hay là phải viết cho từng sheet?
Sửa gọn Mocro trên như sau:Sub Macro2()
'
' Macro2 Macro
' Macro recorded 11/12/2009 by chinh
'
'
Range("BQ7").Select
ActiveCell.FormulaR1C1 = _
"= IF(RC[-16]>0,SUM(IF(RC[-11]<=RC[-12],RC[-10]/RC[-16]*RC[-17],0),IF(RC[-9]<=RC[-12],RC[-8]/RC[-16]*RC[-17],0),IF(RC[-7]<=RC[-12],RC[-6]/RC[-16]*RC[-17],0),IF(RC[-5]<=RC[-12],RC[-4]/RC[-16]*RC[-17],0),IF(RC[-3]<=RC[-12],RC[-2]/RC[-16]*RC[-17],0)),0)"
Range("BQ8").Select
End Sub
Nhấn F5 để xem kết quả tai ô BQ7Range("BQ7")= _
"= IF(RC[-16]>0,SUM(IF(RC[-11]<=RC[-12],RC[-10]/RC[-16]*RC[-17],0),IF(RC[-9]<=RC[-12],RC[-8]/RC[-16]*RC[-17],0),IF(RC[-7]<=RC[-12],RC[-6]/RC[-16]*RC[-17],0),IF(RC[-5]<=RC[-12],RC[-4]/RC[-16]*RC[-17],0),IF(RC[-3]<=RC[-12],RC[-2]/RC[-16]*RC[-17],0)),0)"
Như vầy mới gọn đây anh, như anh ndu nói, trên excel viết thế nào thì VBA viết y như vậy:Sửa gọn Mocro trên như sau:
Range("BQ7")= _
"= IF(RC[-16]>0,SUM(IF(RC[-11]<=RC[-12],RC[-10]/RC[-16]*RC[-17],0),IF(RC[-9]<=RC[-12],RC[-8]/RC[-16]*RC[-17],0),IF(RC[-7]<=RC[-12],RC[-6]/RC[-16]*RC[-17],0),IF(RC[-5]<=RC[-12],RC[-4]/RC[-16]*RC[-17],0),IF(RC[-3]<=RC[-12],RC[-2]/RC[-16]*RC[-17],0)),0)"
Range("BQ7").Value="=IF(BA7>0,SUM(IF(BF7<=BE7,BG7/BA7*AZ7,0),IF(BH7<=BE7,BI7/BA7*AZ7,0),IF(BJ7<=BE7,BK7/BA7*AZ7,0),IF(BL7<=BE7,BM7/BA7*AZ7,0),IF(BN7<=BE7,BO7/BA7*AZ7,0)),0)"
Anh Trung Chinh cho em hỏi chút.
Nếu ghi macro như vậy thì sheet tính toán có nhanh hơn so với công thức trên cell không?
Nếu như một cột có nhiều công thức như vậy thì cũng phải làm từng ô vậy sao?.
cám ơn anh!
Cám ơn anh TrungChinh, cho mình hỏi tí xíu. Nếu cột này có nhiều công thức khác nhau (chỉ là địa chỉ ô thôi thì mình phải copy mấy chục dòng đưa vào VBE hay sao? Nhưng sau khi đưa vào rồi, kích hoạt code nó mới hiển thị kết quả, ý mình muốn là nó đợi sẵn luôn, khi các giá trị các ô thay đổi thì cho ra kết quả luôn. Vậy phải sửa hoặc thêm code lại như thế nào vậy anh? Cám ơn anh!Đối với những bảng tính lớn dùng VBA đương nhiên là nhanh hơn dùng công thức. Nếu một cột có nhiều công thức khác nhau thì phải làm từng ô (dùng hàm cũng phải vậy mà) còn công thức giống nhau thì thỉ cần lập cho 1 ô rồi quét (hoặc copy) sang các ô khác - Y chang như làm bằng tay nhưng nhanh hơn và chẳng cần bận tâm bảo vệ công thức.
Bạn thử gán code đó vào sự kiện CHANGE của sheet có bảng tính, thí dụ gán sự kiện nhập vào ô BA7 thì chạy code, hy vọng đượcCám ơn anh TrungChinh, cho mình hỏi tí xíu. Nếu cột này có nhiều công thức khác nhau (chỉ là địa chỉ ô thôi thì mình phải copy mấy chục dòng đưa vào VBE hay sao?
Nhưng sau khi đưa vào rồi, kích hoạt code nó mới hiển thị kết quả, ý mình muốn là nó đợi sẵn luôn, khi các giá trị các ô thay đổi thì cho ra kết quả luôn. Vậy phải sửa hoặc thêm code lại như thế nào vậy anh?
Cám ơn anh!
Dùng CHANGE nhé bạnHình như không phải change mà là selectionchange bạn à.
Như vầy mới gọn đây anh, như anh ndu nói, trên excel viết thế nào thì VBA viết y như vậy:
Mình làm như vầy nè (tại sheet có công thức) thì tự động nó cho ra kết quả luôn. Nhưng cái mình muốn bây giờ là dùng chung cho các sheet khác luôn vì nó cũng có công thức y như vậy thì làm thế nào? Private Sub Worksheet_SelectionChange(ByVal Target As Range) Range("BQ7").Value = "=IF(BA7>0,SUM(IF(BF7Dùng CHANGE nhé bạn Set vung = Intersect(Range("cái ô bạn muốn nhập dữ liệu cho code chạy"), Target) If Not vung Is Nothing Then Cái bạn muốn làm hoặc If Target.Address = "$BB$7" Then Cái bạn muốn làm ($BB$7 chỉ là thí dụ, còn bạn lựa ô nào tuỳ ý )Mình không rành lắm nhưng cũng tạo một bảng nho nhỏ và thử rồi Hổng biết đúng hông nữa, mong bạn làm được thôi Thân
Có bác nào giúp mình bài này với! Mình không biết làm thế nào. Nếu copy từng công thức của từng sheet đưa vào chắc mất cả tháng qúa!!
Em có làm theo cách anh nhưng nó bị giật màn hình rồi đứng im luôn.Bạn xem cách Fill và copy công thức bằng VBA tại bài này http://www.giaiphapexcel.com/forum/showpost.php?p=178177&postcount=5 Nếu Bạn có yêu cầu khác thì đưa File ví dụ lên thì mới biết copy từ đâu và Paste vào đâu để chỉ cho bạn
Mấy cái này chịu khó record macro chút là ra thôi. Record thao tác Copy và Paste Special Fomular từ ô BQ7 đến BQ44, sau đó dán cứng cột BQ lại, rồi mở code lên xem.Anh xem file giúp mình nhé, mình muốn là tại BQ7-BQ44 không hiển thị công thức nhưng nó vẫn cho ra kết quả khi các ô trong công thức thay đổi. Cách đưa từng ô vào VBE thì mình biết nhưng đưa một loạt thì = cách nào, chẳng lẻ phải copy từng ô à?
Theo suy nghĩ của tôi thì việc đưa công thức vào VBA để làm cho bảng tính thoáng hơn (đở rối vì mấy công thức dài) chứ chẳng giải quyết được vấn đề tốc độ đâu ---> Thì đàng nào nó vẫn là công thức, chẳng qua bạn khỏi gõ thôi!Ồ xin lỗi, pas của mình là A.
Sao mình thấy đưa công thức vào VBE hình như file chạy chậm lại hơn thì phải, không biết mình nghĩ có đúng không?