88 Ø Ø Các lớp (class) chính trong mô hình FSO: Tên lớp Mô tả Ghi chú FileSystemObject Đối tượng quản lý trong mô hình FSO Tham khảo trong Object Browser hoặc Help. Drive Đối tượng ổ đĩa Folder Đối tượng thư mục File Đối tượng tập tin TextStream Đối tượng luồng dữ liệu (dạng text) phục vụ việc thao tác với dữ liệu trong tập tin Ø Ø Các phương thức chính của lớp FileSystemObject phục vụ cho thao tác tập tin Tên phương thức Mô tả Ghi chú CopyFile Sao chép tập tin DeleteFile Xoá tập tin Tham khảo Object Browser MoveFile Di chuyển tập tin Tham khảo Object Browser FileExists Kiểm tra sự làm việc của tập tin Trả về giá trị Boolean CreateTextFile Tạo tập tin mới (dạng text) Trả về đối tượng kiểu TextStream GetFile Nhận về một tập tin đã có Trả về đối tượng kiểu File OpenTextFile Mở một tập tin dạng text để làm việc Trả về đối tượng kiểu TextStream Ø Ø Các phương thức của lớp TextStream Tên phương thức Mô tả Ghi chú Read Đọc một xâu dữ liệu trong tập tin Trả về dữ liệu kiểu String ReadLine Đọc một dòng dữ liệu trong tập tin Trả về dữ liệu kiểu String ReadAll Đọc toàn bộ dữ liệu trong tập tin Trả về dữ liệu kiểu String Skip Bỏ qua một xâu dữ liệu trong tập tin Trả về đối tượng kiểu TextStream SkipLine Bỏ qua một dòng dữ liệu trong tập tin Write Ghi một xâu dữ liệu vào trong tập tin WriteLine Ghi một xâu dữ liệu thành một dòng trong tập tin WriteBlankLines Chèn một dòng trống vào trong tập tin Close Đóng luồng dữ liệu. TrìnhtựlàmviệcvớidữliệucủatậptintheomôhìnhFSO 1. Tạo đối tượng <FSO> thuộc lớp FileSystemObject nhằm quản lý tập tin, thư mục hoặc ổ đĩa theo cú pháp sau: Dim FSO As New FileSystemObject Hoặc: Set FSO = CreateObject("Scripting.FileSystemObject") C C H H Ư Ư Ơ Ơ N N G G I I I I I I : : C C Ơ Ơ B B Ả Ả N N V V Ề Ề N N G G Ô Ô N N N N G G Ữ Ữ L L Ậ Ậ P P T T R R Ì Ì N N H H V V I I S S U U A A L L B B A A S S I I C C 89 Trong đó: <FSO> là tên của đối tượng (chính là tên biến), mà dựa vào nó ta sẽ thao tác với tập tin. 2. Tạo đối tượng <TxtStr> thuộc lớp TextStream nhằm phục vụ cho việc thao tác với dữ liệu trong tập tin theo cú pháp sau: Dim TxtStr As New TextStream 3. Thao tác với dữ liệu với đối tượng TxtStr. 4. Đóng luồng dữ liệu để kết thúc thao tác theo cú pháp sau TxtStr.Close CHÚ Ý Hai cách khai báo biến đối tượng sau là tương đương nhau: Dim FSO As New FileSystemObject Và: Dim FSO As FileSystemObject Set FSO = New FileSystemObject 13.3.1. Tạo tập tin mới Sử dụng phương thức CreateTextFile để tạo tập tin mới và mở sẵn nó cho các thao tác đọc/ghi. Cú pháp như sau: Set TxtStr=FSO.CreateTextFile(FileName,[Overwrite],[Unicode]) Trong đó: Ø Ø FileName: tên của tập tin cần tạo, kiểu String, phải bao gồm đầy đủ đường dẫn để xác định vị trí của tập tin, nếu chỉ có tên tập tin thì tập tin này sẽ được tạo vào thư mục mặc định. Ø Ø [Overwrite]: lựa chọn có ghi đè hay không trong trường hợp tập tin đã có. Tham số này là tuỳ chọn và có kiểu là Boolean, giá trị mặc định là True (cho phép ghi đè). Nếu đặt tham số này là False và tập tin đã có thì sẽ phát sinh lỗi và làm dừng chương trình. Ø Ø [Unicode]: lựa chọn có sử dụng bảng mã Unicode trong tập tin hay không. Tham số này là tuỳ chọn và có kiểu là Boolean, giá trị mặc định là False. Ví dụ sau sẽ tạo ra tập tin Test.txt trong ổ đĩa C, nếu tập tin này đã có, nó sẽ bị ghi đè lên, nghĩa là các thông tin cũ sẽ bị xóa hết: Dim FSO As New FileSystemObject Dim TxtStr As TextStream Set TxtStr=FSO.CreateTextFile(“C:\Test.txt”,True,True) 13.3.2. Mở tập tin đã có để thao tác Khi muốn làm việc với một tập tin đã có (đọc/ghi), sử dụng cú pháp sau: Set TxtStrObj=FSO.OpenTextFile(FileName,[IOMode],[Create],[Format]) Trong đó: Ø Ø FileName: Tên và vị trí của tập tin (kiểu String). 90 Ø Ø [IOMode]: Kiểu thao tác với tập tin. Tham số này là tuỳ chọn, có thể nhận một trong 3 giá trị sau: ForAppending (hoặc 8): thêm dữ liệu vào cuối tập tin đã có. ForReading (hoặc 1): đọc dữ liệu từ tập tin. Đây là giá trị mặc định của tham số. ForWriting (hoặc 2): ghi dữ liệu vào tập tin. Ø Ø [Create]: Tùy chọn có tạo tập tin hay không trong trường hợp tập tin chưa tồn tại. Nó có kiểu là Boolean, giá trị mặc định là False. Ø Ø [Format]: tham số tuỳ chọn, chỉ cách mở tập tin theo định dạng. Tham số này có thể nhận một trong 3 giá trị sau: TristateUseDefault (hoặc -2): mở tập tin theo định dạng chuẩn của hệ thống. TristateTrue (hoặc -1): mở tập tin với định dạng Unicode. TristateFalse (hoặc 0): mở tập tin với định dạng theo chuẩn ASCII. Đây là giá trị mặc định của tham số. Trong quá trình đọc dữ liệu từ tập tin, phải luôn chắc chắn rằng vị trí con trỏ đọc dữ liệu không ở cuối tập tin bởi điều này sẽ làm phát sinh lỗi. Để kiểm tra xem vị trí con trỏ đọc dữ liệu đã ở cuối tập tin chưa, dùng thuộc tính AtEndOfStream của lớp TextStream. Thuộc tính này trả về giá trị True nếu ở cuối, trả về false nếu chưa. Ví dụ: đoạn chương trình sau sẽ đọc nội dung của tập tin “C:\file1.txt” và in ra cửa sổ Immediate. Sub FSOReadFile() Dim FSO As New FileSystemObject Dim TxtStr As TextStream Dim StrTemp As String If FSO.FileExists("C:\file1.txt") Then Set TxtStr = FSO.OpenTextFile("C:\file1.txt", ForReading) Do While Not (TxtStr.AtEndOfStream) StrTemp = TxtStr.ReadLine Debug.Print StrTemp Loop TxtStr.Close Else MsgBox "Tap tin không co hoac Duong dan sai",vbCritical,"Thong bao" End If End Sub Kết quả thực thi đoạn chương trình trên như sau: Những thao tác khác như Copy, Move, Delete hay làm việc với thư mục không được đề cập trong giáo trình này, tuy nhiên người đọc có thể tìm hiểu trong các tài liệu tham khảo nêu ở cuối giáo trình này hoặc trong Help Online của VBA IDE. Tập tin Kết quả C C H H Ư Ư Ơ Ơ N N G G I I I I I I : : C C Ơ Ơ B B Ả Ả N N V V Ề Ề N N G G Ô Ô N N N N G G Ữ Ữ L L Ậ Ậ P P T T R R Ì Ì N N H H V V I I S S U U A A L L B B A A S S I I C C 91 14. Gỡ rối và bẫy lỗi trong VBAIDE Trong quá trình xây dựng một dự án phần mềm, việc gặp các lỗi là không thể tránh khỏi. Vì vậy, việc tìm và xử lý lỗi là điều tất yếu. Trình tự của công việc này như sau: 1. Tìm và phân loại lỗi. 2. Tìm kiếm vị trí mã lệnh phát sinh lỗi. 3. Sửa lỗi. 4. Ngăn chặn lỗi có thể xảy ra trong tương lai (bẫy lỗi). 14.1. Phân loại lỗi trong lập trình Các lỗi có thể được phân loại như sau: Ø Ø Lỗi cú pháp (Syntax Error): là các lỗi phát sinh do viết mã lệnh sai quy tắc. Ví dụ: đặt tên biến trùng từ khoá, viết sai từ khoá,… Tuy nhiên trong VBA IDE, các lỗi cú pháp được hạn chế rất nhiều nhờ các tính năng phát sinh mã lệnh tự động, gợi ý mã lệnh hoặc tự động kiểm tra cú pháp của mã lệnh. Một chương trình chỉ chạy khi không còn lỗi cú pháp. Ø Ø Lỗi khi chạy chương trình (Runtime Error): là các lỗ i phát sinh trong khi chương trình đang chạy. Đây là một loại lỗi mà nguyên nhân gây lỗi rất đa dạng cho nên việc phát hiện và sửa chữa lỗi loại này khá khó khăn. Ví dụ như lỗi do tràn bộ nhớ, các tài nguyên mà chương trình cần sử dụng không có trong hệ thống,… Các lỗi thực thi thường dẫn tới sự chấm dứt hoạt động của chương trình, thậm chí của toàn bộ hệ thống. Ø Ø L ỗi do giải thuật: là các lỗi xảy ra do thuật toán hoặc do việc cài đặt và sử dụng các thuật toán chưa đúng. Các lỗi giải thuật thường dẫn tới kết quả xử lý của chương trình bị sai, trong nhiều trường hợp các lỗi giải thuật cũng có thể là nguyên nhân làm phát sinh các lỗi thực thi. VBA IDE không thể phát hiện được các lỗi loại này mà phải do người lập trình hoặc người sử dụng chươ ng trình mới tìm ra được. Vì vậy, đây là loại lỗi khó phát hiện và khắc phục nhất. 14.2. Gỡ rối trong lập trình Các lỗi cú pháp có thể được khắc phục khá dễ dàng do người lập trình được thông báo của trình biên dịch ngay trong quá trình viết mã lệnh (tham khảo thêm mục “Các trợ giúp về cú pháp trong quá trình viết mã lệnh” trang 25 và “Tính năng gợi nhớ và tự hoàn thiện mã lệnh” trang 26). Ngoài ra, cũng có một số lỗi về cú pháp mà VBA IDE không thể phát hiện ngay lúc viết mã lệnh được, với những trường hợp này, thông thường ngay trước khi chương trình được thực thi, VBA IDE sẽ báo lỗ i với người dùng. Do các lỗi cú pháp rất dễ dàng được phát hiện nên phần này sẽ tập trung vào các tính năng dùng để phát hiện lỗi thực thi và lỗi giải thuật. 14.2.1. Phát hiện lỗi lúc thực thi Đối với các lỗi phát sinh lúc thực thi chương trình, VBA IDE sẽ tự động dừng chương trình và hiển thị thông báo lỗi, sau đó cho phép người dùng lựa chọn kết thúc chương trình hoặc tiếp tục gỡ rối chương trình. Để hiểu rõ hơn tính năng này, nhập đoạn mã lệnh sau vào mô-đun chuẩn của VBA IDE Sub VDLoiThucThi() Dim i As Integer i = InputBox("Nhap so nguyen: ", "VD loi thuc thi") MsgBox i End Sub 92 Đoạn mã lệnh trên sẽ hiển thị hộp thoại InputBox để người dùng nhập một số nguyên, sau đó hiển thị kết quả vừa được nhập vào thông qua hàm MsgBox. Thực thi chương trình con này, sau đó trong hộp thoại vừa hiển thị, nhập vào một chuỗi ký tự là số nguyên, ví dụ là 123, sau đó nhấn OK Ö một hộp thoại khác sẽ hiển thị kết quả vừa nhập. Tiếp tục thực thi chương trình một lần nữa, lần này nhập một chuỗi ký tự không phải là số nguyên, ví dụ là “ABC”, sau đó chọn OK. VBA IDE sẽ hiển thị thông báo lỗi nh ư sau: Hình III-26: Thông báo lỗi phát sinh lúc thực thi chương trình. Trong cửa sổ thông báo lỗi có hiển thị Mã lỗi và Mô tả lỗi để người dùng có thể tra cứu, khắc phục lỗi. Trong ví dụ này, đó là lỗi số 13, lỗi “Type missmatch – Không phù hợp kiểu dữ liệu”. Nếu người dùng chọn nút lệnh End Ö chương trình sẽ kết thúc thực thi. Nếu người dùng chọn nút lệnh Debug, chương trình sẽ dừng lại ngay tại dòng lệnh đã làm phát sinh lỗi trên. VBA IDE sẽ hi ển thị cửa sổ mã lệnh và đánh dấu dòng lệnh nơi phát sinh ra lỗi thực thi. Hình III-27: VBA IDE đánh dấu dòng lệnh làm phát sinh lỗi thực thi. Nhờ có điều này mà người lập trình có thể rõ được nguyên nhân phát sinh lỗi và nơi làm phát sinh lỗi thực thi, để từ đó có được hướng khắc phục hợp lý. 14.2.2. Các phương pháp thực thi mã lệnh Trong các trình biên dịch hiện đại nói chung và VBAIDE nói riêng, người dùng được hỗ trợ rất nhiều thông qua các tính năng gỡ rối như biên dịch theo từng bước, theo các điểm dừng, hiển thị các kết quả trung gian. Tuỳ thuộ c vào mục đích mà người lập trình có thể sử dụng một phương pháp phù hợp hoặc có thể sử dụng phối hợp giữa các phương pháp. Các phương pháp thực thi mã lệnh có thể được truy cập thông qua trình đơn Debug của VBAIDE: . của mã lệnh. Một chương trình chỉ chạy khi không còn lỗi cú pháp. Ø Ø Lỗi khi chạy chương trình (Runtime Error): là các lỗ i phát sinh trong khi chương trình đang chạy. Đây là một loại lỗi. Phát hiện lỗi lúc thực thi Đối với các lỗi phát sinh lúc thực thi chương trình, VBA IDE sẽ tự động dừng chương trình và hiển thị thông báo lỗi, sau đó cho phép người dùng lựa chọn kết thúc chương. thị, nhập vào một chuỗi ký tự là số nguyên, ví dụ là 123, sau đó nhấn OK Ö một hộp thoại khác sẽ hiển thị kết quả vừa nhập. Tiếp tục thực thi chương trình một lần nữa, lần này nhập một chuỗi ký