Cần giúp viết code cho VBA trong trường hợp bị khuyết file excel (4 người xem)

Liên hệ QC

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

hung2412

Thành viên tích cực
Tham gia
5/8/08
Bài viết
929
Được thích
240
Giới tính
Nam
Mình có một vấn đề cần sự giúp đỡ của các bạn GPE, vấn đề như sau:

Mình có một đoạn code:
sub Text()
Windows("1.xls").Activate
Range("A1").Value="Hello"
Windows("2.xls").Activate
Range("A1").Value="Hello"
Windows("3.xls").Activate
Range("A1").Value="Hello"
Windows("4.xls").Activate
Range("A1").Value="Hello"
End sub

Macro trên chạy không có vấn đề gì nếu cả 4 file excel 1.xls, 2.xls, 3.xls, 4.xls mở cùng một lúc. Nhưng nếu bị khuyết 1 số file (Ví dụ: có file 1.xls, 2.xls mà không có file 3.xls, 4.xls) thì Macro trên bị lỗi. Có cách nào để chạy Macro trên không bị lỗi nếu bị khuyết một số file không nhỉ?
 
Mình có một vấn đề cần sự giúp đỡ của các bạn GPE, vấn đề như sau:

Mình có một đoạn code:
sub Text()
Windows("1.xls").Activate
Range("A1").Value="Hello"
Windows("2.xls").Activate
Range("A1").Value="Hello"
Windows("3.xls").Activate
Range("A1").Value="Hello"
Windows("4.xls").Activate
Range("A1").Value="Hello"
End sub

Macro trên chạy không có vấn đề gì nếu cả 4 file excel 1.xls, 2.xls, 3.xls, 4.xls mở cùng một lúc. Nhưng nếu bị khuyết 1 số file (Ví dụ: có file 1.xls, 2.xls mà không có file 3.xls, 4.xls) thì Macro trên bị lỗi. Có cách nào để chạy Macro trên không bị lỗi nếu bị khuyết một số file không nhỉ?
Bạn thử thêm dòng lệnh màu đen vào xem sao?
Mã:
sub Text() 
[B]On Error Resume Next[/B]
Windows("1.xls").Activate
Range("A1").Value="Hello"
Windows("2.xls").Activate
Range("A1").Value="Hello"
Windows("3.xls").Activate
Range("A1").Value="Hello"
Windows("4.xls").Activate
Range("A1").Value="Hello"
End sub
 
Bạn thử thêm dòng lệnh màu đen vào xem sao?
Mã:
sub Text() 
[B]On Error Resume Next[/B]
Windows("1.xls").Activate
Range("A1").Value="Hello"
Windows("2.xls").Activate
Range("A1").Value="Hello"
Windows("3.xls").Activate
Range("A1").Value="Hello"
Windows("4.xls").Activate
Range("A1").Value="Hello"
End sub
Được rồi bạn ơi, mình cảm ơn bạn nhiều.
 
Mình có một vấn đề cần sự giúp đỡ của các bạn GPE, vấn đề như sau:

Mình có một đoạn code:
............................

Macro trên chạy không có vấn đề gì nếu cả 4 file excel 1.xls, 2.xls, 3.xls, 4.xls mở cùng một lúc. Nhưng nếu bị khuyết 1 số file (Ví dụ: có file 1.xls, 2.xls mà không có file 3.xls, 4.xls) thì Macro trên bị lỗi. Có cách nào để chạy Macro trên không bị lỗi nếu bị khuyết một số file không nhỉ?

1/ Để không bị lỗi trong những lần sau nữa thì bạn cần hiểu bản chất vấn đề, dòng Code
Mã:
[COLOR=#000000]Windows("1.xls").Activate
Có nghĩa là "chọn" (Active) cửa sổ file 1.xls tương ứng với các code còn lại 2.xls, 3.xls, 4.xls

Vậy khi bạn không mở một trong số đó (trong 1 section) thì lấy đâu ra cửa sổ mà Active nên lỗi là đúng rồi. Nói đến đây chắc bạn sẽ biết cách khắc phục.

- 2/ Dòng lệnh
Mã:
[/COLOR]On Error Resume Next
[COLOR=#000000]
Có nghĩa là bỏ qua dòng lệnh lỗi, thực hiện dòng tiếp theo. Cái này không tốt nếu thường xuyên dùng vì sẽ chẳng bao giờ biết code lỗi chỗ nào mà sửa

3/ Với bài đơn giản thế này bạn không cần up file vẫn sẽ có người trả lời cho bạn tuy nhiên bạn nên post tại box lập trình và tốt nhất ở chuyên mục gỡ rối code VBA.

[/COLOR]
 
1/ Để không bị lỗi trong những lần sau nữa thì bạn cần hiểu bản chất vấn đề, dòng Code
Mã:
[COLOR=#000000]Windows("1.xls").Activate
[/COLOR]

Có nghĩa là "chọn" (Active) cửa sổ file 1.xls tương ứng với các code còn lại 2.xls, 3.xls, 4.xls

Vậy khi bạn không mở một trong số đó (trong 1 section) thì lấy đâu ra cửa sổ mà Active nên lỗi là đúng rồi. Nói đến đây chắc bạn sẽ biết cách khắc phục.

- 2/ Dòng lệnh
Mã:
Mã:
On Error Resume Next

Có nghĩa là bỏ qua dòng lệnh lỗi, thực hiện dòng tiếp theo. Cái này không tốt nếu thường xuyên dùng vì sẽ chẳng bao giờ biết code lỗi chỗ nào mà sửa

3/ Với bài đơn giản thế này bạn không cần up file vẫn sẽ có người trả lời cho bạn tuy nhiên bạn nên post tại box lập trình và tốt nhất ở chuyên mục gỡ rối code VBA.

Tớ xin ghi nhận ý kiến của bạn, với mục 1 và mục 2 mà bạn góp ý thì có cách nào khác chăng? Tớ Amater lắm nên vui lòng nhờ bạn nói rõ hơn được không?
 
Tớ xin ghi nhận ý kiến của bạn, với mục 1 và mục 2 mà bạn góp ý thì có cách nào khác chăng? Tớ Amater lắm nên vui lòng nhờ bạn nói rõ hơn được không?
Cách khác thì phaỉ biết yêu cầu cụ thể mới tư vấn được bạn ah.
Bạn có thể tìm trên diễn đàn tài liệu về Active Window để hiểu rõ hơn.
 
Cách khác thì phaỉ biết yêu cầu cụ thể mới tư vấn được bạn ah.
Bạn có thể tìm trên diễn đàn tài liệu về Active Window để hiểu rõ hơn.
Thế ư? Như bạn nói "tài liệu về Active Window" thì nằm ở đâu nhỉ? Tớ không biết tìm như thế nào, bạn có thể up đường dẫn được không hả bạn?
 
Thế ư? Như bạn nói "tài liệu về Active Window" thì nằm ở đâu nhỉ? Tớ không biết tìm như thế nào, bạn có thể up đường dẫn được không hả bạn?
Bạn làm theo 2 cách sau:

1/ Gõ ActiveWindow trên cửa sổ tìm kiếm diễn đàn rồi mò mẫm các bài viết rồi tìm hiểu
2/ tại cửa sổ VBA bạn có code tại bài #1, bôi đen chữ Active rồi bấm F1, sẽ cho bạn 1 kho tài liệu chuẩn Microsoft để bạn ngâm cứu.
 
Bạn thử thêm dòng lệnh màu đen vào xem sao?
Mã:
sub Text() 
[B]On Error Resume Next[/B]
Windows("1.xls").Activate
Range("A1").Value="Hello"
Windows("2.xls").Activate
Range("A1").Value="Hello"
Windows("3.xls").Activate
Range("A1").Value="Hello"
Windows("4.xls").Activate
Range("A1").Value="Hello"
End sub
Bạn ơi, thêm cái dòng "On Error Resume Next" thì đúng nếu chỉ đánh vào ô A1 cùng một dữ liệu là "Hello", còn nếu như đề bài như thế này thì không ổn:
Sub Text()
On Error Resume Next
Windows("1.xls").Activate
Range("A1").Value = "Hello"
Windows("2.xls").Activate
Range("A1").Value = "Good bye"
Windows("3.xls").Activate
Range("A1").Value = "No thing"
Windows("4.xls").Activate
Range("A1").Value = "See you again"
End Sub
=> Chạy không đúng như theo lập trình. Làm thế nào đây bạn ơi.
 
Bạn ơi, thêm cái dòng "On Error Resume Next" thì đúng nếu chỉ đánh vào ô A1 cùng một dữ liệu là "Hello", còn nếu như đề bài như thế này thì không ổn:
Sub Text()
On Error Resume Next
Windows("1.xls").Activate
Range("A1").Value = "Hello"
Windows("2.xls").Activate
Range("A1").Value = "Good bye"
Windows("3.xls").Activate
Range("A1").Value = "No thing"
Windows("4.xls").Activate
Range("A1").Value = "See you again"
End Sub
=> Chạy không đúng như theo lập trình. Làm thế nào đây bạn ơi.
Bạn thử vầy xem:
PHP:
Sub Test()
On Error Resume Next
Workbooks("1.xls").ActiveSheet.Range("A1").Value = "Hello"
Workbooks("2.xls").ActiveSheet.Range("A1").Value = "Good bye"
Workbooks("3.xls").ActiveSheet.Range("A1").Value = "No thing"
Workbooks("4.xls").ActiveSheet.Range("A1").Value = "See you again"
End Sub
 
Theo thói thường sử dùng code bẫy lỗi (error trap: On Error) thì ngươi ta gói nó vào một đoạn nhỏ, dùng vòng lặp để thực hiện. Nếu không thể gói vào đoạn nhỏ để dùng vòng lặp thì người ta tách nó ra hàm riêng.
Làm như vậy thì cô lập được đoạn code bẫy lỗi ra khỏi code thường.

Mã:
For each tenFile in Array("file1.xls", "file2.xls", ...)
On Error Resume Next
' làm cái gì đó ở đây
On Error Goto 0
Next tenFile

Mã:
...
GhiFile "file1.xls", "A1", "Hello"
GhiFile "file2.xls", "A1", "Good Bye"
GhiFile "file3.xls", "A1", "Greetings"
GhiFile "file4.xls", "A1", "So Long"
...

sub GhiFile(byVal tenFile as string, byVal tenRange as string, byVal duLieu as string)
On Error Resume Next
' làm cái gì đó ở đây
end sub
 
Bạn thử vầy xem:
PHP:
Sub Test()
On Error Resume Next
Workbooks("1.xls").ActiveSheet.Range("A1").Value = "Hello"
Workbooks("2.xls").ActiveSheet.Range("A1").Value = "Good bye"
Workbooks("3.xls").ActiveSheet.Range("A1").Value = "No thing"
Workbooks("4.xls").ActiveSheet.Range("A1").Value = "See you again"
End Sub
Code ở trên thì chỉ áp dụng đối với dữ liệu đơn giản. Cái này thì chắc khó áp dụng đối với code dài như thế này (Cả 4 file excel có code như vậy, chỉ khác ở tên file):
PHP:
Windows("1.xls").Activate
    Range("B65000").Select
    Range(Selection, Selection.End(xlUp)).Offset(1, 0).Resize(, 17).Select
        Selection.Delete
    Range("B65000").Select
    Selection.End(xlUp).Offset(1, -1).Select
    ActiveCell.FormulaR1C1 = "1"
    Range("A4").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Clear
    Selection.Resize(, 18).Select
      Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(14, 16), _
        Replace:=True, PageBreaks:=False, SummaryBelowData:=True
        Range("E3").Select
    Cells.Find(What:="Total", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
    Selection.ClearContents
    ActiveCell.Offset(1, 0).Select
    Selection.ClearContents
    ActiveCell.Resize(, 18).Select
    Selection.ClearContents
    Range("N65000").Select
    Range(Selection, Selection.End(xlUp)).Offset(, -1).Select
    ActiveCell.FormulaR1C1 = "Tæng ph¸t sinh"
    ActiveCell.Offset(, 6).Select
    ActiveCell.FormulaR1C1 = "=RC[-5]-RC[-3]"
    ActiveCell.Offset(0, -18).Select
    ActiveCell.FormulaR1C1 = "1"
    Range("A5").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Selection.Resize(, 19).Select
    Selection.Cut
    Windows("621 - nam non.xls").Activate
    Range("B" & [B60000].End(xlUp).Row + 4).Select
    ActiveCell.Offset(0, -1).Select
    ActiveSheet.Paste


Không biết bạn có cao kiến gì không?
 
Lần chỉnh sửa cuối:
Cuối cùng cũng đã khắc phục được:
PHP:
Public Sub Textcu1()
Call Sheet1
End Sub
Public Sub Sheet1()
On Error GoTo Sheet2
Windows("1.xls").Activate
Range("A1").Value = "Hello"
Range("A1").Cut
Range("A2").Select
ActiveSheet.Paste
Sheet2:
Call Sheet2
End Sub
Public Sub Sheet2()
On Error GoTo Sheet3
Windows("2.xls").Activate
Range("A1").Value = "Good bye"
Range("A1").Cut
Range("A2").Select
ActiveSheet.Paste
Sheet3:
Call Sheet3
End Sub
Public Sub Sheet3()
On Error GoTo Sheet4
Windows("3.xls").Activate
Range("A1").Value = "No thing"
Range("A1").Cut
Range("A2").Select
ActiveSheet.Paste
Sheet4:
Call Sheet4
End Sub
Public Sub Sheet4()
On Error GoTo Thoat
Windows("4.xls").Activate
Range("A1").Value = "See you again"
Range("A1").Cut
Range("A2").Select
ActiveSheet.Paste
Thoat:
End Sub
 
Lần chỉnh sửa cuối:
Web KT

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

Trả lời
42
Đọc
17K
Back
Top Bottom