[huuductran] Bắt đầu học VBA (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

today100506

Thành viên chính thức
Tham gia
2/6/10
Bài viết
87
Được thích
41
Nghề nghiệp
IT
[HUUDUCTRAN] HỌC VBA ! XEM & PHÁT TRIỂN ! UPDATE LIÊN TỤC

Xin chào anh chị,

Em xin lập topic này để đưa lên các bài học, vấn đề VBA cơ bản

Mời anh chị vào xem

Nếu thấy chỗ nào chưa hay, chưa đúng, chưa hợp lý
anh chị cứ góp ý, cứ nói..., cứ sửa...

Em xin chân thành cảm ơn !
 
[VBA] BÀI #1: CÁCH DÙNG SET - NOTHING - ERASE - EMPTY ?

1. Nếu là object thì dùng <Set>, ko phải object thì không dùng <Set>:

Mã:
Dim str as String
str="hello world !"

Dim arr(1) as String
arr(0)="a" 
arr(1)="b" 

Dim rng as Range
[COLOR=#0000ff]Set[/COLOR] rng = Range("a1:a10") [COLOR=#008000]'là object, ta dùng set
[/COLOR]

2. Nếu là object thì dùng <Nothing>, dùng Nothing sẽ giải phóng luôn bộ nhớ

Mã:
Dim rng as Range
[COLOR=#0000ff]Set[/COLOR] rng = Range("a1:a10")[COLOR=#008000]
[COLOR=#0000ff]
Set[/COLOR] [/COLOR]rng = [COLOR=#0000ff]Nothing[/COLOR] [COLOR=#008000]'là object ta dùng Set [I]ọbj[/I]=Nothing để giải phóng bộ nhớ[/COLOR]


3. Nếu là array thì dùng <erase>, dùng Erase chỉ xóa sạch các giá trị trong array, array vẫn tồn tại
Mã:
Dim arr(1) as String
arr(0)="a" 
arr(1)="b" 

[COLOR=#0000ff]Erase [/COLOR]arr [COLOR=#008000]'là array, thì ta có thể dùng Erase khi muốn xoá bỏ mọi giá trị trong array[/COLOR]

4. Nếu là var thì dùng <empty>, dùng Empty chỉ xóa sạch các giá trị trong var, var vẫn tồn tại
Mã:
Dim str as String
str="hello world !" [COLOR=#008000]'là var, thì ta có thể dùng Empty khi muốn xoá bỏ giá trị trong var, lúc này str=""[/COLOR]

str=[COLOR=#0000ff]Empty[/COLOR]
 
Lần chỉnh sửa cuối:
Upvote 0
[VBA] BÀI #2: MỐI LIÊN HỆ VARIANT - ARRAY & VAR ?

I. SƠ LƯỢC VỀ VARIANT - ARRAY - VAR

1. Sơ lược về kiểu Variant


Kiểu Variant là một kiểu đặc biệt, nó có thể chứa tất cả các kiểu dữ liệu
như (string, integer, null, empty, nothing, error, array...)
ngoại trừ kiểu chuỗi có chiều dài cố định !

Mã:
Dim [COLOR=#0000ff]vnt[/COLOR] as [COLOR=#0000ff]Variant[/COLOR]
vnt="hello world !" [COLOR=#008000]'string
[/COLOR]vnt=123 [COLOR=#008000]'number[/COLOR]
vnt=array(1,2,4,5,5) [COLOR=#008000]'array[/COLOR]
Set vnt=Range("a1:a10") [COLOR=#008000]'object[/COLOR]
Set vnt=Err [COLOR=#008000]'object[/COLOR]

2. Sơ lược về Var

Var là biến: biến có thể chứa một giá trị biến thiên nào đó.

Mã:
Dim [COLOR=#0000ff]str[/COLOR] as [COLOR=#0000ff]String [/COLOR][COLOR=#008000]'khai báo biến tên <str>, kiểu là <String[/COLOR][COLOR=#0000ff]>
[/COLOR]str="hello world !"

Dim [COLOR=#0000ff]str[/COLOR] [COLOR=#008000]'khai báo biến tên <str>, không khai báo kiểu. Biến <str> sẽ tự động được gán kiểu là <Variant[/COLOR][COLOR=#0000ff]>
[/COLOR]str="hello world !"

3. Sơ lược về Array

Array là mảng, mảng có thể chứa nhiều giá trị, nhiều biến...

Mã:
Dim [COLOR=#0000ff]arr(1) as String [/COLOR][COLOR=#008000]'arr() là một mảng, có kiểu là <String>[/COLOR]
arr(0)="hello world ! 1"
arr(1)="hello world ! 2"

Dim [COLOR=#0000ff]arr(1) [/COLOR][COLOR=#008000]'arr() là một mảng, không khai báo kiểu. Mảng arr() sẽ tự động được gán kiểu là <Variant>[/COLOR]
arr(0)="hello world ! 1"
arr(1)="hello world ! 2"

II. MỐI LIÊN HỆ GIỮA VARIANT - ARRAY & VAR
Mã:
Dim rng as Range
Set rng=Range("A1:A10")[COLOR=#008000] 'create rng object[/COLOR]

Dim [COLOR=#0000ff]arr() as Variant [/COLOR][COLOR=#008000]'arr() là một mảng, tất nhiên có thể chứa array[/COLOR]
arr=rng.Value

Dim [COLOR=#0000ff]arr()[/COLOR] [COLOR=#008000]'[COLOR=#008000]arr() là một mảng, tất nhiên có thể chứa array; khi không khai báo kiểu, nó sẽ gán kiểu là <Variant[/COLOR][/COLOR]>
arr=rng.Value

Dim [COLOR=#0000ff]arr[/COLOR] [COLOR=#008000][COLOR=#008000]'tuy chỉ khai báo là arr, không khai báo kiểu. Khí đó arr sẽ tự động được gán kiểu là <Variant> và kiểu này có thể chứa array[/COLOR]
[/COLOR]arr=rng.Value

Dim [COLOR=#0000ff]arr as Variant[/COLOR] [COLOR=#008000][COLOR=#008000][COLOR=#008000]'tuy chỉ khai báo là arr, kiểu Variant. Vì là <Variant> nên nó có thể chứa array[/COLOR][/COLOR]
[/COLOR]arr=rng.Value
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn đã mạnh dạng mở topic học VBA. Như vậy tôi cũng mạnh dạng hỏi luôn nhé bạn. Thực ra mình cũng từng nghỉ đến mở topic để học nhưng do mặc cảm nên không dám, giả lại cũng không biết học bắt đầu từ đâu và cuối cung là cái gì. Bạn đã đăng lên 2 bài rồi theo mình bạn tạm ngưng để mình và mọi người học thông hiểu 2 bài này rồi hả tiếp tục đăng bài tiếp theo nhé bạn. Thật ra VBA tôi không biết nên không hiểu cái nào thì xin hỏi cái đó, có thể là cái cơ bản nhất cũng xin được hỏi.1 điều nữa bạn gữi kèm theo file để tiện theo dõi. Cảm ơn bạn.
Hỏi:
1. Nếu là object thìdùng <Set>, ko phải object thì không dùng <Set>:
Vậy object là gì ? <Set> là gì ? (không phải dịch nghĩa của nó). Mà mục đích object, <Set> để làm gì?. Và tương tự như thế <Nothing>, array, <erase>, var, <empty>.
Cảm ơn bạn và tất cả các thành viên.
+-+-+-+
 
Upvote 0
[GPECODE=perl]GPE lịch sử tồn tại không ngắn ngủi, cao thủ như vân...

Tôi thiết nghĩ thay vì mở topic kiểu này thì nên xem xét việc đọc lại bài của thành viên GPE, cũng như cùng trao đổi, giúp đỡ thành viên mới.

Thân.[/GPECODE]
 
Upvote 0
Cảm ơn bạn đã mạnh dạng mở topic học VBA. Như vậy tôi cũng mạnh dạng hỏi luôn nhé bạn. Thực ra mình cũng từng nghỉ đến mở topic để học nhưng do mặc cảm nên không dám, giả lại cũng không biết học bắt đầu từ đâu và cuối cung là cái gì. Bạn đã đăng lên 2 bài rồi theo mình bạn tạm ngưng để mình và mọi người học thông hiểu 2 bài này rồi hả tiếp tục đăng bài tiếp theo nhé bạn. Thật ra VBA tôi không biết nên không hiểu cái nào thì xin hỏi cái đó, có thể là cái cơ bản nhất cũng xin được hỏi.1 điều nữa bạn gữi kèm theo file để tiện theo dõi. Cảm ơn bạn.
Hỏi:
1. Nếu là object thìdùng <Set>, ko phải object thì không dùng <Set>:
Vậy object là gì ? <Set> là gì ? (không phải dịch nghĩa của nó). Mà mục đích object, <Set> để làm gì?. Và tương tự như thế <Nothing>, array, <erase>, var, <empty>.
Cảm ơn bạn và tất cả các thành viên.
+-+-+-+

Trả lời:

1. Object là gì ?
Object là đối tượng. Rõ hơn:
+ Một cái mà có đầy đủ các phương thức (method) và thuộc tính (property) được gọi là đối tượng.
+ Hay nói cách khác, đối tượng là cái có đầy đủ các phương thức (method), và thuộc tính (property).

Ví dụ 1:
Dim str as String
str="hello world !"

--> Ở đây, str không là đối tượng (object) vì nó chỉ có giá trị "hello world !" (là property).

Ví dụ 2:
Dim rng as Range
Set rng = Range("A1:A10")

rng.value="abc" 'property
rng.font.bold=true 'property

rng.Copy 'method
Range("e1").PasteSpecial xlPasteAll 'method
rng.delete 'method

--> Ở đây, rng là một object (đối tượng). Vì nó có cả phương thức (method) và thuộc tính (property)
+ Thuộc tính (property) của nó là: .value, .formula, .address, .name v.v...
+ Phương thức (method) của nó là: .copy, .paste, .delete v.v...


* Mở rộng thêm:
- Phương thức (method) là gì: nôm na, là động từ, chỉ hành động gì đó, như ví dụ...
- Thuộc tính (property) là gì: nôm na, không là động từ, chỉ thuộc tính gì đó như ví dụ...


Đến đây, có thể bạn đã hiểu 1 tý về cái gọi là object, khi đã hiểu, bạn có thể đọc lại bài #1
Chú ý: Những bài của mình thiên về phân tích, so sánh & ứng dụng.
Nếu bạn chưa biết cơ bản về VBA thì có thể tìm các giáo trình căn bản xem trước nhé !
Thân ái !
 
Lần chỉnh sửa cuối:
Upvote 0
Các bạn cứ bình tĩnh;

Mọi người có thể làm bất cứ cái gì, miễn "Nội qui" không cấm đó nha!

Có thể các bài không hữu dụng với người này thì có ích cho 1 số người khác;

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
3. Nếu là array thì dùng <erase>, dùng Erase chỉ xóa sạch các giá trị trong array, array vẫn tồn tại
Mã:
Dim arr(1) as String
arr(0)="a" 
arr(1)="b" 

[COLOR=#0000ff]Erase [/COLOR]arr [COLOR=#008000]'là array, thì ta có thể dùng Erase khi muốn xoá bỏ mọi giá trị trong array[/COLOR]

Hoặc bạn không nói hoặc nếu đã nói thì phải nói hết từ A đến Z.
Cái bạn nói là về mảng tĩnh. Khi mảng là động thì bản thân mảng cũng bị hủy diệt.

Chỉ cần test là biết ngay thôi.
Nếu bạn có

Mã:
Dim Arr(1 to 3, 1 to 10) as Long
Arr(1, 1) = 123456789

Thì với

Mã:
Erase Arr
MsgBox Arr(1, 1)

bạn có 0

Nếu là

Mã:
Dim Arr() as Long
Redim Arr(1 to 3, 1 to 10)
Arr(1, 1) = 123456789

Thì với

Mã:
Erase Arr
MsgBox Arr(1, 1)

bạn có lỗi khi truy cập Arr(1, 1) do mảng Arr đã bị hủy diệt.

Mà bạn dùng từ "xóa sạch" thì hơi trừu tượng. Thế nào là "xóa sạch"? Thay cho từ "xóa sạch" thì nên dùng "thiết lập giá trị mặc định".
Thế nào là giá trị mặc định? Khi bạn khai báo
Mã:
Dim a as Long, b as String, c, d as Object

Thì ở thời điểm "chào buổi sáng thì
Mã:
a = 0
b = ""
c = Empty (c là Variant)
d = Nothing
-----------
Về Erase thì:

1. Mảng tĩnh Arr (static array): Erase Arr có nghĩa là set mỗi phần tử của mảng bằng 0, vbNullString, Empty hoặc Nothing tùy theo kiểu của các phần tử. Tức nếu các phần tử là object (lưu giữ địa chỉ của object) thì các đối tượng đó bị hủy diệt. Nhưng bộ nhớ dành cho Arr vẫn thế. Vì vậy sau Erase Arr vẫn có thể truy cập tới các phần tử của Arr và đọc ra giá trị, vd. 0 nếu phần tử là Long. Nếu mảng là tĩnh thì bộ nhớ dành cho mảng luôn tồn tại, không có cách nào để giải phóng bộ nhớ này.

2. Mảng động (dynamic array): Erase Arr có nghĩa là hủy diệt các phần tử nếu nó là object, và bộ nhớ dành cho Arr cũng được giải phóng. Vì vậy sau Erase Arr không thể truy cập được tới các phần tử của Arr (lỗi subscript out of range). Muốn dùng được Arr thì lại phải Redim

Tóm lại có thể yên tâm là nếu các phần tử của mảng là object thì bất kể đó là mảng tĩnh hay động thì Erase cũng hủy diệt các object đó.
--------
1. Những cái bạn viết "người ta" cũng đã viết rồi. "Người ta" có ưu thế hơn bạn là bài của người ta nó nằm ngay "trên đầu" còn của bạn chìm dần, chìm dần.
2. Đúng như bạn HYen17 đã nói. Ngay trong luật có nguyên tắc là cái gì mà luật không nói rõ là cấm thì "ta" có quyền làm. Mọi quá trình tố tụng đều dựa trên các bộ luật cụ thể, các điều luật cụ thể. Công tố viên "cố" buộc tội bằng cách chỉ ra là hành vi đã bị cấm ở mục, điều, bộ luật thế này. Luật sư bào chữa thì cố chỉ ra là hành vi không thuộc điều, bộ luật thế này hoặc không ở mức độ như thế v...v Hành vi không bị luật cấm thì công tố viên buộc tội thế nào? Không theo mục, điều, bộ luật mà chỉ theo "tôi cho là thế"? Làm gì có chuyện đó.
 
Lần chỉnh sửa cuối:
Upvote 0
[HUUDUCTRAN] HỌC VBA ! XEM & PHÁT TRIỂN ! UPDATE LIÊN TỤC

Xin chào anh chị,

Em xin lập topic này để đưa lên các bài học, vấn đề VBA cơ bản

Mời anh chị vào xem

Nếu thấy chỗ nào chưa hay, chưa đúng, chưa hợp lý
anh chị cứ góp ý, cứ nói..., cứ sửa...

Em xin chân thành cảm ơn !
Cám ơn thành viên today100056 rất nhiều, đây quả là một ý tưởng tuyệt vời. Rất mong TV today100056 tiếp tục có những bài viết cho chuyên mục này. Trân trọng cám ơn
 
Upvote 0
[HUUDUCTRAN] HỌC VBA ! XEM & PHÁT TRIỂN ! UPDATE LIÊN TỤC

Xin chào anh chị,

Em xin lập topic này để đưa lên các bài học, vấn đề VBA cơ bản

Mời anh chị vào xem

Nếu thấy chỗ nào chưa hay, chưa đúng, chưa hợp lý
anh chị cứ góp ý, cứ nói..., cứ sửa...

Em xin chân thành cảm ơn !
Cảm ơn bạn vì những chia sẻ rất hữu ích đối với các thành viên GPE! Mong bạn tiếp tục chủ đề của mình.
 
Upvote 0
...

Nếu thấy chỗ nào chưa hay, chưa đúng, chưa hợp lý
anh chị cứ góp ý, cứ nói..., cứ sửa...

Em xin chân thành cảm ơn !

Nhiều chỗ chưa đúng, chưa hợp lý lắm sửa hông hết. chuyện chưa hay thì miễn bàn luôn - phải đúng rồi mới tính qua hay.

Điển hình:

Bài #2: 4. Nếu là var thì dùng <empty>, dùng Empty chỉ xóa sạch các giá trị trong var, var vẫn tồn tại

Bài #3: 2. Sơ lược về Var

trong VBA không có từ khoá nào là Var cả. Tiếng chung để gọi biến là Variable (từ variable dịch ra tiếng Viêt là thay đổi, tức là biến). Một số ngôn ngữ dùng từ khoá var để định tính rằng vật thể này có thể thay đổi được (nếu tôi nhớ không lầm thì trong Pascal, và hình như trong Pascal, nó không viết hoa). Một số ngôn ngữ dùng từ khoá var (không viết hoa) để khai báo biến (var trong JavaScript có thể coi như tương đương với Dim trong VBA).

Riêng trong VBA thì Var không phải là từ khoá. Thử khai báo:
Dim Var
Nếu VBA đẩy ra, không chịu thì Var là từ khoá. Nếu VBA chịu thì Var là một biến (variable); nhưng ở đây vì không có mệnh đề định kiểu nên nó mặc định là Variant, và tuỳ theo sau này bạn gán nó là cái gì thì nó cũng có thể có đặc tính giống Object hay Array.

Lưu ý: có một số ngôn ngữ coi mọi biến đều là object (VB.NET chia ra biến đơn giản và phức tạp). Cho nên khi định nghĩa Object thì cũng cần nhấn mạnh nó trong ngữ cảnh VBA thôi.
 
Upvote 0
Xin chào các bạn,

Cảm ơn các bạn đã quan tâm, chia sẽ !

Mình đã mở 03 topic sau:

1. http://www.giaiphapexcel.com/forum/showthread.php?92266-Các-hàm-Excel
2. http://www.giaiphapexcel.com/forum/showthread.php?92240-huuductran-Bắt-đầu-học-VBA
3. http://www.giaiphapexcel.com/forum/showthread.php?92078-huuductran-code-mẫu-GPE


Và theo đóng góp của một số BQT & một số mem " cằn cõi" thì đã có nhiều bài viết về học VBA, cũng như Hàm Excel

--> Cho nên, tạm thời, mình xin tạm dừng không phát triển topic (1) (2), mà tập trung vào topic chuyên đề sau:

http://www.giaiphapexcel.com/forum/showthread.php?92078-huuductran-code-mẫu-GPE


Trân trọng & Thân ái !
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom