2012-03-30 32 views
5

tôi đã viết một số chức năng VBA:Lưu phạm vi để biến

Sheets("Src").Range("A2:A9").Copy Destination:=Sheets("Dest").Range("A2") 

tôi muốn trích xuất phạm vi nguồn vào một biến cho tính linh hoạt.

SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Tuy nhiên, điều này không hiệu quả. SrcRange nào nên được làm mờ? Dòng đầu tiên có đúng không?
tôi đã cố gắng Dimming SrcRange như Range và nó đã cho tôi
Runtime error 91: Object Variable or With block variable not set

Tôi không phải là rất quen thuộc với ngôn ngữ và tài liệu đã để lại cho tôi muốn (Tôi không thể tìm thấy kiểu trả về cho Sheets (index) gọi, this là gần nhất tôi tìm thấy). Khi tôi nhấn Record Macro, thực hiện một số thao tác và nhấn stop, phần thân Macro vẫn trống.

Có ai có thể làm sáng tỏ cách sử dụng SrcRange làm biến không?

Trả lời

9

Trong câu trả lời của riêng bạn, bạn có hiệu quả làm việc này:

Dim SrcRange As Range ' you should always declare things explicitly 
Set SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Bạn đang không thực sự "giải nén" phạm vi cho một biến, bạn đang đặt một tham chiếu đến phạm vi.

Trong nhiều tình huống, điều này có thể hiệu quả hơn cũng như linh hoạt hơn:

Dim Src As Variant 
Src= Sheets("Src").Range("A2:A9").Value 'Read range to array 
'Here you can add code to manipulate your Src array 
'... 
Sheets("Dest").Range("A2").Value = Src 'Write array back to another range 
+0

Tôi thích có thể đọc được biến/mảng biến thể để linh hoạt hơn. Cảm ơn vì tiền hỗ trợ! –

7

... Và câu trả lời là:

Set SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Các Set làm cho tất cả sự khác biệt. Sau đó, nó hoạt động như một say mê.

8

Chỉ cần làm rõ, có một sự khác biệt lớn giữa hai hành động này, theo đề nghị của Jean-François Corbett.

Một hành động là để sao chép/tải các dữ liệu thực tế từ các Range("A2:A9") VÀO một Variant Mảng gọi vArray (Thay đổi để tránh nhầm lẫn giữa Variant Mảng và Sheet cả gọi Src):

vArray = Sheets("Src").Range("A2:A9").Value

trong khi người kia chỉ đơn giản là thiết lập một biến Range (SrcRange) với địa chỉ của dãy Sheets("Src").Range("A2:A9"):

Set SrcRange = Sheets("Src").Range("A2:A9")

Trong trường hợp này, dữ liệu không được sao chép, và vẫn còn ở đâu, nhưng bây giờ có thể được truy cập theo cùng cách với một mảng. Điều đó thường hoàn toàn thích hợp, nhưng nếu bạn cần truy cập nhiều lần, kiểm tra hoặc tính toán với dữ liệu đó, tải nó vào một mảng đầu tiên sẽ nhanh hơn.

Ví dụ: giả sử bạn muốn kiểm tra "cơ sở dữ liệu" (trang tính lớn) chống lại danh sách các vùng ngoại ô và mã bưu điện đã biết. Cả hai bộ dữ liệu đều nằm trong các trang riêng biệt, nhưng nếu bạn muốn nó chạy nhanh, tải vùng ngoại ô và mã bưu điện vào một mảng (sống trong bộ nhớ), sau đó chạy qua từng dòng của cơ sở dữ liệu chính, kiểm tra dữ liệu mảng. Điều này sẽ nhanh hơn nhiều nếu bạn truy cập cả hai từ trang tính gốc của họ.