Nhờ các bạn sửa giúp đoạn code

  • Thread starter Thread starter le_vis
  • Ngày gửi Ngày gửi
Liên hệ QC

le_vis

Thành viên tích cực
Tham gia
23/7/09
Bài viết
1,292
Được thích
797
Đoạn code đang báo lỗi dòng đánh dấu mầu đỏ - đoạn dưới If Target.Column = 7 họa động bình thường
Nhờ các bạn sửa giúp - Trân trọng cảm ơn !
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim d, I, Vung, Ws

Set d = CreateObject("scripting.dictionary")

Set Ws = Sheets("DM_hang")

Vung = Ws.Range(Ws.[C8], Ws.[C200].End(xlUp)).Resize(, 4)

If Not Intersect(Target, Range("AA4:AA200")) Is Nothing Then

If Target.Count = 1 Then

For I = 1 To UBound(Vung)

d.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3), Vung(I, 4))

Next I

If d.exists(UCase(Target.Value)) Then

Target.Offset(, 2) = d.Item(UCase(Target.Value))(58)

End If

End If

End If

If Target.Column = 7 And Target.Row = 1 And Target.Row < 7 Then

Sheets("Form").Range("D3") = Selection.Text

End If

End Sub
 
Lần chỉnh sửa cuối:
Vấn đề của bạn nằm ở khâu trình bày thôi :D
Bài này chưa có gì để làm khó. Mọi người có gợi ý các cách làm mà bạn đang có vẻ "bảo mật":
1. Bạn trình bày ý tưởng mong muốn của bạn, mọi người sẽ gợi ý cách làm cho bạn. Lựa chọn vẫn của bạn mà.
2. Gửi file và lỗi lên thì mọi người mới hình dung ra lỗi gì. Một cái dòng tô vàng nó không có ý nghĩa quá nhiều. Khi có file có thể biết là bạn khai báo biến gì, lỗi gì, object nào có khai báo mà rỗng, thiếu khai báo sai.
3. Bạn báo lỗi tại dòng d(Vung(I, 1))= Array(Vung(I, 2), Vung(I, 3), Vung(I, 4)) mà sao chụp ra nó lỗi dòng khác :D
Như bài #4 mà đã bảo rồi nhưng không ăn thua.
 
Upvote 0
@le_vis
Tạm thời dừng các câu lệnh không cần thiết.
Bạn test code bên dưới xem sao.

Các chỉ số khi khai báo Vung, khi nạp vào dic, khi tra cứu bạn cần lưu ý
Mã:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim d, I, Vung, Ws

Set d = CreateObject("scripting.dictionary")
Set Ws = Sheets("DM_hang")

'Vung = Ws.Range(Ws.[C8], Ws.[C200].End(xlUp)).Resize(, 4)
Vung = Ws.Range(Ws.[C8], Ws.[C200].End(xlUp)).Resize(, 58)

If Not Intersect(Target, Range("AA4:AA200")) Is Nothing Then
    If Target.Count = 1 Then
        For I = 1 To UBound(Vung)
            If d.exists(Vung(I, 1)) = False Then
                'd.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3), Vung(I, 4))
                d.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3), Vung(I, 58))
            End If
        Next I
     
        If d.exists(UCase(Target.Value)) Then
            'Target.Offset(, 2) = d.Item(UCase(Target.Value))(58)
            Target.Offset(, 2) = d.Item(UCase(Target.Value))(2)
        End If
    End If
End If

'If Target.Column = 7 And Target.Row = 1 And Target.Row < 7 Then
'    Sheets("Form").Range("D3") = Selection.Text
'End If

End Sub

---
Sửa phần nạp dic
Vẫn báo lỗi dòng này : d.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3), Vung(I, 58))
CHAOQUAY và các bạn xem lại giúp
 
Upvote 0
Nó đây bạn ơi - không có cảnh báo gì khác
Code bài trên có sửa lại. Bạn cập nhật lại như bên dưới rồi test
Mã:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim d, I, Vung, Ws

Set d = CreateObject("scripting.dictionary")
Set Ws = Sheets("DM_hang")

'Vung = Ws.Range(Ws.[C8], Ws.[C200].End(xlUp)).Resize(, 4)
Vung = Ws.Range(Ws.[C8], Ws.[C200].End(xlUp)).Resize(, 58)

If Not Intersect(Target, Range("AA4:AA200")) Is Nothing Then
    If Target.Count = 1 Then
        For I = 1 To UBound(Vung)
            If d.exists(Vung(I, 1)) = False Then
                'd.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3), Vung(I, 4))
                d.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3), Vung(I, 58))
            End If
        Next I
      
        If d.exists(UCase(Target.Value)) Then
            'Target.Offset(, 2) = d.Item(UCase(Target.Value))(58)
            Target.Offset(, 2) = d.Item(UCase(Target.Value))(2)
        End If
    End If
End If

'If Target.Column = 7 And Target.Row = 1 And Target.Row < 7 Then
'    Sheets("Form").Range("D3") = Selection.Text
'End If

End Sub
 
Upvote 0
Code bài trên có sửa lại. Bạn cập nhật lại như bên dưới rồi test
Mã:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim d, I, Vung, Ws

Set d = CreateObject("scripting.dictionary")
Set Ws = Sheets("DM_hang")

'Vung = Ws.Range(Ws.[C8], Ws.[C200].End(xlUp)).Resize(, 4)
Vung = Ws.Range(Ws.[C8], Ws.[C200].End(xlUp)).Resize(, 58)

If Not Intersect(Target, Range("AA4:AA200")) Is Nothing Then
    If Target.Count = 1 Then
        For I = 1 To UBound(Vung)
            If d.exists(Vung(I, 1)) = False Then
                'd.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3), Vung(I, 4))
                d.Add Vung(I, 1), Array(Vung(I, 2), Vung(I, 3), Vung(I, 58))
            End If
        Next I
     
        If d.exists(UCase(Target.Value)) Then
            'Target.Offset(, 2) = d.Item(UCase(Target.Value))(58)
            Target.Offset(, 2) = d.Item(UCase(Target.Value))(2)
        End If
    End If
End If

'If Target.Column = 7 And Target.Row = 1 And Target.Row < 7 Then
'    Sheets("Form").Range("D3") = Selection.Text
'End If

End Sub
Code không chạy - nếu sửa :
Dòng : Target.Offset(, 2) = d.Item(UCase(Target.Value))(2)
Thành : Target.Offset(, 2) = d.Item(UCase(Target.Value))(58) thì báo lỗi chính dòng đó
 
Upvote 0
Code không chạy - nếu sửa :
Dòng : Target.Offset(, 2) = d.Item(UCase(Target.Value))(2)
Thành : Target.Offset(, 2) = d.Item(UCase(Target.Value))(58) thì báo lỗi chính dòng đó
Chỉ số (58) là bị sai thì phải.

Code trên chạy không lỗi hay thế nào bạn?

Nếu không lỗi thì mới là bắt đúng bệnh. :D
Điều chỉnh tính sau
 
Upvote 0
Chỉ số (58) là bị sai thì phải.

Code trên chạy không lỗi hay thế nào bạn?

Nếu không lỗi thì mới là bắt đúng bệnh. :D
Điều chỉnh tính sau
Tôi đang lước bỏ vợi các Sheet đi và chuyển đúng File đó lên để các bạn giúp chắc tiện hơn - Xin bạn mấy phút nữa để chuyển File lên
 
Upvote 0
Bảo sửa lỗi mà không thấy thông báo lỗi đâu hết các bạn vẫn trả lời ầm ầm thì đúng là nể thật.
 
Upvote 0
Bảo sửa lỗi mà không thấy thông báo lỗi đâu hết các bạn vẫn trả lời ầm ầm thì đúng là nể thật.
Lỗ của code trên bị lỗi, tôi đã cập nhật code mới của bạn CHAOQUAY vào thì không báo lỗi nữa nhưng không ra kết quả - Xin các bạn xem và hỗ trợ sửa giúp
 
Upvote 0
Lỗ của code trên bị lỗi, tôi đã cập nhật code mới của bạn CHAOQUAY vào thì không báo lỗi nữa nhưng không ra kết quả - Xin các bạn xem và hỗ trợ sửa giúp
Cái quan trọng để sửa code là câu thông báo lỗi và dòng code bị lỗi. Bạn chỉ gửi dòng code lỗi thì khó mà sửa nhanh được.
 
Upvote 0
Cái quan trọng để sửa code là câu thông báo lỗi và dòng code bị lỗi. Bạn chỉ gửi dòng code lỗi thì khó mà sửa nhanh được.
Cảm ơn bạn trên cơ sử bạn CHAOQUAY sửa và gợi mở cho Mĩnh đã sửa được rồi - Xin cảm ơn tất cả các bạn cảm ơn bạn CHAOQUAY đã khám, chuẩn đoán và cho thuốc cũng như hướng điều trị như Bác sĩ khám đau bụng với chỉ một ống nghe - Xin cảm ơn nhiều nhiều
 
Upvote 0
Bác sĩ chẩn bệnh còn tùy theo bệnh nhân nữa chứ: lớn/nhỏ nam/nữ, mặt xanh lét hay hồng hào,...
Rõ ràng khám này là qua gia-lô gì đó. Bác sĩ phải tận dụng mọi kinh nghiệm đoán mò.
Dân VN do ăn nhiều mắm cho nên dễ bị loét dạ dày, khí hậu nhiệt đới nên dễ bị viêm gan A/B/C. Không kể ung thư mọi thứ. Nhận giấy giới thiệu đi chụp hình có thấy đi đâu?

Tới đây mới thấy "hé" một chút, (loét dạ dày, viêm gan, và ung thư chưa kể nhé):
Code không chạy - nếu sửa :
Dòng : Target.Offset(, 2) = d.Item(UCase(Target.Value))(2)
Thành : Target.Offset(, 2) = d.Item(UCase(Target.Value))(58) thì báo lỗi chính dòng đó
Item có được nạp array đến 59 phần tử đâu mà đòi móc cái phần tử thứ 59 ấy ra.
 
Upvote 0
Bác sĩ chẩn bệnh còn tùy theo bệnh nhân nữa chứ: lớn/nhỏ nam/nữ, mặt xanh lét hay hồng hào,...
Rõ ràng khám này là qua gia-lô gì đó. Bác sĩ phải tận dụng mọi kinh nghiệm đoán mò.
Dân VN do ăn nhiều mắm cho nên dễ bị loét dạ dày, khí hậu nhiệt đới nên dễ bị viêm gan A/B/C. Không kể ung thư mọi thứ. Nhận giấy giới thiệu đi chụp hình có thấy đi đâu?
Tới đây mới thấy "hé" một chút, (loét dạ dày, viêm gan, và ung thư chưa kể nhé):
Item có được nạp array đến 59 phần tử đâu mà đòi móc cái phần tử thứ 59 ấy ra.
Bài này đưa file lên từ đầu thì chắc không đến 5 bài là xong rồi, đằng này tới tận ba mươi mấy bài... chậc chậc, hao công tốn của quá.
 
Upvote 0
Bài này đưa file lên từ đầu thì chắc không đến 5 bài là xong rồi, đằng này tới tận ba mươi mấy bài... chậc chậc, hao công tốn của quá.
Bài này không cần phải đưa file. Chỉ cần cho biết rõ mục đích của code. Nếu không debug được thì người ta sẽ viết lại code khác.

Điển hình:
Về diễn giải data:
- code lấy 4 cột mà cột thứ 3 ở tận vị trí 58. Hỏi có thánh mới biết.
Về lỗi code:
- Thớt ở đây hơn 10 năm rồi mà còn chưa biết cách hỏi về lỗi code ở đây:
-- khi hỏi bài chạy lỗi thì phải chụp hình cho biết cả dòng lỗi lẫn hộp thoại báo lỗi để người ta còn phỏng đoán.
- thớt không biết debug tối thiểu. Bị sai ở dòng nào thì Debug.Print các phần tử ấy ra. 10 phần có đến 9 sẽ từ từ mò ra chỗ sai.
 
Upvote 0
Web KT

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

Back
Top Bottom