2014-12-20 14 views
10

Tôi có một câu hỏi về phạm vi toàn cầu và đã trừu tượng hóa các vấn đề thành một ví dụ đơn giản:Làm thế nào để khai báo biến toàn cầu trong Excel VBA để được hiển thị trên Workbook

Trong một Workbook Excel: Trong Sheet1 Tôi có hai (2) nút.
Đầu tiên được dán nhãn SetMe và được liên kết với một chương trình con trong Sheet1 của mô-đun:
Sheet1 mã:

Option Explicit 
Sub setMe() 
    Global1 = "Hello" 
End Sub 

Thứ hai được dán nhãn ShowMe và được liên kết với một chương trình con trong ThisWorkbook's module:
ThisWorkbook code:

Option Explicit 
Public Global1 As String 
Debug.Print("Hello") 
Sub showMe() 
    Debug.Print (Global1) 
End Sub 

Nhấp vào SetMe tạo trình biên dịch error: variable not defined.
Khi tôi tạo một mô-đun riêng và di chuyển khai báo Global1 vào mọi thứ hoạt động.

Vì vậy, câu hỏi của tôi là: Mọi thứ tôi đã đọc nói rằng Biến toàn cục, được khai báo ở đầu mô-đun, bên ngoài bất kỳ mã nào sẽ hiển thị cho tất cả các mô-đun trong dự án. Rõ ràng nó không phải như thế. Trừ khi sự hiểu biết của tôi về Mô-đun không chính xác.
Các đối tượng Sheet1, Sheet2, ThisWorkbook, ... đi kèm với sổ làm việc: đây có phải là các mô-đun có khả năng khai báo biến ở phạm vi toàn cầu không?

Hoặc là nơi duy nhất có thể tuyên bố toàn cầu, trong một mô-đun riêng biệt loại Mô-đun.

+0

Tôi tin rằng Mã của UserForms rơi vào loại danh mục Mô-đun mặc dù nó không thực sự được liệt kê như vậy. Đúng không? – peege

+0

@ sancho.s Tôi đã xóa nó để tránh nhầm lẫn :) Tôi đã bỏ lỡ liên kết của Pearson và giải thích sai một dòng trong liên kết MSDN mà tôi đã đăng. Đã học một điều gì đó mới mẻ hôm nay :) – L42

+0

@ user2978241 - Bạn có tìm thấy bất kỳ câu trả lời hữu ích nào ở đây không? Nó luôn luôn là tốt để cung cấp cho thông tin phản hồi, do đó, người dùng SO khác có thể nhìn thấy. –

Trả lời

3

Bạn có thể làm như sau để tìm hiểu/kiểm tra các khái niệm:

  1. mở mới Excel Workbook và trong Excel soạn thảo VBA nhấp chuột phải vào Modules-> Insert> Module

  2. Trong mới thêm Module1 thêm khai báo; Public Global1 As String

  3. trong Worksheet VBA module Sheet1 (Sheet1) đặt đoạn mã:

Sub setMe() 
     Global1 = "Hello" 
End Sub 
  1. trong Worksheet VBA module Sheet2 (Sheet2) đặt đoạn mã:
Sub showMe() 
    Debug.Print (Global1) 
End Sub 
  1. Chạy theo thứ tự Sub setMe() và sau đó Sub showMe() để kiểm tra khả năng hiển thị toàn cầu/khả năng tiếp cận của var Global1

Hy vọng điều này sẽ giúp.

+1

Đơn giản, thx, phù hợp với tôi. Tôi đã đặt tên một mô-đun "Globals" và sử dụng nó cho không có gì khác nhưng xác định các biến toàn cầu - không có subs hoặc chức năng hoặc bất kỳ mã nào trong đó, chỉ cần globals định nghĩa – user1302114

+0

Bạn được hoan nghênh! Vui vì nó hoạt động cho bạn. Vui lòng đánh dấu câu trả lời được chấp nhận nếu bạn hài lòng với giải pháp. Trân trọng, –

14

Câu hỏi của bạn là: đây không phải là các mô-đun có khả năng khai báo biến ở phạm vi toàn cầu?

trả lời: YES, họ là "có khả năng"

Điểm duy nhất là tài liệu tham khảo cho các biến toàn cầu trong ThisWorkbook hoặc một module Bảng phải có đủ điều kiện (ví dụ, được gọi là ThisWorkbook.Global1, ví dụ) Tham chiếu đến biến toàn cầu trong mô-đun chuẩn phải đủ điều kiện chỉ trong trường hợp không rõ ràng (ví dụ: nếu có nhiều hơn một mô-đun chuẩn xác định biến có tên Global1 và ý bạn là sử dụng biến đó trong mô-đun thứ ba).

Ví dụ, vị trí trong mã Sheet1

Public glob_sh1 As String 

Sub test_sh1() 
    Debug.Print (glob_mod) 
    Debug.Print (ThisWorkbook.glob_this) 
    Debug.Print (Sheet1.glob_sh1) 
End Sub 

ra trong ThisWorkbook đang

Public glob_this As String 

Sub test_this() 
    Debug.Print (glob_mod) 
    Debug.Print (ThisWorkbook.glob_this) 
    Debug.Print (Sheet1.glob_sh1) 
End Sub 

và trong một mã số tiêu chuẩn module

Public glob_mod As String 

Sub test_mod() 
    glob_mod = "glob_mod" 
    ThisWorkbook.glob_this = "glob_this" 
    Sheet1.glob_sh1 = "glob_sh1" 
    Debug.Print (glob_mod) 
    Debug.Print (ThisWorkbook.glob_this) 
    Debug.Print (Sheet1.glob_sh1) 
End Sub 

Cả ba tàu ngầm hoạt động tốt.

PS1: Câu trả lời này chủ yếu dựa trên thông tin từ here. Nó rất đáng đọc (từ Chip Pearson vĩ đại).

PS2: Đường dây của bạn Debug.Print ("Hello") sẽ cung cấp cho bạn lỗi biên dịch Invalid outside procedure.

PS3: Bạn có thể (một phần) kiểm tra mã của mình bằng Gỡ lỗi -> Biên dịch VBAProject trong trình chỉnh sửa VB. Tất cả các lỗi biên dịch sẽ bật lên.

PS4: Kiểm tra cũng Put Excel-VBA code in module or sheet?.

PS5: Bạn có thể không khai báo biến toàn cục, ví dụ Sheet1 và sử dụng nó trong mã từ sổ làm việc khác (đọc http://msdn.microsoft.com/en-us/library/office/gg264241%28v=office.15%29.aspx#sectionSection0; tôi không kiểm tra điểm này, vì vậy vấn đề này chưa được xác nhận là như là). Nhưng bạn không có ý định làm điều đó trong ví dụ của bạn.

PS6: Có một số trường hợp dẫn đến sự mơ hồ trong trường hợp không phải là biến toàn cầu đủ điều kiện. Bạn có thể tinker một chút để tìm thấy chúng. Chúng là các lỗi biên dịch.

+0

Tôi đã hiểu sai một dòng trong liên kết tôi đã đăng. Đã học một điều gì đó mới hôm nay :). Chắc chắn +1. Nếu tôi có thể bỏ phiếu nhiều lần, tôi đã làm như vậy. – L42

+0

Điều này khiến tôi phát điên - bổ sung thêm 'Điều công khai như Thing' mới vào một mô-đun thay vì để ThisWorkbook giải quyết tất cả các lỗi" 424 "lỗi khi cố gắng truy cập' thing.something() ' – oooyaya

Các vấn đề liên quan