Trao đổi, hỏi đáp xung quanh chủ đề " Tổng quan về FileSystemObject" (1 người xem)

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

chuot0106

Thành viên gắn bó
Tham gia
20/1/13
Bài viết
2,567
Được thích
1,671
Anh quanghai1969 có mở 1 topic về FileSystemObject rất hay, tuy nhiên những ứng dụng của nó tôi mới chỉ thấy qua các ví dụ rất cơ bản. Vậy tôi mở topic này với mong muốn các thành viên nào biết về FSO có thể chia sẻ cho tôi cũng như các thành viên khác(đặc biệt là anh Hải) về các ứng dụng của FSO qua các ví dụ thực tế hơn. Hoặc các đề tài nào trên GPE liên quan đến FSO thì mong các bạn chia sẻ link.
-------------------------------------------------------------------
Link topic của anh quanghai1969:
http://www.giaiphapexcel.com/forum/showthread.php?95898-Tổng-quan-về-FileSystemObject
 
Anh quanghai1969 có mở 1 topic về FileSystemObject rất hay, tuy nhiên những ứng dụng của nó tôi mới chỉ thấy qua các ví dụ rất cơ bản. Vậy tôi mở topic này với mong muốn các thành viên nào biết về FSO có thể chia sẻ cho tôi cũng như các thành viên khác(đặc biệt là anh Hải) về các ứng dụng của FSO qua các ví dụ thực tế hơn. Hoặc các đề tài nào trên GPE liên quan đến FSO thì mong các bạn chia sẻ link.
-------------------------------------------------------------------
Link topic của anh quanghai1969:
http://www.giaiphapexcel.com/forum/showthread.php?95898-Tổng-quan-về-FileSystemObject

Quá đễ để nghiên cứu nó. Bạn làm như sau:
- Alt + F11 để mở cửa sổ VBA
- Vào Tools\References và check mục "Microsoft Scripting Runtime" rồi bấm OK
- Bây giờ, hãy chèn một module với code:
Mã:
Sub Test()
  Dim FSO As Scripting.FileSystemObject
  Set FSO = New Scripting.FileSystemObject
End Sub
Từ giờ trờ đi, mỗi khi bạn gõ FSO rồi gõ tiếp dấu chấm thì sẽ thấy có 1 tooltip xổ xuống gợi ý cho bạn về các thuộc tính và phương thức liên quan đến biến FSO


Untitled.jpg





Cứ vô tư chọn từng cái mà thí nghiệm. Tất cả các thuộc tính và phương thức đều có gợi ý về cú pháp rõ ràng
(Trước đây tôi toàn học theo cách này và cũng phát hiện ra cách dùng Dictionary từ đây)Untitled.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Anh quanghai1969 có mở 1 topic về FileSystemObject rất hay, tuy nhiên những ứng dụng của nó tôi mới chỉ thấy qua các ví dụ rất cơ bản. Vậy tôi mở topic này với mong muốn các thành viên nào biết về FSO có thể chia sẻ cho tôi cũng như các thành viên khác(đặc biệt là anh Hải) về các ứng dụng của FSO qua các ví dụ thực tế hơn. Hoặc các đề tài nào trên GPE liên quan đến FSO thì mong các bạn chia sẻ link.
-------------------------------------------------------------------
Link topic của anh quanghai1969:
http://www.giaiphapexcel.com/forum/showthread.php?95898-Tổng-quan-về-FileSystemObject

Đừng vội, sau những phần cơ bản sẽ là những phần phức tạp. Cơ bản thì lúc nào cũng chỉ có bấy nhiêu thôi. Nhưng ráp chúng lại với nhau mới là vấn đề.
Nếu nóng vội thì cứ lấy code này về mà thức suy nghĩ nhé
Code này sẽ lấy hết tên file và thư mục chứa trong thư mục chỉ định. Chạy Sub Main nhé
PHP:
Public k As Long, Res(1 To 10000, 1 To 2)
Sub Main()
Dim strPath As String, fso As Object, chk As Boolean
Set fso = CreateObject("Scripting.FileSystemObject")
   chk = Application.FileDialog(msoFileDialogFolderPicker).Show
   If Not chk Then Exit Sub
   strPath = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)
   If Len(strPath) Then Call GetAllFolders(strPath, fso)
   If k Then [A5].Resize(k, 2) = Res
   k = 0
End Sub
PHP:
Sub GetAllFolders(ByVal strFolder As String, ByRef fso As Object)
Dim objFolder As Object, objSubFolder As Object, File
Set objFolder = fso.GetFolder(strFolder)
For Each objSubFolder In objFolder.subfolders
   Call GetAllFolders(objSubFolder.Path, fso)
   For Each File In objSubFolder.Files
      k = k + 1
      Res(k, 1) = fso.getbasename(File)
      Res(k, 2) = fso.GetParentFolderName(File)
   Next
Next objSubFolder
End Sub
 
Upvote 0
Quá đễ để nghiên cứu nó. Bạn làm như sau:
- Alt + F11 để mở cửa sổ VBA
- Vào Tools\References và check mục "Microsoft Scripting Runtime" rồi bấm OK
- Bây giờ, hãy chèn một module với code:
Mã:
Sub Test()
  Dim FSO As Scripting.FileSystemObject
  Set FSO = New Scripting.FileSystemObject
End Sub
Từ giờ trờ đi, mỗi khi bạn gõ FSO rồi gõ tiếp dấu chấm thì sẽ thấy có 1 tooltip xổ xuống gợi ý cho bạn về các thuộc tính và phương thức liên quan đến biến FSO
......................
Cứ vô tư chọn từng cái mà thí nghiệm. Tất cả các thuộc tính và phương thức đều có gợi ý về cú pháp rõ ràng
(Trước đây tôi toàn học theo cách này và cũng phát hiện ra cách dùng Dictionary từ đây)
Rất hay em cảm ơn thầy ạ!

Đừng vội, sau những phần cơ bản sẽ là những phần phức tạp. Cơ bản thì lúc nào cũng chỉ có bấy nhiêu thôi. Nhưng ráp chúng lại với nhau mới là vấn đề.
Nếu nóng vội thì cứ lấy code này về mà thức suy nghĩ nhé
Code này sẽ lấy hết tên file và thư mục chứa trong thư mục chỉ định. Chạy Sub Main nhé
PHP:
Public k As Long, Res(1 To 10000, 1 To 2)
Sub Main()
Dim strPath As String, fso As Object, chk As Boolean
Set fso = CreateObject("Scripting.FileSystemObject")
   chk = Application.FileDialog(msoFileDialogFolderPicker).Show
   If Not chk Then Exit Sub
   strPath = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)
   If Len(strPath) Then Call GetAllFolders(strPath, fso)
   If k Then [A5].Resize(k, 2) = Res
   k = 0
End Sub
PHP:
Sub GetAllFolders(ByVal strFolder As String, ByRef fso As Object)
Dim objFolder As Object, objSubFolder As Object, File
Set objFolder = fso.GetFolder(strFolder)
For Each objSubFolder In objFolder.subfolders
   Call GetAllFolders(objSubFolder.Path, fso)
   For Each File In objSubFolder.Files
      k = k + 1
      Res(k, 1) = fso.getbasename(File)
      Res(k, 2) = fso.GetParentFolderName(File)
   Next
Next objSubFolder
End Sub
Không phải là em nóng vội mà là do anh đưa ra mấy cái ví dụ đơn giản kia em đã thực hành xong cả rồi nên ngứa tay ngứa chân giông như ngày xưa nghiên cứu về Dic vậy.
------------------------------------
Vậy em có mong muốn thế này: Anh Hải, các thầy và các bạn có thể đưa ra các bài tập ở mức đơn giản để em và các bạn khác có thể thực hành được không ạ. Rồi từ từ mới nâng độ khó nên ạ. Em nghĩ đây cũng là mục đích chính của anh hải và cũng là mục đích của ngôi nhà GPE chúng ta ạ!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Không phải là em nóng vội mà là do anh đưa ra mấy cái ví dụ đơn giản kia em đã thực hành xong cả rồi nên ngứa tay ngứa chân giông như ngày xưa nghiên cứu về Dic vậy.
------------------------------------
Vậy em có mong muốn thế này: Anh Hải, các thầy và các bạn có thể đưa ra các bài tập ở mức đơn giản để em và các bạn khác có thể thực hành được không ạ. Rồi từ từ mới nâng độ khó nên ạ. Em nghĩ đây cũng là mục đích chính của anh hải và cũng là mục đích của ngôi nhà GPE chúng ta ạ!
Cứ nhâm nhi code bài 4 đi. Chỉ có đôi ba dòng code nhưng sự liên quan của các dòng này lại rất thú vị đấy. Dám cá với bạn rằng muốn thấu đáo mấy dòng code đó thì bạn mất nhiều thời gian nhá. Không dễ nuốt như Dictionary đâu nghen.
 
Upvote 0
Cứ nhâm nhi code bài 4 đi. Chỉ có đôi ba dòng code nhưng sự liên quan của các dòng này lại rất thú vị đấy. Dám cá với bạn rằng muốn thấu đáo mấy dòng code đó thì bạn mất nhiều thời gian nhá. Không dễ nuốt như Dictionary đâu nghen.
Dạ đêm nay em sẽ ngủ muộn để "ngâm cứu" luôn! Cảm ơn anh!
 
Upvote 0
Không phải là em nóng vội mà là do anh đưa ra mấy cái ví dụ đơn giản kia em đã thực hành xong cả rồi nên ngứa tay ngứa chân giông như ngày xưa nghiên cứu về Dic vậy.
------------------------------------
Vậy em có mong muốn thế này: Anh Hải, các thầy và các bạn có thể đưa ra các bài tập ở mức đơn giản để em và các bạn khác có thể thực hành được không ạ. Rồi từ từ mới nâng độ khó nên ạ. Em nghĩ đây cũng là mục đích chính của anh hải và cũng là mục đích của ngôi nhà GPE chúng ta ạ!

Thì bạn cứ tự nghiên cứ sẽ nhớ lâu hơn
Nói thêm rằng: Dictionary cũng thuộc thằng "Microsoft Scripting Runtime" luôn và bạn có thể dùng cách ở bài 2 để nghiên cứu nó
Mã:
Sub Test()
  Dim Dic As Scripting.Dictionary
  Set Dic = New Scripting.Dictionary
End Sub
 
Upvote 0
Thì bạn cứ tự nghiên cứ sẽ nhớ lâu hơn
Nói thêm rằng: Dictionary cũng thuộc thằng "Microsoft Scripting Runtime" luôn và bạn có thể dùng cách ở bài 2 để nghiên cứu nó
Mã:
Sub Test()
  Dim Dic As Scripting.Dictionary
  Set Dic = New Scripting.Dictionary
End Sub
Đúng là "Độc chiêu" trước đây em không biết cái này nên nghiên cứu Dic mất khá nhiều thời gian. Đúng là có "Thầy" học vẫn nhanh hơn!
 
Upvote 0
Đúng là "Độc chiêu" trước đây em không biết cái này nên nghiên cứu Dic mất khá nhiều thời gian. Đúng là có "Thầy" học vẫn nhanh hơn!

Vậy bạn có tự hỏi rằng: Tại sao người ta không dùng cách khai báo như bài 2 mà lại viết thế này:
Mã:
Sub Test
   Dim Dic as Object
   Set Dic = CreateObject("Scripting.Dictionary")
End Sub
để phải mất công nhớ cú pháp?
 
Upvote 0
Vậy bạn có tự hỏi rằng: Tại sao người ta không dùng cách khai báo như bài 2 mà lại viết thế này:
Mã:
Sub Test
   Dim Dic as Object
   Set Dic = CreateObject("Scripting.Dictionary")
End Sub
để phải mất công nhớ cú pháp?
Dạ em chưa nghĩ tới điều này, chắc phải có lí do nào đó ạ! Mong thầy chỉ dạy.
------------------------------------
Liệu có phải với cách khai báo trên thì khi mang File sang các máy khác thì không cần kích hoạt Micro..........runtime thì code vẫn hoạt động đúng ko ạ???? Còn với cách của thầy thì có lẽ để code chạy cần kích hoạt Micro..........runtime trên máy khác.
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy bạn có tự hỏi rằng: Tại sao người ta không dùng cách khai báo như bài 2 mà lại viết thế này:
Mã:
Sub Test
   Dim Dic as Object
   Set Dic = CreateObject("Scripting.Dictionary")
End Sub
để phải mất công nhớ cú pháp?
Theo em hiểu thì khai báo
Sub Test
Dim Dic as Object
Set Dic = CreateObject("Scripting.Dictionary")
End Sub
Thì khi đem file sang máy khác thì File vẫn hoạt động (không cần check mục "Microsoft Scripting Runtime")
 
Upvote 0
Dạ em chưa nghĩ tới điều này, chắc phải có lí do nào đó ạ! Mong thầy chỉ dạy.

Bởi vì nếu viết theo cách của bài 2 thì có lợi cho bạn (nghiên cứu dễ) nhưng khi bạn đưa code lên và người ta copy về máy người ta thì chắc chắn báo lỗi ---> Vì người ta còn thiếu công đoạn check các mục trong Tools\References
Kinh nghiệm của tôi: Thật tình là tôi cũng chẳng tài nào nhớ nỗi mấy cú pháp của các đối tượng nên tôi sẽ dùng cách ở bài 2 để viết. Sau khi code chạy ngon lành, tôi sẽ khai báo trở lại (dùng CreateObject gì gì đó) cho người khác copy code về chạy được liền (khỏi la làng)
Có nghĩa là đầu tiên tôi sẽ dùng:
Mã:
Sub Test()
  Dim FSO [COLOR=#ff0000]As Scripting.FileSystemObject[/COLOR]
  Set FSO [COLOR=#ff0000]= New Scripting.FileSystemObject[/COLOR]
  '.......................
End Sub
Sau khi test code, thay ngon lành rồi thì sẽ sửa thành:
Mã:
Sub Test()
  Dim FSO [COLOR=#ff0000]As Object[/COLOR]
  Set FSO [COLOR=#ff0000]= CreateObject("Scripting.FileSystemObject")[/COLOR]
  '.......................
End Sub

Chỉ vậy thôi!
---------------------
Ngoài lề: Các cao thủ thường cho rằng cách khai báo như bài 2 sẽ giúp code chạy nhanh hơn (cái này thì tôi chỉ nghe chứ không chắc)
 
Upvote 0
Bởi vì nếu viết theo cách của bài 2 thì có lợi cho bạn (nghiên cứu dễ) nhưng khi bạn đưa code lên và người ta copy về máy người ta thì chắc chắn báo lỗi ---> Vì người ta còn thiếu công đoạn check các mục trong Tools\References
Kinh nghiệm của tôi: Thật tình là tôi cũng chẳng tài nào nhớ nỗi mấy cú pháp của các đối tượng nên tôi sẽ dùng cách ở bài 2 để viết. Sau khi code chạy ngon lành, tôi sẽ khai báo trở lại (dùng CreateObject gì gì đó) cho người khác copy code về chạy được liền (khỏi la làng)
Có nghĩa là đầu tiên tôi sẽ dùng:
Mã:
Sub Test()
  Dim FSO [COLOR=#ff0000]As Scripting.FileSystemObject[/COLOR]
  Set FSO [COLOR=#ff0000]= New Scripting.FileSystemObject[/COLOR]
  '.......................
End Sub
Sau khi test code, thay ngon lành rồi thì sẽ sửa thành:
Mã:
Sub Test()
  Dim FSO [COLOR=#ff0000]As Object[/COLOR]
  Set FSO [COLOR=#ff0000]= CreateObject("Scripting.FileSystemObject")[/COLOR]
  '.......................
End Sub

Chỉ vậy thôi!
Đúng là sáng tạo. Em cảm ơn thầy nhiều ạ!
 
Upvote 0
...
Ngoài lề: Các cao thủ thường cho rằng cách khai báo như bài 2 sẽ giúp code chạy nhanh hơn (cái này thì tôi chỉ nghe chứ không chắc)

Tôi không vỗ ngực xưng cao thủ. Chỉ nói chuyện theo hiểu biết của mình.

Theo nguyên tắc chung của lập trình hướng đối tượng, Object là kiểu căn bản nhất của đối tượng. Mọi lớp (class) đều dựa trên "ông tổ" là lớp Object. Vì vậy mọi đối tượng đèu có thể đóng gói (tiếng trong nghề là boxed) trở lại về kiểu Object. Khi thực sự sử dụng, đối tượng dựa theo nguyên lý tính đa hình (polymorphism) của LTHĐT để tự biết kiểu thực của mình mà gọi các phương thức hay thuộc tính. Tuy nhiên, sử dụng tính đa hình là cách ép trình dịch sử dụng phương pháp kết nối trễ (late binding), lúc chạy mới nối các phương thức và thuộc tính. Trong khi đó, nếu đối tượng được khai báo đúng kiểu ngay từ đầu thì trình dịch sẽ sử dụng phương pháp kết nối sớm (early binding), dịch tới đâu nối tới đó.

Do lý do trên mà theo nguyên tắc, code chạy kết nối trễ chậm hơn kết nối sớm. (điều này cũng đúng cho các biến được khai báo kiểu Variant. Biến Variant kết nối trễ)

Trên thực tế, việc kết nối trễ/sớm rất quan trọng đối với các ngôn ngữ chuyên về tốc độ nhưng không quan trọng lắm đối với VBA.

=== chú thích thêm về kết nối trế/sớm ===

Đó là lý do tại sao khi khai báo "As Scripting.FileSystemObject" thì VBE sẽ cho sử dụng Intellisense. Vì lúc đó trình dịch đã biết kiểu của biến rồi. Mặt khác nếu khai báo "As Object" thì trình dịch chỉ biết nó là một Object, lấy đâu ra chi tiết để Intellisense!
 
Lần chỉnh sửa cuối:
Upvote 0
Bởi vì nếu viết theo cách của bài 2 thì có lợi cho bạn (nghiên cứu dễ) nhưng khi bạn đưa code lên và người ta copy về máy người ta thì chắc chắn báo lỗi ---> Vì người ta còn thiếu công đoạn check các mục trong Tools\References
Kinh nghiệm của tôi: Thật tình là tôi cũng chẳng tài nào nhớ nỗi mấy cú pháp của các đối tượng nên tôi sẽ dùng cách ở bài 2 để viết. Sau khi code chạy ngon lành, tôi sẽ khai báo trở lại (dùng CreateObject gì gì đó) cho người khác copy code về chạy được liền (khỏi la làng)
Có nghĩa là đầu tiên tôi sẽ dùng:
Mã:
Sub Test()
  Dim FSO [COLOR=#ff0000]As Scripting.FileSystemObject[/COLOR]
  Set FSO [COLOR=#ff0000]= New Scripting.FileSystemObject[/COLOR]
  '.......................
End Sub
Sau khi test code, thay ngon lành rồi thì sẽ sửa thành:
Mã:
Sub Test()
  Dim FSO [COLOR=#ff0000]As Object[/COLOR]
  Set FSO [COLOR=#ff0000]= CreateObject("Scripting.FileSystemObject")[/COLOR]
  '.......................
End Sub

Chỉ vậy thôi!

Tôi thì thực hiện hơi khác một chút. Tôi thích sử dụng "thông số chỉ định trình dịch" (Compiler Directives)

Mã:
[COLOR=#008000]' dòng này ở đầu module[/COLOR]
#Const FSO_Referenced = True


Sub Test()
#If FSO_Referenced Then
  Dim FSO As Scripting.FileSystemObject
  Set FSO = New Scripting.FileSystemObject
#Else
  Dim FSO As Object
  Set FSO = CreateObject("Scripting.FileSystemObject")
#End If
  '.......................
End Sub

Sau khi viết xong, chạy thử êm rồi, trước khi giao cho người ta thì comment dòng đầu tiên (đặt dấu nháy '), hoặc sửa thông số thành False

Trình dịch sẽ dựa trên thông số mà dịch các đoạn code khác nhau.
 
Upvote 0
Tôi thì thực hiện hơi khác một chút. Tôi thích sử dụng "thông số chỉ định trình dịch" (Compiler Directives)

Mã:
[COLOR=#008000]' dòng này ở đầu module[/COLOR]
#Const FSO_Referenced = True


Sub Test()
#If FSO_Referenced Then
  Dim FSO As Scripting.FileSystemObject
  Set FSO = New Scripting.FileSystemObject
#Else
  Dim FSO As Object
  Set FSO = CreateObject("Scripting.FileSystemObject")
#End If
  '.......................
End Sub

Sau khi viết xong, chạy thử êm rồi, trước khi giao cho người ta thì comment dòng đầu tiên (đặt dấu nháy '), hoặc sửa thông số thành False

Trình dịch sẽ dựa trên thông số mà dịch các đoạn code khác nhau.
Thầy cho em hỏi ý nghĩa của dấu # ở đầu các câu lệnh với ạ.
 
Upvote 0
Tôi không vỗ ngực xưng cao thủ. Chỉ nói chuyện theo hiểu biết của mình.

Theo nguyên tắc chung của lập trình hướng đối tượng, Object là kiểu căn bản nhất của đối tượng. Mọi lớp (class) đều dựa trên "ông tổ" là lớp Object. Vì vậy mọi đối tượng đèu có thể đóng gói (tiếng trong nghề là boxed) trở lại về kiểu Object. Khi thực sự sử dụng, đối tượng dựa theo nguyên lý tính đa hình (polymorphism) của LTHĐT để tự biết kiểu thực của mình mà gọi các phương thức hay thuộc tính. Tuy nhiên, sử dụng tính đa hình là cách ép trình dịch sử dụng phương pháp kết nối trễ (late binding), lúc chạy mới nối các phương thức và thuộc tính. Trong khi đó, nếu đối tượng được khai báo đúng kiểu ngay từ đầu thì trình dịch sẽ sử dụng phương pháp kết nối sớm (early binding), dịch tới đâu nối tới đó.

Do lý do trên mà theo nguyên tắc, code chạy kết nối trễ chậm hơn kết nối sớm. (điều này cũng đúng cho các biến được khai báo kiểu Variant. Biến Variant kết nối trễ)

Trên thực tế, việc kết nối trễ/sớm rất quan trọng đối với các ngôn ngữ chuyên về tốc độ nhưng không quan trọng lắm đối với VBA.

=== chú thích thêm về kết nối trế/sớm ===

Đó là lý do tại sao khi khai báo "As Scripting.FileSystemObject" thì VBE sẽ cho sử dụng Intellisense. Vì lúc đó trình dịch đã biết kiểu của biến rồi. Mặt khác nếu khai báo "As Object" thì trình dịch chỉ biết nó là một Object, lấy đâu ra chi tiết để Intellisense!
Viết bài kiến thức cao xa quá những Bạn mới là quen với VBA hiểu được chết liền. nếu được đề nghị bạn cho một vài code có VD cơ bản cho các bạn mới làm quen với VBA học với ....cụ thể như ndu hay quanghai1969 đang hướng dẫn đó
xin cảm ơn
 
Upvote 0
Viết bài kiến thức cao xa quá những Bạn mới là quen với VBA hiểu được chết liền. nếu được đề nghị bạn cho một vài code có VD cơ bản cho các bạn mới làm quen với VBA học với ....cụ thể như ndu hay quanghai1969 đang hướng dẫn đó
xin cảm ơn

Nếu bạn bảo anh VetMini viết cho bạn vài ví dụ cơ bản thì e rằng... khó đó (theo tôi biết thì VetMini không có thói quen này)
Các bài viết của anh VetMini luôn ở cấp độ cao. Bạn hiểu cũng tốt mà không hiểu cũng đâu có sao ---> Mai này trình độ bạn nâng lên, bạn hiểu cũng chưa muộn
Tạm thời thì "thấp thủ" như tôi và quanghai1969 giải thích theo kiểu nông dân cho bạn và mọi người cũng đủ rồi --=0
 
Upvote 0
Nếu bạn bảo anh VetMini viết cho bạn vài ví dụ cơ bản thì e rằng... khó đó (theo tôi biết thì VetMini không có thói quen này)
Các bài viết của anh VetMini luôn ở cấp độ cao. Bạn hiểu cũng tốt mà không hiểu cũng đâu có sao ---> Mai này trình độ bạn nâng lên, bạn hiểu cũng chưa muộn
Tạm thời thì "thấp thủ" như tôi và quanghai1969 giải thích theo kiểu nông dân cho bạn và mọi người cũng đủ rồi --=0
Kể ra cũng lạ. Có cao thủ nhưng lại không có thấp thủ hay trung thủ gì cả. Nhưng chả hiểu sao lại có hạ thủ. +-+-+-+
 
Upvote 0
Thầy cho em hỏi ý nghĩa của dấu # ở đầu các câu lệnh với ạ.

Trước khi trả lời, cần phải nhắc lại là code VBA chỉ là mấy dòng text. Để cho những dòng text đó trở thành lệnh chạy thì phải qua trình dịch (compiler)

#Const, #If, #Else, #End If là những lệnh chỉ định (đặt điều kiện) cho trình dịch. Chúng không phải là code.

Trong trường hợp ví dụ bài #15, trình dịch được chỉ thị rằng:
Nếu hằng số FSO_Referenced có trị là True thì dùng phần code "Then", nếu không thì dùng phần code "Else"
(hằng FSO_Referenced cũng thuộc về phần chỉ định trình dịch, không phải là code)

Tại sao phải chỉ định trình dịch?

Ví dụ bạn không có reference "Microsoft Scripting Runtime", và bạn viết code như sau:

Mã:
Const FSO_Referenced = False
 
Sub Test()
If FSO_Referenced Then
  Dim FSO As Scripting.FileSystemObject
  Set FSO = New Scripting.FileSystemObject
Else
  Dim FSO As Object
  Set FSO = CreateObject("Scripting.FileSystemObject")
End If
  '.......................
End Sub

Sẽ gặp lỗi "User-defined type not defined" (trònh dịch không hiểu kiểu Scripting.FileSystemObject
Lý do: mặc dù code phần Then không chạy, nhưng trình dịch vẫn phải dịch chúng. Và sinh lỗi.

Nhưng nếu bạn dùng điều kiện trình dịch:

Mã:
#Const FSO_Referenced = False
 
Sub Test()
#If FSO_Referenced Then
  Dim FSO As Scripting.FileSystemObject
  Set FSO = New Scripting.FileSystemObject
#Else
  Dim FSO As Object
  Set FSO = CreateObject("Scripting.FileSystemObject")
#End If
  '.......................
End Sub

Thì không bị lỗi. Vì trình dịch đã được chỉ định để sử dụng phần "Else" và bỏ qua phần "Then", không hề dịch.


Viết bài kiến thức cao xa quá những Bạn mới là quen với VBA hiểu được chết liền. nếu được đề nghị bạn cho một vài code có VD cơ bản cho các bạn mới làm quen với VBA học với ....cụ thể như ndu hay quanghai1969 đang hướng dẫn đó
xin cảm ơn

Cách làm việc của trình dịch chỉ là lý thuyết, không phải bậc cao. Phần chỉ định trình dịch (#If, #Else) là lý thuyết sơ cấp. Riêng phần kết nối (late/early bindings) thì thuộc về lý thuyết trung cấp, cũng không phải là cao. Bạn nghĩ nó là kiến thức cao là vì bạn quen học theo lối thực hành và bỏ qua lý thuyết.

Thực ra VBA là ngôn ngữ thực hành. Lý thuyết không quan trọng lắm.

Ví dụ ta có con toán nhân 4567 * 123. Ta được dạy từ lớp 2 như ssu:
456 * 3 = 1368; viết 1368
456 * 2 = 912; viết 912 dưới 1368 và lệch về bên trái 1 đơn vị
456 * 1 = 456; viết 456 dưới 912 và lệch về bên trái 1 đơn vị
cộng 3 dòng trên --> kết quả.
Có bao giờ ta hỏi "tại sao ghi lệch về bên trái? có cách nào làm khác hơn không?". Hầu hết chúng ta đâu cần biết lý do mà cả đời vẫn làm toán nhân ì xèo không sai trật chút nào cả.
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom