Em tìm cách sửa code mãi mà ko được, mong các Thầy chỉ giúp ah? (1 người xem)

Liên hệ QC

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

Lequocvan

Thành viên thường trực
Tham gia
21/8/07
Bài viết
365
Được thích
129
Donate (Paypal)
Donate
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Agribank
Cứ chạy là nó báo lỗi: Subscript out of range (Error 9) Khi chạy đến sheet 05 là đơ
Và tại sao code lại chạy qua Sheet1, Sheet2, Sheet3 hai lần. Ý em là muốn nó duyệt 1 lần thôi ah.
Mong các Thầy chỉ giúp!


 

File đính kèm

Lần chỉnh sửa cuối:
Bạn bị lỗi là do bạn chưa hiểu hết khi truyền tham số vào Sheets(index): index là một biến variant, nó có thể là số hoặc chuỗi ký tự, khi bạn truyền tham số, nó sẽ kiểm tra nếu là chuỗi ký tự, nó sẽ chọn sheet nào có tên giống với tham số bạn đưa vào, còn nếu là số thì nó sẽ chọn sheet theo chỉ mục trong danh sách các sheets. Code của bạn chạy như sau:
Tham số - sheet acitve
"Sheet1" - Sheet1
"Sheet2" - Sheet2
"Sheet3" - Sheet2
"01" - Sheet1 ----> tham số có thể chuyển sang số 1, vba sẽ chọn sheet có chỉ mục là 1, đó là sheet1

Mình viết lại cho bạn, thử xem nhé.
Sub test4()
Dim i As Integer, j As Integer, totalLines As Integer
Dim sheetName As String
Dim sheetList As Worksheet, sheetItem As Worksheet

Set sheetList = Application.Sheets("ListWs")
totalLines = sheetList.Range("A1").End(xlDown).Row
For i = 1 To totalLines
sheetName = Format(sheetList.Range("A" & i).Value2, "00")
For Each sheetItem In Application.Sheets
If (sheetItem.Name = sheetName) Then
sheetItem.Activate
MsgBox Application.ActiveSheet.Name
End If
Next
Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thật là ở sheetname=format...value2,"00" nhưng khai báo j để làm gì ah?
 
Upvote 0
Theo mình bạn nên viết vầy cho dễ hiểu hơn nè:
PHP:
Option Explicit
Sub Test35()
 Dim SoDong As Long, J As Long
 Dim Sh As Worksheet
 Dim ShName As String
 
 Sheets("ListWs").Select
 SoDong = Range("A1").End(xlDown).Row
 For J = 1 To SoDong
    If Len(Cells(J, 1)) > 2 Then
        ShName = Cells(J, "A").Value
    Else
        ShName = Right("0" & Cells(J, "A").Value, 2)
    End If
    For Each Sh In ThisWorkbook.Worksheets
        If Sh.Name = ShName Then MsgBox Sh.Name
    Next Sh
 Next J
End Sub

Thứ nhứt: Nên luôn có câu thần chú
Mã:
 Option Explicit
Để khai báo các biến cần xài 1 cách rành rẽ; Chuyện này không chứng tỏ học lực VBA ta kém hơn đâu mà lo!

Thứ nhì: For gì thì Next nấy; Tránh để khơi khơi như bạn.

Thứ ba: Nên tận dụng fím {TAB} để chương trình của bạn ngay hàng thẳng lối theo cột.
Điều này tránh cho ta những sai sót vô nghĩa khi lỗi râu ông nọ cắm cằm bà kia; Một khi sau này bạn xài nhiều hay rất nhiều vòng lặp trong 1 đoạn chương trình.

Những điều trên đây ngõ hầu để sau này bạn có thể đọc lại chương trình của bạn viết mà không tưởng đó là do người khác viết.

Thân ái & chúc xuấn vui vẻ!
 
Upvote 0
@. Hàm Format() dùng để định dạng số, nếu tham số là số nó sẽ format cho bạn, còn nếu là chuỗi thì nó trả về chuỗi đó luôn, mình lười nên viết ko cần phải viết rẽ nhánh làm gì, dùng hàm format cho nhanh.
Ex: Format(1, "00") > "01" / Format(2, "00") > "02"

@. Việc chèn Option Explicit là base cho những ai xài VBA, chẳng nhất thiết phải chỉ dẫn. Nếu muốn bạn có thể chèn cả Option Compare..., Option Base... cho nó chuyên nghiệp
For gì Next ấy. chả cần thiết nếu như sử dụng căn hàng khi viết code. thêm vào làm cho vba mất thêm 1/mấy nano giây để nó thông dịch. :D
Code mình paste trực tiếp ở đây nên bay hết tab căn hàng, chứ mình chả phải gà đâu mà ko biết những nguyên tắc cơ bản của ng lập trình. :D
 
Lần chỉnh sửa cuối:
Upvote 0
Xin cám ơn Anh duongcga ở bài #2 được chỉ ra cách đơn giản và hiệu quả để em có thể dùng làm code. Nhưng hiện tại, em đang chưa thể tìm ra cách xử lý cho ra kết quả mong muốn như sheet kq_1 và kq_2 khi chạy sub ChayTongThe()
Hiện tại em vẫn sửa tay tại dòng
For I = 1 To SoDong
tuần tự thành For I=2 To 2 ; For I=3 To 3 ... cho đến 28; 29; 30; 31 (số ngày của tháng ah)
EM gửi file mẫu mong các Thầy và mọi người chỉ giúp ah!
Dữ liệu này là mẫu, thực thế nó có những 31 hoặc 30 hoặc 29 hoặc 28 sheets cơ ah!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
...

@. Việc chèn Option Explicit là base cho những ai xài VBA, chẳng nhất thiết phải chỉ dẫn. Nếu muốn bạn có thể chèn cả Option Compare..., Option Base... cho nó chuyên nghiệp
For gì Next ấy. chả cần thiết nếu như sử dụng căn hàng khi viết code. thêm vào làm cho vba mất thêm 1/mấy nano giây để nó thông dịch. :D
Code mình paste trực tiếp ở đây nên bay hết tab căn hàng, chứ mình chả phải gà đâu mà ko biết những nguyên tắc cơ bản của ng lập trình. :D

Đỏ: Từ base còn có nghĩa là thấp hèn. Dùng tiếng Việt và Anh lẫn lộn thì dựa vào ngữ cảnh nào để hiểu.

Xanh: có chắc không đó?
For nào Next nấy vốn là một thủ thuật để dễ kiểm soát khi dời vị trí đoạn code từ nơi này sang nơi khác.
 
Upvote 0
Ở bài #4 mình viết cho chủ topic; Không fải viết cho bạn Duongcga

Cho mình xin thứ lỗi nếu đã làm bạn fiến lòng
 
Upvote 0
@VetMini :
1.
base ko phải là thấp hèn nhé bạn, hãy hiểu nó là nền tảng/cơ bản nhé.
2. Cái này là tùy bạn. Căn hàng lúc viết code sẽ nhìn thấy rõ ràng for nào/next ấy. bạn càng viết nhiều những thứ ko cần thiết, VBA càng mất t/g để phân tích code của bạn thôi.
 
Upvote 0
em học mót và sửa code của bạn em là tác giả, mục đích là giải quyết cái phần việc của cá nhân em nên đôi lúc còn có lỗi, cũng tại ko học đến nơi đến chốn, cứ thấy khó hiểu là google.
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
@VetMini :
1.
base ko phải là thấp hèn nhé bạn, hãy hiểu nó là nền tảng/cơ bản nhé.
2. Cái này là tùy bạn. Căn hàng lúc viết code sẽ nhìn thấy rõ ràng for nào/next ấy. bạn càng viết nhiều những thứ ko cần thiết, VBA càng mất t/g để phân tích code của bạn thôi.

1. căn bản thì nói căn bản. Trong ngữ cảnh Anh Việt lẫn lộn, ai mà biết được người dùng từ base bạn có muốn chê bai hay không.
2. có phải theo tinh thần để VBA ít mất thì giờ phân tích code thì đặt tên biến thật ngắn thật tốt, tất cả những IF's chỉ có 1 dòng thì viết theo kiểu không cần End If, và không nên khai báo Const (VBA khỏi mất thì giờ thay trị vào)
 
Upvote 0
Các Thầy ơi, em làm ra được rồi ah. Em làm được rồi, tại em không sắp xếp đúng trình tự, tuyệt cú mèo. thanks GPE.
(Các bác thông cảm nha, có thể nhiều khi em hỏi tự dưng 'ngu' (câu hỏi không đâu vào đâu) ). Rồi đến khi thư thái, tự ngẫm lại thấy dại ghê.
Thôi em lại quay lại, làm tiếp code nữa cho cái phần việc của mình đã ah.
 
Upvote 0
Web KT

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

Back
Top Bottom