Hỏi cách sử dụng, khai thác thư viện Tools/References

Liên hệ QC

Mutants Men

Thành viên thường trực
Tham gia
30/12/15
Bài viết
394
Được thích
266
Chào mọi người!
theo em tìm trong diễn đàn thì thấy có hai chủ đề này
Tổng quan về FileSystemObject (Thao tác với file, thư mục trên máy tính)
Tổng quan về Scripting.Dictionary (ứng dụng vào lọc duy nhất)

được sử dụng nhờ vào thư viện Microsoft Scripting Runtime, vậy có còn những chủ đề nào sử dụng được các thư viện trong References không?
ví dụ như
CreateObject("Shell.Application") dùng để làm gì, và cách viết lệnh truyền tham số như thế nào
tương tự ADO, DAO (2 cái này em có xem mà chả hiểu vì sao lại viết như thế, vậy có bài nàoTỔNG QUAN giống như 2 chủ đề trên không)
vân... vân... và mây... mây.....

còn cái này Collection theo em nhớ thì cũng tương tự như Dictionary nhưng cũng không biết cách viết code, cũng không biết có điểm hay hay dở hơn Dictionary ở chỗ nào? tại sao lại hay dùng Dictionary hơn là Collection
 
Tất cả mọi đối tượng được tạo ra từ hàm CreateObject bản chất các đối tượng đó đều được Windows phục vụ nhờ vào sự phân phối của các ứng dụng và thư viện, ocx đã đăng ký trong Registry các đối tượng dạng COM (bạn tìm google hiểu COM là gì trong lập trình).

Khi bạn muốn sử dụng các đối tượng COM thì có 2 cách:
Set obj = New TenClass (không có " " nhé) . Muốn khai báo dạng này thì thư viện chứa TenClass phải được References trong menu Tools của VBA.
Muốn không phải khai báo DLL, EXE, OCX trong References thì làm như sau
Set obj = CreateObject("TenThuVien.TenClass")

Trong bộ Office, các phần mềm Word, Excel, Outlook,... đều đăng ký vào Registry tên các thư viện và Class của nó nên từ bất cứ môi trường lập trình nào hỗ trợ COM đều gọi được các ứng dụng và Class của chúng

Ví dụ trong Excel, VBA lập trình mở một Mictosoft Word

Cách 1:

Sub MoWord1
Dim obj As Object
Set obj = CreateObject("Word.Application")
obj.Visible = True

End Sub

Cách 2:
Trong VBA, vào menu Tools->References tìm và chọn tới Word.EXE (để VBA nạp thư viện Word và các Class trong thư viện đó. Bây giờ có thể dùng cách sau:

Sub MoWord2
Dim obj As Object
Set obj = New Word.Application
obj.Visible = True
End Sub

Các ví dụ trên "Word" là tên thư viện của Microsoft Word, "Application" là Class chính nằm trong thư viện "Word".

Trên GPE, mọi người phần lớn biết đến VBA từ việc ứng dụng công thức rồi ứng dụng những cái đã có chứ ít ai học về lập trình để tạo ra thư viện DLL, Class nên khái niệm về lập trình DLL, đối tượng COM/Class, đăng ký thư viện vào Registry rồi sử dụng nó trong môi trường tích hợp RẤT ÍT NGƯỜI BIẾT trên GPE, Những người biết rõ nó chủ yếu đều dân chuyên nghiệp hoặc có một quá trình lập trình hệ thống (với các ngôn ngữ lập trình VB6, Delphi, VC++) đó, chứ không thuần túy chỉ biết VBA đâu (VBA không tạo DLL được). Ngay cả thế hệ SV học IT ngày nay toàn học .NET nên khái niệm về COM hiểu cũng rất mờ nhạt cũng không giải thích nối đấy chứ.

Câu hỏi của bạn ngoài 2,3 ví dụ về dùng Dictionary, FileSystemObject chỉ là 2 Class chứa các hàm và thủ tục làm về file, folder và quản lý danh sách mà thôi. Trong Windows, các phần mềm cài đặt, mỗi ứng dụng lại sinh ra hàng trăm Class, mỗi Class lại có hàng trăm, hàng ngàn hàm và thủ tục,... Như vậy bạn hiểu là có vô số cái mà mọi người chưa dùng đến, vậy nên chỉ có thể dùng đến đâu biết đến đó, không thể liệ kê nhiều cái mà chưa dùng.
 
Upvote 0
Bạn hỏi cách sử dụng Tools/Reference hay hỏi về mấy cái object/class Collection và Dictionary?

Hai vấn đề đó riêng biệt nhau. Cần xác định.
 
Upvote 0
Bạn hỏi cách sử dụng Tools/Reference hay hỏi về mấy cái object/class Collection và Dictionary?

Hai vấn đề đó riêng biệt nhau. Cần xác định.
Em cảm ơn anh đã quan tâm và trả lời!
ý em là cần những chủ đề nói về cách sử dụng các đối tượng trong thư viện Tools/Reference
giống như 2 chủ đề fso và dic nêu trên
và em thấy trên diễn đàn đôi khi có sử dụng Collection và CreateObject("Shell.Application"), nhưng em không biết 2 thứ đó áp dụng để làm vào việc gì
giống như DAO và ADO, theo em biết thì 2 thư viện này để xử lý dữ liệu, nhưng không biết cách viết và truyền tham số như thế nào, tài liệu thì mông lung quá nên nếu có những chủ đề tổng hợp như dic và fso như trên thì tốt quá, thuận tiện cho người đang tìm hiểu như em muốn tìm hiểu.
 
Upvote 0
Server COM, đối tượng COM.
Giả sử bạn lập trình trong Delphi, VC++. Trong ứng dụng của mình bạn tạo ra nhiều đối tượng dùng trong ứng dụng của mình.
Có lúc nào bạn có mơ ước là sẽ tạo một ứng dụng và bạn muốn share những đối tượng trong ứng dụng của mình? Sao cho từ mỗi môi trường lập trình bạn có thể "gọi", "truy cập" tới những đối tượng đó? Vd. ứng dụng của bạn tạo ra đối tượng A có vd. phương thức Sort chuỗi. Nếu từ trong lòng một ứng dụng khác mà ai đó muốn sắp xếp một chuỗi thì họ có thể truy cập tới đối tượng của bạn và gọi phương thức Sort của nó. Nói cho cùng thì lập trình đối tượng chẳng qua là truy cập (tạo) tới đối tượng và đọc/ghi thuộc tính hoặc gọi các phương thức của đối tượng đó.
Nếu bạn có mơ ước như thế thì bạn phải tạo server COM. Các môi trường lập trình vd. như Delphi đều hỗ trợ việc tạo các server COM. Và những server đó sẽ được đăng ký, và các thông tin cần thiết sẽ được Windows ghi trong csdl của mình. Đó chính là Registry.

Các thông tin cần thiết là gì? Tất cả các class (đối tượng. Thực ra class nó giống như cái khuôn mà từ đó sẽ được tạo ra các sản phẩm vd. như những chiếc bánh, cái nồi v...v, và đó là đối tượng. Từ 1 khuôn có thể "đúc" - tạo ra nhiều đối tượng cùng "loại") trong ứng dụng của bạn sẽ được ghi trong Registry. Trong Registry cũng được ghi các đối tượng ABC, XYZ được tạo ra bởi ứng dụng - server nào, và đường dẫn tới các server đó trên đĩa.

VD. class "Scripting.Dictionary".
Bạn chọn Start -> Run -> regedit -> OK. -> menu Edit -> Find -> nhập Scripting.Dictionary
Bạn sẽ thấy như hình 1

và hình 2

VD. bạn muốn có một đối tượng dùng để lọc danh sách duy nhất. Bạn có 2 cách:
1. Bạn chọn Tools -> References -> Microsoft Scripting Runtime ̣(...\scrrun.dll)
Lúc này thì "người ta" đã biết thư viện scrrun.dll có thể tạo những đối tượng nào. Vậy bạn có thể viết
Mã:
Set dic = New Dictionary
thì ở "hậu trường" người ta sẽ gọi server scrrun.dll -> bắt nó tạo ra đối tượng Dictionary -> "dâng" cho bạn đối tượng được tạo. Việc của bạn là sử dụng đối tượng đó. Tức thiết lập các thuộc tính vd. CompareMode, và gọi các phương thức vd. Add, Exists, Keys, Items v...v
Với cách này thì ở thời điểm design time server đã được biết, các thuộc tính và phương thức của các đối tượng mà server có thể tạo cũng đã được biết.
Đây là kết nối sớm.

2. Bạn không thêm reference. Bạn chỉ có thể viết
Mã:
Dim dic As Object
   Set dic = CreateObject("Scripting.Dictionary")
Bởi lúc này "người ta" không thể biết đối tượng mà bạn sẽ tạo do server nào cung cấp, đường dẫn trên đĩa tới server đó như thế nào. Lúc này việc xác định liệu class "Scripting.Dictionary" có tồn tại hay không, đối tượng do server nào tạo ra v...v sẽ được hoãn cho tới thời điểm Run time. Vì thế đây gọi là kết nối trễ.
Việc xác định liệu class "Scripting.Dictionary" có tồn tại hay không, đối tượng do server nào tạo ra v...v sẽ được hoãn cho tới thời điểm Run time bởi ở thời điểm design time không thể xác định, liệu class "Scripting.Dictionary" có tồn tại hay không. Chỉ có thể "tin" bạn mù quáng được thôi chứ rất có thể bạn nhầm chứ. Vd. bạn nhầm thành "Scripting.Dictionare" chẳng hạn. Lúc này "người ta" sẽ tìm trong Registry xem, liệu class "Scripting.Dictionary" có được đăng ký không. Nếu có thì đối tượng do server nào tạo ra, đường dẫn tới server là thế nào. Server sẽ được gọi tới cơ quan và phải hì hục tạo ra đối tượng Dictionary, và nó sẽ được dâng cho bạn.
----------------
Word bản thân đã là một ứng dụng dùng để soạn thảo văn bản, là server COM. Nhưng Word lại share những đối tượng COM của mình và do mình tạo ra. Chính vì thế mà từ trong lòng một ứng dụng khác có thể "truy cập", "tạo" ra các đối tượng của Word, và thiết lập các thuộc tính, gọi các phương thức của các đối tượng đó. Tức điều khiển server Word "từ xa", từ trong lòng một ứng dụng khác. Đây chính là automation. Word là server automation. Excel, Access v...v cũng thế.

CreateObject("Shell.Application") dùng để làm gì, và cách viết lệnh truyền tham số như thế nào
...
ý em là cần những chủ đề nói về cách sử dụng các đối tượng trong thư viện Tools/Reference

CreateObject("Shell.Application") dùng để tạo ra đối tượng Shell. Đối tượng này do thư viện Microsoft Shell Controls And Automation (shell32.dll) tạo ra. Mục đích để dùng các phương thức của đối tượng này. Còn cụ thể nó có những phương thức gì, ý nghĩa ra sao, dùng thế nào thì phải đọc help thôi. Không có người lập trình nào tự dưng biết dùng các hàm API, các phương thức của một đối tượng nào đó. Mỗi người lập trình đều phải đọc đi đọc lại tới khi nát bét các tài liệu (documentation), đọc help. Ngay trong VBE chỉ cần: Tools -> References -> Microsoft Shell Controls And Automation. Sau đó View -> Object Browser -> w ComboBox đầu tiên chỉ chọn thư viện Shell32.

Chọn Shell thì sẽ thấy một loạt phương thức của nó bên nửa phải (hinh3). Nếu không có giải thích gì trong VBE thì có thể tìm đọc trên mạng, trên các trang của Microsoft. Vd. nhập trong google "Shell.Application". Rồi đọc đi đọc lại thôi. Không ai có thời gian và hứng để giải thích, hướng dẫn về tất cả những thư viện mà bạn chọn trong References đâu.
 

File đính kèm

  • hinh1.JPG
    hinh1.JPG
    109.2 KB · Đọc: 68
  • hinh3.JPG
    hinh3.JPG
    136.8 KB · Đọc: 66
  • hinh2.JPG
    hinh2.JPG
    113.6 KB · Đọc: 57
Upvote 0
Ngay cả thế hệ SV học IT ngày nay toàn học .NET nên khái niệm về COM hiểu cũng rất mờ nhạt cũng không giải thích nối đấy chứ.

Tôi không biết trường khác dạy thế nào. Chứ nếu bạn vào trường ĐHBK tpHCM học ngành kỹ sư thì thấy rằng kỹ sư điện tử không nhất thiết phải biết sử dụng định luật Boyle của ngành kỹ sư Hóa hay giải thích hệ số Young của ngành cơ khí và xây dựng

Tương tự như vậy, IT cũng có nhiều ngành. Đẩu tiên là phân biệt giữa software và harware. Riêng software thì cũng chia ra nhiều ngành. Ngành chuyên về toán thì chỉ học cách giải. Ngành chuyên về ứng dụng thì học cách lập trình ứng dụng, vv...

Cái khó nhất là ngành ứng dụng thương mãi. Tại sao? vì những người giỏi về cái này thì họ đâu có đi dạy làm gì. Rốt cuộc lại người dạy chỉ biết đại khái về ứng dụng thương mãi, và không có cách nào để thực tế. Cách duy nhất để cách trường dạy cập nhật là thỉnh thoảng mời GV phụ chuyên ngành về dạy một vài buổi đặc biệt.

Tương tự như vấn đề trên, viết dll là những cách thức chuyên sâu. Trên thực tế, người có căn bản về vận hành máy tính và lập trình rồi thì tự học cái này không khó. Vì vậy các trường ít khí dạy.

.NET là một framework/platform. Cung ứng những COM, dll này nọ cho người sử dụng là một trong những nhiệm vụ của framework. Vì vậy nếu tôi lập trình C# thì tôi không cần phải biết gì về COM cả. Tất cả những kết nối thư viện đều do platform/framework cung ứng sẵn cho tôi. Và tôi chỉ cần học mấy cái giao diện để sử dụng chúng. Trừ phi tôi muốn tự viết thêm mấy cái COM/dll này nọ để hổ trợ phần mềm của tôi - và ngay cả trong trường hợp này, framework cũng hổ trợ tôi gần hết.

Chú thích: nếu bạn có xem qua chương trình dạy tiểu học ở các nước Tây Âu thì sẽ thấy bây giờ người ta có khuynh hướng không dạy con toán chia dài (long division). Tức là trẻ tiểu học chỉ được học cách chia bằng tay với mẫu số từ 2 đến 9; chia 11 trở lên thì bấm máy tính tay (chia 10 thì dùng mẹo).

Em cảm ơn anh đã quan tâm và trả lời!
ý em là cần những chủ đề nói về cách sử dụng các đối tượng trong thư viện Tools/Reference
giống như 2 chủ đề fso và dic nêu trên
và em thấy trên diễn đàn đôi khi có sử dụng Collection và CreateObject("Shell.Application"), nhưng em không biết 2 thứ đó áp dụng để làm vào việc gì
giống như DAO và ADO, theo em biết thì 2 thư viện này để xử lý dữ liệu, nhưng không biết cách viết và truyền tham số như thế nào, tài liệu thì mông lung quá nên nếu có những chủ đề tổng hợp như dic và fso như trên thì tốt quá, thuận tiện cho người đang tìm hiểu như em muốn tìm hiểu.

Tất cả những đối tượng (object/class) đều có cái giao diện để sử dụng. Muốn sử dụng cái nào thì bạn phải học giao diện của cái ấy.
Khi bạn mở một bảng tính lên là bạn gọi cái hàm chính trong giao diện của Excel để nó mở bảng tính cho bạn. Bên trong, Excel có một đống hàm nữa (ví dụ SUM, ...) cũng thuộc về cái giao diện.

Trên thực tế, bạn đâu có cần biết hết các hàm của Excel mà chỉ cần biết vài cái. Sau đó lúc cần chuyên sâu thì học hỏi thêm.

Các objects thư viện cũng vậy. Bạn chỉ cần biết tên, và chỗ ở của chúng là có thể dựng ra. Để sử dụng, bạn chỉ cần biết vài hàm/phương thức căn bản trong giao diện.

Ví dụ: phân tích Set Dic = CreateObject("Scripting.Dictionary")
VBA có một hàm tên là CreateObject để bạn dựng object từ các class trong thư viện. Hàm này trả về một đối tượng có kiểu là cái mà nó dựng.
Lệnh Set = gán cái đối tượng ấy cho biến Dic (tôi nói đơn giản về lệnh gán set thôi, chứ giải thích nó thì mất nửa trang)
Hàm nhận tham số là cái cần dựng, bao gồm tên của class là Dictionnary và chỗ ở của nó là thư viện Scripting.
Lưu ý là ở một máy nào đó, có thể chủ máy viết một class cũng đặt tên là Dictionary và ghi danh cho nó vào thư viện Luxubu thì bạn cũng có thể dùng
Set Dic = CreateObject("Luxubu.Dictionary"); chỉ là cái dictionary này bạn phải hỏi người viết xem cái giao diện nó ra sao.
(ghi danh một cái dll vào registry cũng có thể coi như là làm thủ tục chứng minh nhân dân. Nguyễn A ở HCM khác với Nguyễn A ở Hà nội. Muốn mướn anh nào làm việc cho mình thì phải nêu rõ quê quán)

Tổng quan về FileSystemObject (Thao tác với file, thư mục trên máy tính)
Tổng quan về Scripting.Dictionary (ứng dụng vào lọc duy nhất)
...

tương tự ADO, DAO (2 cái này em có xem mà chả hiểu vì sao lại viết như thế, vậy có bài nàoTỔNG QUAN giống như 2 chủ đề trên không)

Thứ nhất, cái gọi là "Tổng quan" trên chưa hẳn đã đúng với định nghĩa từ "tổng quan". Nếu bạn đọc kỹ, nó còn lệ thuộc vào cái ngữ cảnh của mệnh đề đi sau nó.
Tác giả bài viết trong ngữ cảnh là "ứng dụng vào lọc duy nhất"

Ứng dụng lọc duy nhất chỉ là một ứng dụng nhỏ của Dictionary. Cũng như plastic là sản phẩm phụ của chu trình lọc dầu.
Bởi vì ở đây là ứng dụng Excel, và CSDL cho nên bạn chỉ thấy cái vụ "lọc duy nhất"

Thứ hai, ADO cũng vậy. Với ứng dụng ở đây thì bạn chỉ cần tìm mấy bài cawnn bản bên hộp CSDL thì đủ biết cách lấy dữ liệu rồi.
Cái thực sự giúp bạn làm việc với cái đống dữ liệu kia là căn bản về CSDL LH và ngôn ngữ SQL.
 
Upvote 0
Không ai có thời gian và hứng để giải thích, hướng dẫn về tất cả những thư viện mà bạn chọn trong References đâu.
em cảm ơn anh đã quan tâm! chắc em mới tìm hiểu nên chưa đủ trình độ để hiểu hết những gì anh hướng dẫn.
vậy trong lập trình trên excel thì mình hay sử dụng những thư viện nào? ứng dụng nó thì làm được những việc gì anh?
như dic thì ứng dụng vào lọc duy nhất. vậy còn có thể ứng dụng vào việc gì nữa anh
fso thì thao tác với file và folder. vậy còn có thể ứng dụng vào việc gì nữa không anh.
2 vấn đề trên thì đã có chủ đề hướng dẫn cách viết code
vậy còn dao và ado thì em thấy cũng có vài bài nhưng không có hướng dẫn chi tiết về cú pháp và truyền tham số như thế nào (hi vọng có chủ đề hướng dẫn về vấn đề này như 2 chủ đề được nêu ở #1)
Thứ nhất, cái gọi là "Tổng quan" trên chưa hẳn đã đúng với định nghĩa từ "tổng quan". Nếu bạn đọc kỹ, nó còn lệ thuộc vào cái ngữ cảnh của mệnh đề đi sau nó.
Tác giả bài viết trong ngữ cảnh là "ứng dụng vào lọc duy nhất"
Ứng dụng lọc duy nhất chỉ là một ứng dụng nhỏ của Dictionary. Cũng như plastic là sản phẩm phụ của chu trình lọc dầu.
Bởi vì ở đây là ứng dụng Excel, và CSDL cho nên bạn chỉ thấy cái vụ "lọc duy nhất"
Thứ hai, ADO cũng vậy. Với ứng dụng ở đây thì bạn chỉ cần tìm mấy bài căn bản bên hộp CSDL thì đủ biết cách lấy dữ liệu rồi.
Cái thực sự giúp bạn làm việc với cái đống dữ liệu kia là căn bản về CSDL LH và ngôn ngữ SQL.
như anh nói ở trên thì Dic có thể được ứng dụng vào lọc duy nhất, vậy ứng dụng các việc khác là việc gì anh?
theo em thấy thì hình như ADO vào DAO dùng để quản lý và xử lý dữ liệu
vậy anh có thể hướng dẫn cách ứng dụng, cách viết lệnh như thế nào không? như 2 bài tổng quan về dic và fso như trên
-------------------------------------------------------------------------
với cho em hỏi cái này ngoài lề tí, về việc viết câu lệnh Dic
Mã:
Sub VD1()
    Dim Dic As Scripting.Dictionary, ObjFile As Object
    Set Dic = New Scripting.Dictionary
        With Dic
        .Add "a", "c"
        .Key(.Keys(0)) = "b"' chữ "a" thành chữ "b"
        End With
        Set Dic = Nothing
End Sub
Sub VD2()
    Dim Dic As Object
    Set Dic = CreateObject("Scripting.Dictionary")
        With Dic
        .Add "a", "c"
        .Key(.Keys(0)) = "b" 'báo lôi~
        End With
        Set Dic = Nothing
End Sub
cùng lệnh với nhau, chỉ khác cách khai báo tại sao ở VD2 lại bị lỗi. nếu như em muốn đổi chữ "a" thành "b" thì làm thế nào, nếu không check vào thư viện.
 
Upvote 0
với cho em hỏi cái này ngoài lề tí, về việc viết câu lệnh Dic
Mã:
Sub VD1()
    Dim Dic As Scripting.Dictionary, ObjFile As Object
    Set Dic = New Scripting.Dictionary
        With Dic
        .Add "a", "c"
        .Key(.Keys(0)) = "b"' chữ "a" thành chữ "b"
        End With
        Set Dic = Nothing
End Sub
Sub VD2()
    Dim Dic As Object
    Set Dic = CreateObject("Scripting.Dictionary")
        With Dic
        .Add "a", "c"
        .Key(.Keys(0)) = "b" 'báo lôi~
        End With
        Set Dic = Nothing
End Sub
cùng lệnh với nhau, chỉ khác cách khai báo tại sao ở VD2 lại bị lỗi. nếu như em muốn đổi chữ "a" thành "b" thì làm thế nào, nếu không check vào thư viện.
Tôi không dám khẳng định là đúng thế, nhưng theo tôi thì:

1. Trong th 1 trình dịch biết rõ Keys là phương thức, vì thư viện được "đính kèm", mọi thứ nhìn rõ mồn một như trên lòng bàn tay.
2. Trong th 2 vì là kết nối trễ nên trình dịch có khó khăn. Nó không biết sẽ phải hiểu Keys là phương thức (method) hay thuộc tính (property) của đối tượng Dic. Nó sẽ thấy bối rối.

Do ta biết chắc chắn Keys là phương thức (hàm không có tham số) thì thay vì
Mã:
.Key(.Keys(0)) = "b"
phải viết
Mã:
.Key(.Keys()(0)) = "b"

hoặc
Mã:
tu_khoa = .Keys
.Key(tu_khoa(0)) = "b"
 
Lần chỉnh sửa cuối:
Upvote 0
Chạy thử code này:
Sub t()
Debug.Print TypeName(f(1)), TypeName(f()(1)), TypeName(f()) ' in ra: Integer, Integer, Integer()

' kết quả của f(1) và f()(1) có kiểu là integer, kết quả của f() có kiểu là mảng integers
End Sub
Function f()
Dim a(1 To 2) As Integer
f = a
End Function


Giải thích: VBA cho phép ngầm hiểu dấu () trong một số trường hợp. Trường hợp gọi f(1) ở trên là một

Trở lại cái Keys của dictionary

Dùng Keys()(0) mới là cách đúng.
Viết tắt Keys(0) là cách nguy hiểm.

Sở dĩ VD1 thoát là vì VBA hiểu ngầm ().
Trong VD1, đối tượng được kết nói sớm. Khi COM kết nối sớm thì cái giao diện của nó đưa ra cái bảng gọi là v-table. Trình dịch dựa vào bảng này để tìm hàm/phương thức hoặc thuộc tính, và cũng kết nói sớm luôn. Ở đây, cái trình dịch cần tìm là một phương thức có tên là Keys và không nhận tham số, và COM trả lời ok, và kết nối thành công. Khi code chạy thì hàm này trả về một collection/array. Code dùng toán tử (0) để chọn cái phần tử thứ 0

Trong VD2, đối tượng kết nối trễ cho nên VBA khong có cái bảng v-table đẻ kết nối các lần gọi hàm và thuộc tính. Các lần gọi sẽ đều kết nói trễ. Tức là đến lúc code chạy mới đưa vào hỏi COM rằng "thử tìm cho tôi một hàm tên Keys và nhận tham là loại số [cái (0) nói lên điều này]; nếu không thấy thì tìm cho tôi một thuộc tính tên Keys và có kiểu là collection/array". COM không có hàm tên Keys và nhận tham số và cũng chả có thuộc tính tên Keys với kiểu yêu cầu. Thế là lỗi. Code không thể đoán trước Keys là gì để hiểu ngầm dấu ()

Kết luận: khong nên dựa vào đặc tính hiểu ngầm của VBA để viết code.
 
Upvote 0
Tôi không dám khẳng định là đúng thế, nhưng theo tôi thì:

1. Trong th 1 trình dịch biết rõ Keys là phương thức, vì thư viện được "đính kèm", mọi thứ nhìn rõ mồn một như trên lòng bàn tay.
2. Trong th 2 vì là kết nối trễ nên trình dịch có khó khăn. Nó không biết sẽ phải hiểu Keys là phương thức (method) hay thuộc tính (property) của đối tượng Dic. Nó sẽ thấy bối rối.

Do ta biết chắc chắn Keys là phương thức (hàm không có tham số) thì thay vì
Mã:
.Key(.Keys(0)) = "b"
phải viết
Mã:
.Key(.Keys()(0)) = "b"

hoặc
Mã:
tu_khoa = .Keys
.Key(tu_khoa(0)) = "b"

Cho Em hỏi, Em hiểu như thế này là đúng không ạ.
Em đọc trong Object Browser như thế này.

Mã:
Function Keys()
    Member of Scripting.Dictionary
    Get an array containing all keys in the dictionary.

Có phải là đầu tiền Keys() nó sẽ tạo ra một cái mảng ví dụ Arr, số (0) ngoài sau để Arr nó nhận biết là trả về giá trị bao nhiêu trong mảng phải không ạ?

Mã:
Property Key(Key)
    Member of Scripting.Dictionary
    Change a key to a different key.

Sau đó đưa giá trị mà mảng trả về vào trong Thuộc tính của Key.
 
Upvote 0
Phương thức Keys() trả về một mảng, có chỉ số tính từ 0 - mảng các key có trong từ điển.
Keys()(0) là phần tử đầu tiên của mảng Keys(), tức là một key - từ khóa
Key("từ khóa hiện có") - Key là thuộc tính của từ điển, cho phép thay một "từ khóa hiện có" bằng một từ khóa khác. Chú ý là cho phép thay đổi tức chỉ cho phép ghi
Mã:
Dic.Key("từ khóa hiện có") = "từ khóa mới"
chứ không cho phép đọc. Tức không thể đọc ra để nhập vào một biến nào đó. Tức
Mã:
d = .Key("từ khóa hiện có")
sẽ có lỗi.
Không cho đọc cũng dễ hiểu thôi. Vì sẽ chả có nhu cầu đọc ra. Vì từ khóa của "từ khóa hiện có" chính là "từ khóa hiện có" rồi còn gì.
Thuộc tính cho đọc là thuộc tính có Property GET
Mã:
Property Get blala(...) ...
...
End Property
Thuộc tính cho ghi là thuộc tính có Property LET hoặc SET (dùng với đối tượng)
Mã:
Property Let blala(...)
...
End Property

Property Set blala(...)
...
End Property

Nếu bạn viết code và tạo đối tượng của mình (Insert -> Class) thì rất có thể đối tượng của bạn sẽ có một thuộc tính nào đó cho phép đọc và ghi, còn thuộc tính khác chỉ cho phép ghi, và thuộc tính khác nữa chỉ cho phép đọc.

Về từ điển thì thuộc tính Item lại cho phép đọc và ghi
Mã:
With Dic
    .Add "a", "c"
'    doc Item hien hanh duoc gan cho tu khoa "a" - do chinh la "c"
    Range("A1").Value = "Item duoc gan cho tu khoa [a] la: " & .Item("a")
'    ghi Item moi cho tu khoa "a"
    .Item("a") = "hic hic"
'    doc Item hien hanh duoc gan cho tu khoa "a" - do chinh la "hic hic"
    Range("A2").Value = "Item duoc gan cho tu khoa [a] la: " & .Item("a")
End With
-----------
Về code
Mã:
With Dic
        .Add "a", "c"
        .Key(.Keys()(0)) = "b"
End With
1. Từ khóa "a" được thêm vào từ điển với item đi kèm là "c"
2. .Keys() trả về mảng chỉ có 1 từ khóa là "a"
3. .Keys()(0) trả về từ khóa đầu tiên trong mảng từ khóa .Keys(). Đó chính là từ khóa "a"
4. .Key(.Keys()(0)) = "b" -> .Key("a") = "b". Tức thay từ khóa "a" thành từ khóa "b". Hậu quả sẽ là: trước đó item "c" đi kèm với từ khóa "a" thì bây giờ item "c" sẽ đi kèm với từ khóa "b"

Tất nhiên thay từ khóa nào đó bằng từ khóa khác nhưng đã có trong từ điển thì sẽ có lỗi. Vì trong từ điển các từ khóa không được trùng.
Và tất nhiên chỉ thay đổi được từ khóa đang tồn tại trong từ điển. Tức
Mã:
.Keys("e") = b
sẽ có lỗi vì hiện tại từ khóa "e" không có trong từ điển.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom