Khai baó 1 lần tên sheet để sử dụng cho tất cả các sub trong file excel đó

Liên hệ QC

nguyenvanvietk50di

Thành viên mới
Tham gia
27/12/18
Bài viết
9
Được thích
3
Xin chào tất cả mọi người mình mới học VBA và có 1 câu hỏi mong mọi người giúp đỡ
trong file của mình có các sheet A, B, C,...
mình muốn khai báo 1 lần để dùng cho các sub khác không fai khai báo lại sheet đó nữa
VD: dim A as worksheet
set A = thisworkbook.sheets("A")
các sub khác nhau mình chỉ cần gọi thẳng A là nó sẽ nhận là sheet("A") mà không cần fai mỗi sub đều fai khai báo lại nữa
A.range("A1").copy chẳng hạn
Mình xin cảm ơn!
 
Biết thế nào là biến toàn cục và biến nội bộ không?
Yêu cầu của bạn là yêu cầu biến A toàn cục.

Trong bất cứ module bình thường nào (không phải form, sheet, hay object):
Đặt dòng này:
Public A As WorkSheet
Ngay đầu trước khi có cái Sub/Function nào. Như vậy A sẽ là biến toàn cục.

Trong các sub/Function có khai báo A thì xoá dòng khai báo ấy đi (nếu không xoá, thì đối với sub/function ấy A là biến nội bộ)

Chú: tôi chỉ cho biết cách làm thôi. Còn như bạn đang học VBA thì nên tìm tài liệu về "tầm vực của biến" (scope of variables) để học lấy căn bản.
 
Upvote 0
Biến toàn cục thì bạn khai báo trên cùng vào những dòng đầu tiên của các moduel
Như vậy tất cả các hàm trong moduel đó đều truy xuất đc
 
Upvote 0
những dòng đầu tiên của các moduel
Có đúng đâu. Như bài #2 mới chính xác.
Từ từ tìm hiểu tại sao lại chưa đúng nhé.

tất cả các hàm trong moduel đó đều truy xuất đc
Truy xuất đờ cờ có tác dụng gì đâu khi mới là biến.
Thớt cần có cái đối tượng worksheet cụ thể để làm việc kìa.
 
Upvote 0
...Thớt cần có cái đối tượng worksheet cụ thể để làm việc kìa.
Ở bài #2, tôi chỉ cho lý thuyết về biến toàn cục. Một trong những cái sub dùng nó phải chỉ nó vào Sheets("A").

Thực ra, có một mẹo nhỏ là dùng Function:
Trong một cái module nào đó, không phải form, sheet, hay class module; đặt một function như sau:
Public Function A() As WorkSheet
Set A = ThisWorkbook.WorkSheets("A")
End Function
Mọi Sub/Function khác sẽ dùng được A. Nhưng lúc ấy, A không phải là một biến, nó là một function trả về một đối tượng worksheet.
 
Upvote 0
Xin chào tất cả mọi người mình mới học VBA và có 1 câu hỏi mong mọi người giúp đỡ
trong file của mình có các sheet A, B, C,...
mình muốn khai báo 1 lần để dùng cho các sub khác không fai khai báo lại sheet đó nữa
VD: dim A as worksheet
set A = thisworkbook.sheets("A")
các sub khác nhau mình chỉ cần gọi thẳng A là nó sẽ nhận là sheet("A") mà không cần fai mỗi sub đều fai khai báo lại nữa
A.range("A1").copy chẳng hạn
Mình xin cảm ơn!
Khai báo biến toàn cục hoặc tạo một Function cũng đơn giản khi bạn đã có căn bản. Mình khuyên bạn chịu khó khai báo cho từng Sub, khi nào đủ kiến thức thì nâng cấp code cũng chưa muộn. Đừng dại gì đập đầu vào tường. Tin hay không thì tùy bạn.
 
Upvote 0
VBA làm việc khá rõ rệt với biến toàn cục.

Biến toàn cục có hai công dụng chính:
1. đứng ra làm một trị/một vật thể/một trạng thái đồng bộ cho tất cả các sub/function khác. Nếu chỉ giới hạn trong vòng module thì khai báo dạng tầm vực Private. Nếu mở rộng cho mọi modules thì khai báo với tầm vực Public.
2. dùng thay tham số truyền giữa các sub/function liên hệ nhau, mục đích giảm con số tham phải truyền mỗi lần các sub/function gọi nhau. Thường thì người ta đặt các sub/function có liên hệ này vào chung một module cho nên loại biến toàn cục này cũng thường được khai Private.

Ở đề bài này, nhu cầu của thớt đúng với trường hợp 1. Tức là cần một biến để chỉ vào một Sheet đã định sẵn, đồng bộ cho mọi nơi (mọi sub/function). Với đề bài của thớt, ở mọi nơi, A đều chỉ vào cái sheet có tên là "A". Dùng biến nội bộ là chối bỏ một giải pháp chính đáng của VBA (cũng như nhiều ngôn ngữ khác). Biến nội bộ sẽ khó khăn hơn trong vấn đề kiểm soát sự đồng bộ.
Điển hình, với bài của thớt, muốn thay sheet A qua sheet B thì:
i) nếu biến nội bộ thì phải vào tất cả các sub/function có sử dụng nó mà xem có cần chỉnh sửa.
ii) nếu biến toàn cục thì chỉ cần sửa 1 chỗ.

Điểm quan trọng của người mới học lập trình là nên đặt tên mấy cái biến toàn cục như thế nào để dễ nhận ra.
Ví dụ, luôn luôn bắt đầu tên với TC_. Theo đề bài thì biến này sẽ là TC_A
 
Upvote 0
Web KT

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

Back
Top Bottom