Nhờ giúp sửa code bị lỗi "Assignment to constant not permitted"

Liên hệ QC

tranaidh

Thành viên mới
Tham gia
31/5/08
Bài viết
36
Được thích
0
Em có một file nhập dữ liệu của hệ thống nhưng có lỗi code. Em nhờ mọi người giúp chỉnh lại code giúp em với ạ
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Application.EnableEvents = False
    If Sh.Name = "DANH SACH MINH CHUNG" Then
        Dim sh_info As Worksheet
        Dim sh_list As Worksheet
        Set sh_info = Sheets("DANH SACH MINH CHUNG")
        Set sh_list = Sheets("Danh_muc")
        If Target.Count = 1 And Target.Row >= 12 And Target.Column = 1 Then
            If Target.Value <> "" Then
                sh_list.Select
                'read all row of Danh_muc sheet
                FinalRow = sh_list.Cells(Rows.Count, "C").End(xlUp).Row
                sh_info.Select
                Dim arr As Variant
                For x = 4 To FinalRow
                    ThisValue = sh_list.Cells(x, "C").Value
                    Standard = sh_list.Cells(x, "B").Value
                    If Standard = CStr(Target.Value) Then
                        'add to array
                        If IsEmpty(arr) Then
                            ReDim arr(0 To 0) As Variant
                        ElseIf IsError(Application.Match(ThisValue, arr, 0)) Then
                            ReDim Preserve arr(0 To UBound(arr) + 1)
                        End If
                        arr(UBound(arr)) = ThisValue
                    End If
                Next x
                'set criteria dropdown
                Let rngIndex = "B" & Target.Row & ":" & "B" & Target.Row
                Dim cellRef As Range
                Set cellRef = sh_info.Range(rngIndex)
                cellRef.ClearContents
                Dim valueFormula
                valueFormula = Join(arr, ",")
                With cellRef.Validation
                    .Delete
                    .Add Type:=xlValidateList, Formula1:=valueFormula
                    .ErrorMessage = StrConv("", vbUnicode)
                End With
                
                'remove validate of level
                Let rngIndexLevel = "C" & Target.Row & ":" & "C" & Target.Row
                Dim cellRefLevel As Range
                Set cellRefLevel = sh_info.Range(rngIndexLevel)
                cellRefLevel.Validation.Delete
                cellRefLevel.ClearContents
                                
                Cells(Target.Row, 1).Select
            End If
        ElseIf Target.Count = 1 And Target.Row >= 12 And Target.Column = 2 Then
            StandardValue = sh_info.Cells(Target.Row, "A").Value
            If Target.Value <> "" And StandardValue <> "" Then
                sh_list.Select
                FinalRow = sh_list.Cells(Rows.Count, "D").End(xlUp).Row
                sh_info.Select
                Dim arr2 As Variant
                For x = 4 To FinalRow
                    ThisValue = sh_list.Cells(x, "D").Value
                    Standard = sh_list.Cells(x, "B").Value
                    Criteria = sh_list.Cells(x, "C").Value
                    If Standard = CStr(StandardValue) And Criteria = Target.Value Then
                        If IsEmpty(arr2) Then
                            ReDim arr2(0 To 0) As Variant
                        ElseIf IsError(Application.Match(ThisValue, arr2, 0)) Then
                            ReDim Preserve arr2(0 To UBound(arr2) + 1)
                        End If
                        arr2(UBound(arr2)) = ThisValue
                    End If
                Next x
                Let rngIndex = "C" & Target.Row & ":" & "C" & Target.Row
                Dim cellRef2 As Range
                Set cellRef2 = sh_info.Range(rngIndex)
                cellRef2.ClearContents
                Dim valueFormula2
                valueFormula2 = Join(arr2, ",")
                With cellRef2.Validation
                    .Delete
                    .Add Type:=xlValidateList, Formula1:=valueFormula2
                    .ErrorMessage = ""
                End With
                
                Cells(Target.Row, 2).Select
            End If
        End If
    End If
    Application.EnableEvents = True
    
End Sub
 

File đính kèm

  • Importdanhsachkehoachminhchung_08042022_110840.xlsm
    22.5 KB · Đọc: 11
Bạn kiểm tra và khai báo lại các biến chưa được khai báo.
 
Upvote 0
Em có một file nhập dữ liệu của hệ thống nhưng có lỗi code. Em nhờ mọi người giúp chỉnh lại code giúp em với ạ
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Application.EnableEvents = False
    If Sh.Name = "DANH SACH MINH CHUNG" Then
        Dim sh_info As Worksheet
        Dim sh_list As Worksheet
        Set sh_info = Sheets("DANH SACH MINH CHUNG")
        Set sh_list = Sheets("Danh_muc")
        If Target.Count = 1 And Target.Row >= 12 And Target.Column = 1 Then
            If Target.Value <> "" Then
                sh_list.Select
                'read all row of Danh_muc sheet
                FinalRow = sh_list.Cells(Rows.Count, "C").End(xlUp).Row
                sh_info.Select
                Dim arr As Variant
                For x = 4 To FinalRow
                    ThisValue = sh_list.Cells(x, "C").Value
                    Standard = sh_list.Cells(x, "B").Value
                    If Standard = CStr(Target.Value) Then
                        'add to array
                        If IsEmpty(arr) Then
                            ReDim arr(0 To 0) As Variant
                        ElseIf IsError(Application.Match(ThisValue, arr, 0)) Then
                            ReDim Preserve arr(0 To UBound(arr) + 1)
                        End If
                        arr(UBound(arr)) = ThisValue
                    End If
                Next x
                'set criteria dropdown
                Let rngIndex = "B" & Target.Row & ":" & "B" & Target.Row
                Dim cellRef As Range
                Set cellRef = sh_info.Range(rngIndex)
                cellRef.ClearContents
                Dim valueFormula
                valueFormula = Join(arr, ",")
                With cellRef.Validation
                    .Delete
                    .Add Type:=xlValidateList, Formula1:=valueFormula
                    .ErrorMessage = StrConv("", vbUnicode)
                End With
               
                'remove validate of level
                Let rngIndexLevel = "C" & Target.Row & ":" & "C" & Target.Row
                Dim cellRefLevel As Range
                Set cellRefLevel = sh_info.Range(rngIndexLevel)
                cellRefLevel.Validation.Delete
                cellRefLevel.ClearContents
                               
                Cells(Target.Row, 1).Select
            End If
        ElseIf Target.Count = 1 And Target.Row >= 12 And Target.Column = 2 Then
            StandardValue = sh_info.Cells(Target.Row, "A").Value
            If Target.Value <> "" And StandardValue <> "" Then
                sh_list.Select
                FinalRow = sh_list.Cells(Rows.Count, "D").End(xlUp).Row
                sh_info.Select
                Dim arr2 As Variant
                For x = 4 To FinalRow
                    ThisValue = sh_list.Cells(x, "D").Value
                    Standard = sh_list.Cells(x, "B").Value
                    Criteria = sh_list.Cells(x, "C").Value
                    If Standard = CStr(StandardValue) And Criteria = Target.Value Then
                        If IsEmpty(arr2) Then
                            ReDim arr2(0 To 0) As Variant
                        ElseIf IsError(Application.Match(ThisValue, arr2, 0)) Then
                            ReDim Preserve arr2(0 To UBound(arr2) + 1)
                        End If
                        arr2(UBound(arr2)) = ThisValue
                    End If
                Next x
                Let rngIndex = "C" & Target.Row & ":" & "C" & Target.Row
                Dim cellRef2 As Range
                Set cellRef2 = sh_info.Range(rngIndex)
                cellRef2.ClearContents
                Dim valueFormula2
                valueFormula2 = Join(arr2, ",")
                With cellRef2.Validation
                    .Delete
                    .Add Type:=xlValidateList, Formula1:=valueFormula2
                    .ErrorMessage = ""
                End With
               
                Cells(Target.Row, 2).Select
            End If
        End If
    End If
    Application.EnableEvents = True
   
End Sub
Không được đặt tên biến là "Standard" => bạn nên chuyển thành tên khác. Ví dụ: Std hay StandardX
 
Upvote 0
Không được đặt tên biến là "Standard" => bạn nên chuyển thành tên khác. Ví dụ: Std hay Standard
Cảm ơn bạn, mình đã chỉnh như bạn nói, và đã làm dc.
Bài đã được tự động gộp:

Không hẳn vậy. Cần hỏi lại thớt bị lỗi ở dòng nào.
View attachment 274195
Mình lỗi ngay biến standard đầu tiên luôn.
Bài đã được tự động gộp:

Bạn kiểm tra và khai báo lại các biến chưa được khai báo.
Ban đầu mình cũng nghĩ vậy. Nhưng khai báo xong vẫn ko đúng
 
Upvote 0
Bạn kiểm tra và khai báo lại các biến chưa được khai báo.
Theo như code của thớt thì có khả năng nhiều biến và hằng là loại toàn cục (global). Standard chắc được khai ở đâu đó là Const. Nếu khai lại thì trong phạm vi sub này nó sẽ là biến nọi bộ và thay thế biến toàn cục.

Muốn biết nó có phải là toàn cục thì thêm Option Explicit.
 
Upvote 0
Theo như code của thớt thì có khả năng nhiều biến và hằng là loại toàn cục (global). Standard chắc được khai ở đâu đó là Const. Nếu khai lại thì trong phạm vi sub này nó sẽ là biến nọi bộ và thay thế biến toàn cục.

Muốn biết nó có phải là toàn cục thì thêm Option Explicit.
Thật ra máy em cũng bị nhưng trong cái nùi kia thì việc truy tìm nó quá sức em rồi nên nhanh thì chỉnh luôn tên biến cho lẹ á bác
1649406368740.png
 
Upvote 0
Thật ra máy em cũng bị nhưng trong cái nùi kia thì việc truy tìm nó quá sức em rồi nên nhanh thì chỉnh luôn tên biến cho lẹ á bác
Tôi không có mà lại rất tò mò. Có thể Standard nó nằm ở thư viện nào đó chăng. Bạn có nên nhờ bạn chạy code sau và cho biết giá trị của Standard.
Mã:
Sub Tesr()
    MsgBox Standard
End Sub
 
Upvote 0
Thật ra máy em cũng bị nhưng trong cái nùi kia thì việc truy tìm nó quá sức em rồi nên nhanh thì chỉnh luôn tên biến cho lẹ á bác

Gặp trường hợp này thì hỏi Typename xem nó là cái gì.
Vô cửa sổ immediate gõ "? Typename(Standard)"
 
Upvote 0
Nó là cái này thui, bác Vẹt chạy sẽ không ra bởi nó nằm trong thư viện office.

1649431198135.png
 
Upvote 0
Tham chiếu mốc gì. Nó là đồ mới (trích bettersolutions chấm cơm):

1649436997993.png

Microsoft chơi xấu, đặt thêm enum mới mà không báo trước các "reserved words".
Đáng lẽ mấy cái này phải buộc nó trong không gian định danh (namespace).
Ví dụ: MSO.STANDARD
 
Upvote 0
Thật ra máy em cũng bị nhưng trong cái nùi kia thì việc truy tìm nó quá sức em rồi nên nhanh thì chỉnh luôn tên biến cho lẹ á bác
View attachment 274200
Tôi bị chết cái máy SandBox (chắc tại bắt nó làm SandBox cho nên nó chóng chết :p)
Hiện tại không có hàng để test các phiên bản mới.
Bạn có rảnh test giùm tôi theo đề nghị ở bài #6: khai báo STANDARD là một biến cục bộ.
Dim Standard As String
Theo nguyên tắc, biến khong khai báo sẽ tìm từ gốc xem nó có đã được khai báo ở đâu chưa. Nếu đã khai là biến cục bộ thì lời khai này sẽ che lấp tất cả các khai báo bên ngoài. Muốn nói đến bên ngoài thì phải ghép tiền tố LabelInfo.
(thớt có bảo đã thử rồi và không thành công, nhưng tôi không tin)
 
Upvote 0
Tôi bị chết cái máy SandBox (chắc tại bắt nó làm SandBox cho nên nó chóng chết :p)
Hiện tại không có hàng để test các phiên bản mới.
Bạn có rảnh test giùm tôi theo đề nghị ở bài #6: khai báo STANDARD là một biến cục bộ.
Dim Standard As String
Theo nguyên tắc, biến khong khai báo sẽ tìm từ gốc xem nó có đã được khai báo ở đâu chưa. Nếu đã khai là biến cục bộ thì lời khai này sẽ che lấp tất cả các khai báo bên ngoài. Muốn nói đến bên ngoài thì phải ghép tiền tố LabelInfo.
(thớt có bảo đã thử rồi và không thành công, nhưng tôi không tin)
Kết quả đúng như nguyên tắc bác nói luôn
1649744172439.png
 
Upvote 0
Web KT

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

Back
Top Bottom