Sử dụng giá trị hay tham chiếu

Liên hệ QC

nguyennb

Thành viên hoạt động
Tham gia
23/10/07
Bài viết
103
Được thích
32
Giả sử ban đầu tôi có ba cột là A,B,C. Giá trị các ô trong cột C phụ thuộc vào cột A và B, ví dụ C1=A1 * B1. Do các ô chứa giá trị trong hai cột A và B không xác định trước nên tôi không dùng chức năng Fillhand, thay vào đó tôi viết một đoạn code để cập nhật giá trị cho cột C. Tôi sử dụng hai cách để tính, cụ thể
Mã:
' Tinh ket qua trong cot C
For i= 1 to 10 
'Cach 1, tính kết quả và đưa vào cột C
Range("C" & CStr(i))= Range("A" & CStr(i)) * Range("B" & CStr(i))
'Cach 2, đưa ra tham chiếu để tính
Range("C" & CStr(i))= "=A"& CStr(i) & "*B"& CStr(i)
Next i

Số lượng các ô của hai cột A và B có thể rất lớn và nó lại phụ thuộc vào các ô khác nữa. Tôi muốn hỏi
Sử dụng cách nào để tính giá trị trong các ô C nhanh hơn ?
Ưu điểm của mỗi cách tính ?
 
Cho hỏi, ngoài phép tính C = A * B , thì còn có phép tính nào khác không?
Nếu không còn phép tính nào khác, thì có cần phải viết code không ?
Vả lại, cái code mà bạn viết đó có khác gì với C = A * B đâu ?
Nếu bạn lo lắng rằng có thể có giá trị rỗng trong cột A hoặc B, thì bạn dùng thêm IF để bẫy lỗi, sau đó dùng Fillhand cho nhanh bạn à:
C = IF(OR(A = " ", B = " "), 0, A * B)​
Tôi nghĩ, có lẽ bạn còn muốn có cái gì đó chứ không chỉ là C = A * B, bạn trình bày rõ hơn được không?
 
Bó tay. Không hiểu bạn muốn gì luôn. Excel giành cho người mới học sao mà khó kinh!
Không rõ bạn đang làm việc gì cần sử dụng Excel phức tạp đến như thế nhỉ?

Bạn đang nghiên cứu lập trình hả? hay là vận dụng để xử lý dữ liệu gì đó thôi?
 
Chào bạn nguyennb,

Tôi đoán bạn muốn lập trình để tự tính cho cột C. Cách của bạn không có gì sai, chỉ không tổng quát.

Tôi hiểu bạn muốn ban hành công thức cho cột C một cách tổng quát mà không cần lập vòng lặp. Thay vào đó ta có thể dùng Autofill hoặc FillDown (như nhau thôi). Ta có thể làm vài cách như thế này, theo thiển ý của tôi sẽ nhanh hơn một chút.

1. Thủ công, nhưng dễ nhớ

Bạn ban hành một công thức tổng quát ở ô đầu tiên cột C, tôi lấy ví dụ của bạn:

Range("C" & CStr(i))= Range("A" & CStr(i)) * Range("B" & CStr(i))

Rồi dùng cột B để xác định ô cuối cùng, và filldown:

Range("B1").Select
Selection.End(xlDown).Select
Selection.Offset(0, 1).Activate
Range(Selection, Selection.End(xlUp)).Select
Selection.FillDown

2. Cách này hiện đại hơn chút, nhưng cũng không chắc là giải quyết tất cả vấn đề:

Range("C1") = "=A" & CStr(1) & "+B" & CStr(1)
Range("C1").Select
Selection.AutoFill Destination:=Range("C1:C" & CStr(ActiveSheet.UsedRange.Rows.Count))
Range("C1:C3").Select

Cách của tôi khá củ chuối, nhưng bạn thử xem sao nhé.
 
Đúng là mình không hỏi về bài toán C=A*B. Mà có dạng C1=Sumif(A1:A65536,"X",B1:B65536).
C2=Sumif(A1:A65536,"Y",B1:B65536).
Và ô giá trị ở cột A,B lại được tổng hợp từ Sheet khác bởi các công thức khác. Bởi vì mình chưa biết cách xác định giới hạn tìm kiếm nên luôn phải kiểm tra toàn bộ các giá trị ở mỗi cột(tới tận 65356)-->Chương trình chạy chậm.
Thank workman nhé, cách đó hay thiệt.
 
Giải pháp công thức

+ Thế thì đặt tên cho vùng với name động với hàm offset (chỉ xét các ô có giá trị), có thể tham khảo hàm offset tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=7188

Giải pháp VBA

thì tốt nhất bạn dùng thuộc tính End của vùng (range) để xác định phạm vi dữ liệu:
http://www.giaiphapexcel.com/forum/showthread.php?t=6420

Và thêm vào nữa là tính toán sau bằng VBA thì nhớ chuyển về Value lun -> FIle sẽ nhẹ vì chỉ chứa giá trị.

Chúc thành công
 
Web KT

Bài viết mới nhất

Back
Top Bottom