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
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2