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.
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.
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
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.
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.
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.
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.
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.
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.