Đưa công thức vào VBE

Liên hệ QC

trantuonganh2008

Thành viên thường trực
Tham gia
8/11/08
Bài viết
305
Được thích
53
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
 

File đính kèm

  • Copy of Sample.zip
    48.7 KB · Đọc: 17
Lần chỉnh sửa cuối:
Thấy cái công thức của Bạn cũng đủ chóng mặt rồi. Bạn có thể đặt nó vào trong name cho nó gọn hơn (Cái này file nó cũng ít nặng hơn đặt ở ngoài) mà tốc độ xử lý nó cũng nhanh. Bạn có thể đưa file lên để mọi người xem thử có thể dùng công thức nào khác hơn không?
 
Vậy đặt name như thế nào vậy bạn? Mình cũng mơ hồ về vụ này lắm!
 
Lần chỉnh sửa cuối:
Bạn xem file nhé, Mình chỉ đưa công thức vào trong name thôi. Còn cách tính của Bạn Mình chưa nghiên cứu công thức nào ngắn hơn.
Công thức cửa Bạn cũng có thể thu gọn hơn tí nữa
Mã:
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
 
Lần chỉnh sửa cuối:
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)
Chỉ có thể nói đơn giản thế này: Ở ngoài bạn viết sao thì bê "nguyên con" vào code là được!
 
Cám ơn MinhCông nhiều, nhưng sao mình copy công thức của bạn vào file gốc của mình thì nó ra là text và khi vào xem lại thì nó có dấu "....." này, mình xóa hoài không được. Bạn làm giúp mình ở các cột khác như BP, BS, BY, BZ luôn nhé! Cám ơn nhiều!!!
 
Lần chỉnh sửa cuối:
Bạn xem file nhé. Trong name Mình đặt tên theo từng cột luôn đấy.
 
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.
 
Lần chỉnh sửa cuối:
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.
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.
 
Nếu copy name dán vào sheet khác thì có sai không? Vì giả sử như dòng 7 của name của sheet này cho vào dòng 10 của sheet khác liệu có đúng không? Hay là phải xài name động, bạn có thể chỉ mình cách đặt name động
 
Lần chỉnh sửa cuối:
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?

1. Muốn gán công thức vào một cell bằng VBA bạn làm như sau:
Với ví dụ của bạn, tại ô BQ7 bạn nhập công thức = 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)

Nhấn OK để kết thúc việc nhập công thức
Mở record Macro -> OK
Nhập con trỏ vào ô chứa công thức và kích hoạt ô này (bằng F2 hoặc kích đúp chuột) tiếp đó nhấn Enter và tắt Macro (Stop recording).

Bạn vào VBE sẽ thấy như ví dụ 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
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)"
Nhấn F5 để xem kết quả tai ô BQ7

2. Nếu chỉ lấy giá trị (xoá công thức)
Bạn viết thêm dòng lệnh:
Range("BQ7")=Range("BQ7").value

Đọc thì thấy rắc rối nhưng làm thì thật là đơn giản. Bạn thử xem
 
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!
 
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)"
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:
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!

Đố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.
 
Đố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.
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!
 
Lần chỉnh sửa cuối:
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!
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 được
Thân
 
Lần chỉnh sửa cuối:
Hình như không phải change mà là selectionchange bạn à.
 
Lần chỉnh sửa cuối:
Hình như không phải change mà là selectionchange bạn à.
Dù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
 
Lần chỉnh sửa cuối:
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:


Giả sử mình có công thức trên áp dụng chung cho tất cả các sheet khác & muốn cho nó tự động thay đổi khi số liệu thay đổi thì đưa vào VBE như thế nào vậy bạn? Nhờ bạn giúp mình, cám ơn nhiều nhé!!!
 
Dù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
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(BF7
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom