2009-07-24 4 views
7

Tôi đang tái cấu trúc một số mô đun trong sổ làm việc Excel 2003 và cùng một tập hợp bảng tính được khai báo trong mỗi quy trình trong mỗi mô-đun; Tôi muốn tuyên bố họ một lần trên toàn cầu. Tôi có thể đặt tên bảng tính như một chữ, ví dụ:Một đối tượng bảng tính có thể được khai báo trên toàn cầu trong Excel VBA không?

Public Const xlwkGSModel = "gs_model" As String 

Và sau đó trong việc sử dụng thủ tục:

...ActiveWorkbook.Worksheets(xlwkGSModel).Cells(1,1) 

Nhưng có một cách để khai báo đối tượng bảng để mã trong thủ tục có thể là:

...xlwkGSModel.Cells(1,1) 

Trả lời

10

'1. Chèn mô-đun

'2. Khai báo biến công khai bảng tính trong mô-đun như sau

Public xlwkGSModel As Worksheet 

'3. Nhanh chóng biến công cộng này trong trường hợp tải ứng dụng

Sub Workbook_Open() 

    Set xlwkGSModel = ActiveWorkbook.Worksheets("gs_model") 

End Sub 

'Bây giờ bạn có thể tham khảo bảng gs_model với biến xlwkGSModel

' Ví dụ

dim x as string 

x = xlwkGSModel.Cells(1,1) 
0

Edit: các bình luận của Alistair Knock là đúng, tôi nên đã đọc các câu hỏi triệt để - dĩ nhiên câu trả lời của tôi là không có t hợp lệ cho các đối tượng, chỉ cho các loại như chuỗi hoặc số nguyên. Đối với các đối tượng, bạn cần một hàm hoặc phụ để tạo một cá thể.


Có, bạn có thể, gần đây tôi đã làm điều đó. Nếu bạn định nghĩa các định nghĩa của mình là Public, bạn có thể sử dụng chúng trực tiếp trong các mô-đun khác của bạn (trong cùng một sổ làm việc, tất nhiên).

Có thể cách tiếp cận tốt nhất là có một mô-đun riêng biệt Hình cầu và đặt chúng ở đó.

+0

Có lẽ trong khi các định nghĩa có thể được thực hiện ở cấp mô-đun, các giá trị sẽ cần được chỉ định trong quy trình, ví dụ: trong Workbook_Open()? Vì hằng số không thể chứa các đối tượng ... –

4

Bạn có thể, nhưng bạn có thực sự muốn có nhiều biến toàn cục hơn không? Tại sao không tạo (trong một mô-đun tiêu chuẩn) một tài sản ModelWorksheet công cộng, như thế này:

Public Property Get ModelWorksheet As Worksheet 
    Const ModelWorksheetName As String = "gs_model" 
    Set ModelWorksheet = ActiveWorkbook.Worksheets(ModelWorksheetName) 
End Property 

... sau đó mã của bạn có thể làm:

With ModelWorksheet 
    .Cells(1,1).Value = "foo" 
    .Font.Bold = True 
End With 

Cũng lưu ý rằng bạn có thể tham khảo bất kỳ bảng trong workbook hiện hành trực tiếp, vì vậy nếu có một tấm gọi là Sheet1 bạn có thể làm:

With Sheet1 
    .Cells(1,1).Value = "foo" 
    .Font.Bold = True 
End With 
+1

Suy nghĩ về điều này ... Tôi không biết tôi có nên giới thiệu nó không. Vấn đề với một thuộc tính là nó trông giống như một đối tượng và nếu bạn đang ở trong một vòng lặp cập nhật, ví dụ, 15000 ô một, đây là rất nhiều bổ sung để đi qua mỗi chu kỳ. Tôi nghĩ sẽ tốt hơn nếu sử dụng tài liệu tham khảo Worksheet trực tiếp nhưng YMMV. Tôi vẫn nghĩ tốt hơn là nên chọn Dim sht as Worksheet/Set sht = ModelWorksheet()/sht.Cells (1,1) ... và đặt bảng tính vào một chức năng ModelWorksheet. Tôi biết nó không làm giảm số lượng các dòng liên quan nhưng đi toàn cầu thường không được thông báo. –

+0

@goodgai: đồng ý hết lòng; đó thực sự là lý do tại sao tôi sử dụng câu lệnh With, để tránh tham chiếu thuộc tính hai lần, nhưng tôi nên rõ ràng hơn. Và bạn đang đúng về ngay cả phương pháp này không được giúp đỡ nhiều trong một vòng lặp (trừ khi Với ... Kết thúc với kết thúc tốt đẹp toàn bộ vòng lặp). –

+2

Có, tôi đã chú ý đến câu trả lời của bạn và thấy những gì bạn đang làm nhưng tôi đã hết các ký tự trong bình luận của mình =) Tôi đã tìm ra những gì tôi đang cố gắng nói bây giờ, chính xác: ít có khả năng đi vào một cuộc phục kích hiệu suất do tai nạn. –

5

Đó là một thời gian dài trước đây, nhưng tốt hơn muộn hơn không bao giờ ;-) Tôi không biết nếu nó hoạt động trong Excel 2003 (thử nghiệm nó với 2007):

Bạn thậm chí không cần phải từ chối là các trang tính trong mã, vì chúng đã được khai báo. Tôi đang làm việc với một phiên bản Excel của Đức và tôi có thể truy cập một bảng tính bằng cách gõ "Tabelle1.Cells (...) ...". Tôi giả định trong phiên bản tiếng Anh nó là một cái gì đó như "Table1" hoặc "Sheet1".

Bạn cũng có thể thay đổi các tên này. Trong Visual Basic Editor có một cái nhìn tại các đối tượng Microsoft Excel của dự án VBA của bạn. (Chúng nằm ngay phía trên các Mô-đun và UserForms của bạn trong khung nhìn VBA-Project). Có các Worksheet-Objects của bảng tính của bạn. Chọn một trang tính và kích hoạt Properties Toolwindow. Ở đó bạn có thể chỉnh sửa tên của trang tính và truy cập vào tên đó trong mã của bạn.

2

Hoặc nếu bạn không muốn sử dụng Sự kiện Excel, bạn cũng có thể khai báo trang tính công khai, sau đó tạo một phụ để đặt giá trị cho nó. Gọi đó là phụ ở đầu mỗi tiểu để khởi tạo giá trị. (Tôi đã làm điều này từ câu trả lời của Orwell.)


Public WSRawData As Worksheet 

Public Sub RawDataWSInit() 

Set WSRawData = Worksheets(RawData) 

End Sub 

Sub Main() 

Call RawDataWSInit 

End Sub 

0

Worksheets của bạn là "Microsoft Excel Objects" quy định tại bạn VBA-Project-Explorer :

Worksheet Properties editing

In The Screen trên tôi đã đặt tên Worksheet DataSheet tôi, vì vậy bây giờ tôi có thể truy cập trực tiếp từ bên trong mã:

Set SomeRange = DataSheet.Range("A3:B6") 

By Mặc định Worksheets của bạn sẽ được đặt tên là "Sheet1", "Sheet2", aso ... tùy thuộc vào ngôn ngữ của bạn.