Giúp mình tìm lỗi Macro này với ạ ! (1 người xem)

  • Thread starter Thread starter johan
  • Ngày gửi Ngày gửi

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

Status
Không mở trả lời sau này.

johan

Thành viên mới
Tham gia
21/6/08
Bài viết
3
Được thích
0
Mình mới lập trình excel gặp cái lỗi này chưa biết sửa như thế nào.
Nhờ mọi người giúp đỡ !

PHP:
Option Explicit

Sub regDefine()
' register definition string has form as follow: #define PWD_CTL        (_UW*) (TOPREG_BASE_ADDR + 0x0000)
' register mask string has form as follow:       #define PWD_CTL_MASK   (UW) 0x00007FFF
    Const regNameCol = 2
    Const regOffsetCol = 3
    Const regTypeCol = 4
    Const bitNumCol = 5
    Const bitNameCol = 6
    Const bitTypeCol = 7
    Const regBaseAddr = "TOPREG_BASE_ADDR"
    Const regCntMax = 2601
    
    Dim regDefStr As String
    Dim regMskStr As String
    
    Dim regName As String
    Dim regOffset As String
    Dim regMsk As String
    Dim bitNum As String
    Dim bitName As String
    Dim bitType As String
    Dim bitMskArray(0 To 31) As String
            
    Dim regCnt As Integer
    Dim regStartRow As Integer
    Dim regEndRow As Integer
    Dim bitRowCnt As Integer
    Dim bitStart As Integer         ' start bit of bit field
    Dim bitEnd As Integer           ' end bit of bit field
    Dim bitOrder As Integer
    Dim Fpath As String
    Dim Fname As String
    Dim i As Integer
    
'-----------------------------------------------------------------------------------
    ' Write regDefStr and regMskStr to *.h file
    Fname = "TOPREG_reg_map"
    Fpath = Application.ActiveWorkbook.Path
    Fpath = Fpath & "\" & Fname & ".h"
    
    Sheets("TOPREG_reg_map").Select
    regCnt = 30
    Do While regCnt < regCntMax
        Do Until (Cells(regCnt, regNameCol) <> "") Or (regCnt >= regCntMax)
            If Cells(regCnt, regTypeCol) = "R/W" Then       ' R/W register
                If Cells(regCnt, regOffsetCol) = "" Then
                    MsgBox "Offset is not exist"
                Else
                    ' create register definition string
                    regName = Cells(regCnt, regNameCol)
                    regOffset = Cells(regCnt, regOffsetCol)
                    regDefStr = "#define " + regName + String(6, vbTab) + "(_UW*) (" + regBaseAddr + " + " + regOffset + ")"
                    
                    ' create register mask string
                    regMskStr = "#define " + regName + "_MSK" + String(4, vbTab)
                    regStartRow = regCnt
                    
                    ' Determine end row of current register
                    regEndRow = regStartRow
                    Do Until (Cells(regEndRow + 1, regNameCol) <> "") Or (regEndRow >= regCntMax)
                        regEndRow = regEndRow + 1
                    Loop
                    
                    ' check bits of current register to build mask
                    For i = 0 To 31
                        bitMskArray(i) = "0"            ' Init bit mask
                    Next i
                    
                    For bitRowCnt = regStartRow To regEndRow
                        bitNum = Cells(bitRowCnt, bitNumCol)
                        bitName = Cells(bitRowCnt, bitNameCol)
                        bitType = Cells(bitRowCnt, bitTypeCol)
                        
                        If InStr(bitNum, ";") = 0 Then
                            ' single bit field  [x]
                            bitStart = Mid(bitNum, 2, Len(bitNum) - 2)
                            bitEnd = bitStart
                        Else
                            ' multiple bits field   [x:y]
                            bitStart = Mid(bitNum, 2, InStr(bitNum, ":") - 2)
                            bitEnd = Mid(bitNum, InStr(bitNum, ":") + 1, Len(bitNum) - InStr(bitNum, ":") - 1)
                        End
                        
                        If (UCase(bitName) = "RESERVE") Or (bitType <> "R/W") Then
                           ' mask bit = 0
                            For bitOrder = bitStart To bitEnd
                                bitMskArray(bitOrder) = "0"
                            Next bitOrder
                        Else
                            ' mask bit = 1
                            For bitOrder = bitStart To bitEnd
                                bitMskArray(bitOrder) = "1"
                            Next bitOrder
                        End
                    Next bitRowCnt
                    
                    ' Create register mask from bit mask array
                    regMsk = "0x"
                    For i = 31 To 0 Step -4
                        regMsk = regMsk + hexFrom4Bits(bitMskArray(i), bitMskArray(i - 1), bitMskArray(i - 2), bitMskArray(i - 3))
                    Next
                    
                    regMskStr = regMskStr + regMsk
                    
                    ' Write to file
                    regName = printToFile(regDefStr, regMskStr, Fpath)
                    regCnt = regEndRow + 1
                End
            Else
                regCnt = regCnt + 1
            End
        Loop
    Loop
End Sub

Function printToFile(regDef As String, regMsk As String, filePath As String) As String
    Open filePath For Append As #1
    
    Print #1, regDef
    Print #1, regMsk
    Print #1, vbCrLf
    
    Close #1
    
    printToFile = ""
End Function

Function hexFrom4Bits(bit3 As String, bit2 As String, bit1 As String, bit0 As String) As String
    Dim fourBits As String
    Dim result As String
    fourBits = bit3 + bit2 + bit1 + bit0
    Select Case fourBits
        Case "0000"
            result = "0"
        Case "0001"
            result = "1"
        Case "0010"
            result = "2"
        Case "0011"
            result = "3"
        Case "0100"
            result = "4"
        Case "0101"
            result = "5"
        Case "0110"
            result = "6"
        Case "0111"
            result = "7"
        Case "1000"
            result = "8"
        Case "1001"
            result = "9"
        Case "1010"
            result = "A"
        Case "1011"
            result = "B"
        Case "1100"
            result = "C"
        Case "1101"
            result = "D"
        Case "1110"
            result = "E"
        Case "1111"
            result = "F"
    End Select
    
    hexFrom4Bits = result
End Function

Nó báo lỗi compile đối với câu lệnh "For" ạ:
For bitRowCnt = regStartRow To regEndRow
...
Next bitRowCnt
 
Mình mới lập trình excel gặp cái lỗi này chưa biết sửa như thế nào.
Nhờ mọi người giúp đỡ !

Trước hết bạn hãy sửa cú pháp rồi nếu còn lỗi thì tính tiếp

Hiện bạn có cấu trúc If ... Then ... Else ... End
Cấu trúc đúng phải là If ... Then ... Else ... End If

Sửa tất cả những chỗ có cấu trúc trên
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom