khongtu19bk
Thành viên hoạt động
- Tham gia
- 5/12/09
- Bài viết
- 147
- Được thích
- 69
Bài viết dựa trên nguồn:
Được dịch từ:
1. Mở file
Khi mở file excel khác ta dùng hàm Workbooks.Open
Đối với excel, ta có thể mở đồng thời nhiều file excel (workbook), khi đó workbook là đối tượng để chúng ta thao tác.
Ví dụ ta có code như sau:
Chú ý rằng workbook vừa mới được mở thì đó là workbook đang được Active, tức là đang được chờ nhập dữ liệu.
Do đó để không nhầm lẫn với workbook khác, ta cần lấy tên workbook ngay khi nó được mở.
Chương trình trên thực hiện lấy dữ liệu từ workbook được mở và hiện ra thông báo bằng hàm Msgbox.
Tuy nhiên bây giờ chúng ta xét tới một vấn đề khác, đó là file chỉ định mở không tồn tại.
Lúc này macro sẽ báo lỗi.
2. Phớt lờ lỗi để chạy sang dòng lệnh tiếp theo
Để phớt lờ cảnh báo lỗi, chương trình vẫn có thể chạy sang dòng lệnh khác thì ở đầu chương trình chúng ta khai báo
On Error Resume Next
Điều tệ hại sẽ xảy ra, do file tap6c.xlsx không tồn tại, tuy nhiên do bị phớt lờ lỗi, cho nên câu lệnh tiếp theo được thực thi.
Lúc này thay vì wb = tap6c.xlsx, do workbook đang được active chính là file macro cho nên wb sẽ là tên file của macro đang thực thi lệnh.
Và vì thế file macro sẽ bị đóng, như trong video dưới đây.
Vì lệnh On Error Resume Next sẽ phớt lờ toàn bộ lỗi nếu có trong chương trình, điều này sẽ gây khó khăn trong việc phát hiện các lỗi khác mà chúng ta mong muốn xuất hiện nếu bị lỗi thì hãy báo để chúng ta biết.
Trong trường hợp này, chúng ta sẽ sử dụng lệnh On Error Goto 0
Dòng lệnh thứ 4 sẽ không bị báo lỗi do lệnh On Error Resume Next phớt lờ toàn bộ lỗi nếu có trong chương trình.
Tuy nhiên dòng lệnh thứ 5 đã reset lại, nếu có lỗi thì báo như bình thường.
Vì vậy dòng lệnh thứ 6 tạo nên lỗi và ngay lập tức chương trình cảnh báo lỗi mà không phớt lờ nữa.
3. Kiểm tra file có tồn tại hay không trước khi tiến hành mở file.
Từ vấn đề nêu ở trên, chúng ta thấy rằng cần phải kiểm tra file chúng ta dự định mở có thực sự tồn tại hay không, nhằm tránh bị lỗi.
Đoạn code dưới đây sẽ giải quyết vấn đề đó.
Chú ý dòng lệnh số 4 dưới đây.
4. Mở file do người dùng chỉ định.
Chúng ta không chỉ định file được mở ở trong code, có một phương pháp đó là chúng ta sẽ nhận được file cần mở từ sự
lựa chọn của người dùng. Hơn thế nữa, người dùng còn có thể xác thực file thông qua hộp DialBox.
5. Đối sách trong việc đang tồn tại file trùng tên được mở rồi.
Excel cho phép mở đồng thời nhiều workbook (nhiều file excel cùng lúc), nhưng không được trùng tên.
Vì vậy, nếu đã có một file trùng tên được mở trước đó thì lỗi sẽ xảy ra khi ta cố mở một file trùng tên.
Dưới đây là giải pháp, chúng ta sẽ kiểm tra lần lượt từng workbook đang được mở, xem có file nào trùng tên
với file ta dự định mở hay không.
Chúng ta chú ý dòng lệnh If wb.Name = "Book1.xlsx", ghi đầy đủ cả phần định dạng file.
Chúng ta đừng quên điều này, chớ có ghi là If wb.Name = "Book1" .
6. Tổng kết:
Cuối cùng, thuật toán để mở một file của chúng ta là:
//File định mở có tồn tại hay không? -> Không tồn tại: Kết thúc chương trình
//File trùng tên không đang được mở đúng không? -Không-> Kết thúc chương trình
Lời bình người dịch: Có một lần, người ta yêu cầu chúng tôi viết một chương trình VBA. Rồi sau đó chúng tôi nhận phản hồi là chương trình lỗi.
Lý do là, file input đặt mật khẩu, chương trình không mở được file input này nên sinh ra lỗi. Vì vậy, thuật toán ở trên để làm chặt hơn nữa, phải kiểm tra
file có bị đặt mật khẩu hay không? Hoặc bạn phải xác nhận với người yêu cầu, là file của họ có đặt mật khẩu hay không?
Mở một file excel khác và lấy thông tin ở file đó Workbooks.Open
Bài viết dựa trên nguồn: http://officetanaka.net/excel/vba/file/file01.htm 1. Mở file Khi mở file excel khác ta dùng hàm Workbooks.Open Đối với excel, ta có thể mở đồng thời nhiều file excel (workbook), khi đó workbook là đối tượng để chúng ta thao tác. Ví dụ ta có code như sau: Sub Sample1()...
tuhocvba.net
Mã:
http://officetanaka.net/excel/vba/file/file01.htm
1. Mở file
Khi mở file excel khác ta dùng hàm Workbooks.Open
Đối với excel, ta có thể mở đồng thời nhiều file excel (workbook), khi đó workbook là đối tượng để chúng ta thao tác.
Ví dụ ta có code như sau:
Mã:
Sub Sample1()
Workbooks.Open "C:\Users\jpnfriend.net\Desktop\VBA\tap6c.xlsx"
End Sub
Chú ý rằng workbook vừa mới được mở thì đó là workbook đang được Active, tức là đang được chờ nhập dữ liệu.
Do đó để không nhầm lẫn với workbook khác, ta cần lấy tên workbook ngay khi nó được mở.
Mã:
Sub Sample1()
Dim wb As String
Workbooks.Open "C:\Users\jpnfriend.net\Desktop\VBA\tap6b.xlsx"
wb = ActiveWorkbook.Name
MsgBox Workbooks(wb).Sheets(1).Cells(2, 1).Value
Workbooks(wb).Close
End Sub
Tuy nhiên bây giờ chúng ta xét tới một vấn đề khác, đó là file chỉ định mở không tồn tại.
Lúc này macro sẽ báo lỗi.
2. Phớt lờ lỗi để chạy sang dòng lệnh tiếp theo
Để phớt lờ cảnh báo lỗi, chương trình vẫn có thể chạy sang dòng lệnh khác thì ở đầu chương trình chúng ta khai báo
On Error Resume Next
Mã:
Sub Sample1()
Dim wb As String
On Error Resume Next
Workbooks.Open "C:\Users\jpnfriend.net\Desktop\VBA\tap6c.xlsx"
wb = ActiveWorkbook.Name
MsgBox Workbooks(wb).Sheets(1).Cells(2, 1).Value
Workbooks(wb).Close
End Sub
Điều tệ hại sẽ xảy ra, do file tap6c.xlsx không tồn tại, tuy nhiên do bị phớt lờ lỗi, cho nên câu lệnh tiếp theo được thực thi.
Lúc này thay vì wb = tap6c.xlsx, do workbook đang được active chính là file macro cho nên wb sẽ là tên file của macro đang thực thi lệnh.
Mã:
wb = ActiveWorkbook.Name
Vì lệnh On Error Resume Next sẽ phớt lờ toàn bộ lỗi nếu có trong chương trình, điều này sẽ gây khó khăn trong việc phát hiện các lỗi khác mà chúng ta mong muốn xuất hiện nếu bị lỗi thì hãy báo để chúng ta biết.
Trong trường hợp này, chúng ta sẽ sử dụng lệnh On Error Goto 0
Mã:
Sub Sample1()
Dim wb As String
On Error Resume Next
Workbooks.Open "C:\Users\jpnfriend.net\Desktop\VBA\tap6c.xlsx"
On Error GoTo 0
Workbooks.Open "C:\Users\jpnfriend.net\Desktop\VBA\tap6c.xlsx"
wb = ActiveWorkbook.Name
MsgBox Workbooks(wb).Sheets(1).Cells(2, 1).Value
Workbooks(wb).Close
End Sub
Tuy nhiên dòng lệnh thứ 5 đã reset lại, nếu có lỗi thì báo như bình thường.
Vì vậy dòng lệnh thứ 6 tạo nên lỗi và ngay lập tức chương trình cảnh báo lỗi mà không phớt lờ nữa.
Từ vấn đề nêu ở trên, chúng ta thấy rằng cần phải kiểm tra file chúng ta dự định mở có thực sự tồn tại hay không, nhằm tránh bị lỗi.
Đoạn code dưới đây sẽ giải quyết vấn đề đó.
Chú ý dòng lệnh số 4 dưới đây.
Mã:
Sub Sample2()
Dim lk As String
lk = "C:\Users\jpnfriend.net\Desktop\VBA\tap6b.xlsx"
If Dir(lk) = "" Then
MsgBox "File khong ton tai"
Else
Workbooks.Open lk
End If
End Sub
Chúng ta không chỉ định file được mở ở trong code, có một phương pháp đó là chúng ta sẽ nhận được file cần mở từ sự
lựa chọn của người dùng. Hơn thế nữa, người dùng còn có thể xác thực file thông qua hộp DialBox.
Mã:
Sub Sample_tuhocvba()
Dim OpenFileName As String
OpenFileName = Application.GetOpenFilename("File excel,*.xls?")
If OpenFileName <> "False" Then
Workbooks.Open OpenFileName
End If
End Sub
5. Đối sách trong việc đang tồn tại file trùng tên được mở rồi.
Excel cho phép mở đồng thời nhiều workbook (nhiều file excel cùng lúc), nhưng không được trùng tên.
Vì vậy, nếu đã có một file trùng tên được mở trước đó thì lỗi sẽ xảy ra khi ta cố mở một file trùng tên.
Dưới đây là giải pháp, chúng ta sẽ kiểm tra lần lượt từng workbook đang được mở, xem có file nào trùng tên
với file ta dự định mở hay không.
Mã:
Sub Sample5()
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name = "Book1.xlsx" Then
MsgBox "Book1 dang duoc mo" &chr(10) & "Vui long close file Boo1"
Exit Sub
End If
Next wb
Workbooks.Open "C:\Book1.xlsx"
End Sub
Chúng ta chú ý dòng lệnh If wb.Name = "Book1.xlsx", ghi đầy đủ cả phần định dạng file.
Chúng ta đừng quên điều này, chớ có ghi là If wb.Name = "Book1" .
6. Tổng kết:
Cuối cùng, thuật toán để mở một file của chúng ta là:
//File định mở có tồn tại hay không? -> Không tồn tại: Kết thúc chương trình
//File trùng tên không đang được mở đúng không? -Không-> Kết thúc chương trình
Mã:
Sub Sample_tuhocvba2()
Dim buf As String, wb As Workbook
Const Target As String = "C:\Book1.xlsx"
''Kiem tra file ton tai hay khong?
buf = Dir(Target)
If buf = "" Then
MsgBox Target & vbCrLf & "khong ton tai", vbExclamation
Exit Sub
End If
''Kiem tra file trung ten co dang open hay khong
For Each wb In Workbooks
If wb.Name = buf Then
MsgBox buf & vbCrLf & "dang duoc open", vbExclamation
Exit Sub
End If
Next wb
''Mo file
Workbooks.Open Target
End Sub
Lời bình người dịch: Có một lần, người ta yêu cầu chúng tôi viết một chương trình VBA. Rồi sau đó chúng tôi nhận phản hồi là chương trình lỗi.
Lý do là, file input đặt mật khẩu, chương trình không mở được file input này nên sinh ra lỗi. Vì vậy, thuật toán ở trên để làm chặt hơn nữa, phải kiểm tra
file có bị đặt mật khẩu hay không? Hoặc bạn phải xác nhận với người yêu cầu, là file của họ có đặt mật khẩu hay không?
Lần chỉnh sửa cuối: