Excel VBA 代码读取一些行并丢弃其他行

Excel VBA code reads some rows and discards others

这是我第一次在这里提问。 所以这是我的问题: 我有一个相当大的 vba 代码,但我会给你一个简短的摘要。

我有一个 sheet,其中包含有关课程的信息,例如:课程代码、主题、教授、日期、btime、etime 等... 和另一个 sheet 有我正在寻找的课程来创建一个时间表。

所以代码将读取两个 sheet 并比较它们,然后在另一个 sheet 上输出数据。问题是,如果假设一门课程有 2 个讲座、3 个教程和 2 个实验(在不同的时间和日期),它只会读一些而剩下的

这是我的主要代码:

Sub Schedule()
    Row = 1
    T8 = 1
    T9 = 1
    T10 = 1
    T11 = 1
    T12 = 1
    T13 = 1
    T14 = 1
    T15 = 1
    T16 = 1
    T17 = 1
    T18 = 1
    lRow = Worksheets("Banner Summary").Cells(Rows.Count, "B").End(xlUp).Row
    Worksheets("Schedule").Range("B8:AZ100").ClearContents
    Worksheets("Schedule").Cells.Interior.Color = xlNone
    Worksheets("Schedule").Activate
    For x = 2 To 7
        For i = 2 To lRow   
            word = Worksheets("Program Map").Cells(5, x)
            PSub = Left(word, 4)
            PCode = Trim(PSub)
            pcourse = Mid(word, 5, 6)
            f = InStr(pcourse, "U")
            PCode1 = Left(pcourse, f)
            day = Sheets("Banner Summary").Cells(i, 15).Text
            bTime = Sheets("Banner Summary").Cells(i, 16).Text
            eTime = Sheets("Banner Summary").Cells(i, 17).Text
            Subject = Sheets("Banner Summary").Cells(i, 2).Text
            Course = Sheets("Banner Summary").Cells(i, 3).Text
            Title = Sheets("Banner Summary").Cells(i, 4).Text
            Section = Sheets("Banner Summary").Cells(i, 5).Text
            CRN = Sheets("Banner Summary").Cells(i, 6).Text
            ClassType = Sheets("Banner Summary").Cells(i, 9).Text
            Room = Sheets("Banner Summary").Cells(i, 18).Text
            Prof = Sheets("Banner Summary").Cells(i, 20).Text
            BSubject = Worksheets("Banner Summary").Cells(i, 2)
            BCourse = Worksheets("Banner Summary").Cells(i, 3)
            BCode = BSubject & " " & BCourse
            info = Prof & "-" & Subject & " " & Course & "-" & vbNewLine & Title & vbNewLine & CRN & "-" & ClassType & "-" & Section & vbNewLine & Room & ":" & bTime & "-" & eTime 
            RColor = RGB(Int((255 - 0 + 1) * Rnd + 0), Int((255 - 0 + 1) * Rnd + 0), Int((255 - 0 + 1) * Rnd + 0))      
            fcourse1 = PCode & PCode1
            BCourse1 = Subject & Course
            fcourse = Left(word, 10)
            BCourse = Subject & " " & Course

            result = StrComp(fcourse, BCourse)
            result1 = StrComp(fcourse1, BCourse1)
            If result = 0 Then            
                Select Case day
                    Case "M"
                        Call caseM(i)
                    Case "T"
                        Call caseT(i)
                    Case "W"
                        Call caseW(i)
                    Case "R"
                        Call caseR(i)
                    Case "F"
                        Call caseF(i)
                End Select             
            ElseIf result1 = 0 Then
                Select Case day
                    Case "M"
                        Call caseM(i)
                    Case "T"
                        Call caseT(i)
                    Case "W"
                        Call caseW(i)
                    Case "R"
                        Call caseR(i)
                    Case "F"                   
                        Call caseF(i)
                End Select
            End If
        Next i
    Next x      
End Sub

只是一个简短的解释,案例是天数,(5, x) 是程序映射中我试图获取时间表的行。

下面是仅处理一天和一次时段的数据的方式:

Sub caseM(i As Variant)
    day = Sheets("Banner Summary").Cells(i, 15).Text
    bTime = Sheets("Banner Summary").Cells(i, 16).Text
    eTime = Sheets("Banner Summary").Cells(i, 17).Text
    Subject = Sheets("Banner Summary").Cells(i, 2).Text
    Course = Sheets("Banner Summary").Cells(i, 3).Text
    Title = Sheets("Banner Summary").Cells(i, 4).Text
    Section = Sheets("Banner Summary").Cells(i, 5).Text
    CRN = Sheets("Banner Summary").Cells(i, 6).Text
    ClassType = Sheets("Banner Summary").Cells(i, 9).Text
    Room = Sheets("Banner Summary").Cells(i, 18).Text
    Prof = Sheets("Banner Summary").Cells(i, 20).Text
    BSubject = Worksheets("Banner Summary").Cells(i, 2)
    BCourse = Worksheets("Banner Summary").Cells(i, 3)
    BCode = BSubject & " " & BCourse
    info = Prof & "-" & Subject & " " & Course & "-" & vbNewLine & Title & vbNewLine & CRN & "-" & ClassType & "-" & Section & vbNewLine & Room & ":" & bTime & "-" & eTime
    RColor = RGB(Int((255 - 0 + 1) * Rnd + 0), Int((255 - 0 + 1) * Rnd + 0), Int((255 - 0 + 1) * Rnd + 0))
    Select Case bTime
        Case "0810"
            If eTime = "0900" Then
                If T8 = 1 Then
                    If Cells(8, 2) = RGB(0, 0, 0) And Cells(12, 2) = RGB(0, 0, 0) Then
                        Sheets("Schedule").Range("B8").Value = info
                        Sheets("Schedule").Range("B8:B12").Interior.Color = RColor
                        T8 = T8 + 1
                    Else
                        T8 = T8 + 1
                    End If
                ElseIf T8 = 2 Then
                    If Cells(8, 3) = RGB(0, 0, 0) And Cells(12, 3) = RGB(0, 0, 0) Then
                        Sheets("Schedule").Range("C8").Value = info
                        Sheets("Schedule").Range("C8:C12").Interior.Color = RColor
                        T8 = T8 + 1
                    Else
                        T8 = T8 + 1
                    End If
                ElseIf T8 = 3 Then
                    If Cells(8, 4) = RGB(0, 0, 0) And Cells(12, 4) = RGB(0, 0, 0) Then
                        Sheets("Schedule").Range("D8").Value = info
                        Sheets("Schedule").Range("D8:D12").Interior.Color = RColor
                        T8 = T8 + 1
                    Else
                        T8 = T8 + 1
                    End If
                ElseIf T8 = 4 Then
                    If Cells(8, 5) = RGB(0, 0, 0) And Cells(12, 5) = RGB(0, 0, 0) Then
                        Sheets("Schedule").Range("E8").Value = info
                        Sheets("Schedule").Range("E8:E12").Interior.Color = RColor
                        T8 = T8 + 1
                    Else
                        T8 = T8 + 1
                    End If
                ElseIf T8 = 5 Then
                    If Cells(8, 6) = RGB(0, 0, 0) And Cells(12, 6) = RGB(0, 0, 0) Then
                        Sheets("Schedule").Range("F8").Value = info
                        Sheets("Schedule").Range("F8:F12").Interior.Color = RColor
                        T8 = T8 + 1
                    Else
                        T8 = T8 + 1
                    End If
                ElseIf T8 = 6 Then
                    If Cells(8, 7) = RGB(0, 0, 0) And Cells(12, 7) = RGB(0, 0, 0) Then
                        Sheets("Schedule").Range("G8").Value = info
                        Sheets("Schedule").Range("G8:G12").Interior.Color = RColor
                        T8 = T8 + 1
                    Else
                        T8 = T8 + 1
                    End If
                ElseIf T8 = 7 Then
                    If Cells(8, 8) = RGB(0, 0, 0) And Cells(12, 8) = RGB(0, 0, 0) Then
                        Sheets("Schedule").Range("F8").Value = info
                        Sheets("Schedule").Range("F8:F12").Interior.Color = RColor
                        T8 = T8 + 1
                    Else
                        T8 = T8 + 1
                    End If
                ElseIf T8 = 8 Then
                    If Cells(8, 9) = RGB(0, 0, 0) And Cells(12, 9) = RGB(0, 0, 0) Then
                        Sheets("Schedule").Range("F8").Value = info
                        Sheets("Schedule").Range("F8:F12").Interior.Color = RColor
                        T8 = T8 + 1
                    Else
                        T8 = T8 + 1
                    End If
                End If

这是如何工作的,对于某个 btime,它将通过检查单元格的颜色来检查该时间和日期所需的单元格是否为空。由于某种原因,即使单元格没有颜色,它仍然会跳过它并继续下一个。

我知道这很长,但我已经和这件事抗争了一个多月了,真的需要一些帮助。提前感谢任何这样做的人。

我在你的代码中发现的问题是这部分

If Cells(8, 2) = RGB(0, 0, 0) And Cells(12, 2) = RGB(0, 0, 0) Then

单元格将获取指定单元格的值。你正在将它与 RGB(0, 0, 0)

进行比较

除非您的单元格为空或 0

,否则这将始终为假

(RGB(0, 0, 0) 值为0,当单元格为空时,VBA会认为是0)

如果要对比实际颜色,需要放

Cells(8, 2).Interior.Color = RGB(0, 0, 0)
Cells(8, 2).Font.Color = RGB(0, 0, 0)

另外,代码越短,越容易排错

下面部分

        If result = 0 Then            
            Select Case day
                Case "M"
                    Call caseM(i)
                Case "T"
                    Call caseT(i)
                Case "W"
                    Call caseW(i)
                Case "R"
                    Call caseR(i)
                Case "F"
                    Call caseF(i)
            End Select             
        ElseIf result1 = 0 Then
            Select Case day
                Case "M"
                    Call caseM(i)
                Case "T"
                    Call caseT(i)
                Case "W"
                    Call caseW(i)
                Case "R"
                    Call caseR(i)
                Case "F"                   
                    Call caseF(i)
            End Select
        End If

由于您正在执行完全相同的程序,因此可以将其写为

        If result = 0 or result1 = 0Then            
            Select Case day
                Case "M": Call caseM(i)
                Case "T": Call caseT(i)
                Case "W": Call caseW(i)
                Case "R": Call caseR(i)
                Case "F": Call caseF(i)
            End Select             
        End If

注意:":"" 表示在 ":" 之后将被视为下一行


还有下面的部分

If T8 = 1 Then
    If Cells(8, 2) = RGB(0, 0, 0) And Cells(12, 2) = RGB(0, 0, 0) Then
        Sheets("Schedule").Range("B8").Value = info
        Sheets("Schedule").Range("B8:B12").Interior.Color = RColor
        T8 = T8 + 1
    Else
        T8 = T8 + 1
    End If
ElseIf T8 = 2 Then
    If Cells(8, 3) = RGB(0, 0, 0) And Cells(12, 3) = RGB(0, 0, 0) Then
        Sheets("Schedule").Range("C8").Value = info
        Sheets("Schedule").Range("C8:C12").Interior.Color = RColor
        T8 = T8 + 1
    Else
        T8 = T8 + 1
    End If
...........

可以改写为

If Cells(8, T8 + 1).Interior.Color = RGB(0, 0, 0) And Cells(12, T8 + 1).Interior.Color = RGB(0, 0, 0,) Then
    Sheets("Schedule").Cells(8, T8 + 1).Value = info
    Sheets("Schedule").Range(Cells(8, T8 + 1),Cells(12, T8 + 1)).Interior.Color = RColor
End if
T8 = T8 + 1