VBA练习-复杂一点

'日期添加
Sub addDate(d)
    Dim rg As Range, dd As Date
    
    d = Split(d, "-")(0)
    d = Replace(d, ".", "/")
    dd = CDate(d)
    r = ActiveSheet.Range("a65536").End(xlUp).Row
    '[d2] = dd
    Dim i As Integer '一天8次课,循环4次结束一天
    i = 0
    For Each rg In Range("D2:D" & r)
        i = i + 1
        If i = 4 Then
            i = 0
            dd = rg.Offset(-1, 0).Value + 1
        End If
        rg = dd
    Next
End Sub
'创建新表
Sub createsheet(sname)
    On Error Resume Next
    Set ws = Worksheets(sname)
    If ws Is Nothing Then
        Set ws = Worksheets.Add
        ws.Name = sname
    Else
        ws.Cells.Clear
    End If
    ws.Range("a1:j1") = Array("周序", "简称", "教学班次", "日期", "星期", "节次", "课程名称", "任课教员", "上课地点", "页码")
End Sub
'拆开合并单元格
Sub devideMerge()
    Dim r As Integer, rg As Range, i As Integer
    
    r = Range("a65536").End(xlUp).Row
    For i = 2 To r
        If (Range("e" & i).MergeCells) Then Range("e" & i).UnMerge
        tempValue = Range("e" & i).Value
        If (tempValue = "") Then
            Range("E" & i).Value = Range("e" & (i - 1)).Value
            
        End If
   Next
End Sub
'删除空行
Sub delBlank()
    Dim c As Range, r As Integer
    r = Range("a1").CurrentRegion.Rows.Count
    
    For i = 2 To r
        Set c = Range("b" & i)
        If c.MergeCells Then c.EntireRow.Delete
    Next
    
    r = Range("a1").CurrentRegion.Rows.Count
    
     For i = r To 2 Step -1
        Set c = Range("b" & i)
        If c.MergeCells Or IsEmpty(c) Then c.EntireRow.Delete
    Next
  
End Sub
'生成总周课表
Sub totalSheet()
    On Error Resume Next
    strname = "总周课表"
     Dim ws As Worksheet, obj As Worksheet, r As Integer
     
    Set ws = Worksheets(strname)
    If ws Is Nothing Then
      Set ws = Worksheets.Add
       ws.Name = strname
    Else
        ws.Cells.Clear
    End If
    ws.Range("a1:j1") = Array("周序", "简称", "教学班次", "日期", "星期", "节次", "课程名称", "任课教员", "上课地点", "页码")

   
    For Each obj In Worksheets
        If (obj.Name <> strname And obj.Name Like "*-周课表") Then
             r = obj.UsedRange.Rows.Count
            
            obj.Select
            obj.Rows("2:" & r).Select
            Selection.Copy
            ws.Select
            ws.Range("a65536").End(xlUp).Offset(1, 0).Select
            ActiveSheet.Paste
            
               '选中一个单元格
            obj.Range("a1").Select
        End If
    Next
    ws.Range("a1").Select
    
End Sub



Sub 生成周课表()
'
' 生成周课表 宏
'
' 快捷键: Ctrl+k
'
    Application.ScreenUpdating = False
    
    Const copycol = 28
    Dim ws As Worksheet, cws As Worksheet, upNo As Integer, r As Integer, cname As String, rg As Range, str As String, curRow
    

    For Each ws In Worksheets
        '创建新表-周课表
        cname = ws.Name + "-周课表"
        createsheet cname
        Set cws = Worksheets(cname)
        
        upNo = ws.Range("a:a").Find("序号").Row
        
        '开始复制内容
        For i = 4 To upNo - 1
            curRow = 28 * (i - 4) + 2
            '简称
            ws.Range("C" & i & ":AD" & i).Copy
            cws.Range("B" & curRow & ":B" & curRow * copycol).Select
            Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=True
            '节次
            ws.Range("C3:AD3").Copy
            cws.Range("f65536").End(xlUp).Offset(1, 0).Select
            Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=True
            '星期
            ws.Range("C2:AD2").Copy
            cws.Range("E65536").End(xlUp).Offset(1, 0).Select
            Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=True
            
            
    
            '周序
            str = ws.Range("a" & i).Value
            cws.Range("a65536").End(xlUp).Offset(1, 0).Resize(copycol, 1).Select
            Selection = str
        
            
           
        Next
        '日期处理
        cws.Select
        addDate ws.Range("b4").Value
        
            
        '删除空行
        r = cws.Range("a65536").End(xlUp).Row
        delBlank
        
         '课程名称
        str = ws.Range("f1").Value
        cws.Range("C65536").End(xlUp).Offset(1, 0).Resize(cws.Range("a65536").End(xlUp).Row - 1, 1).Select
        Selection = str
        
        '页码
        str = ws.Range("aa65536").End(xlUp).Value
        cws.Range("J65536").End(xlUp).Offset(1, 0).Resize(cws.Range("a65536").End(xlUp).Row - 1, 1).Select
        Selection = str
        
        '查找
         r = ws.Range("a65536").End(xlUp).Row
        For k = upNo + 2 To r
            Set rg = ws.Range("g" & k)
            If Not IsEmpty(rg) And Not rg.MergeCells Then
                For g = 2 To cws.Range("b65536").End(xlUp).Row
                    Set crg = cws.Range("b" & g)
                    If (crg.Value = rg.Value) Then
                       
                       cws.Range("G" & g) = ws.Range("b" & k).Value '课程名称
                       cws.Range("H" & g) = ws.Range("n" & k).Value   '任课教员
                       cws.Range("I" & g) = ws.Range("AA" & k).Value  '上课地点
                    End If
                Next
            End If
        Next
        '把星期重新分开
        devideMerge
        
        '添加边框
        cws.UsedRange.Borders.LineStyle = xlContinuous

    Next
    Application.ScreenUpdating = True
    
    '生成总周课表
    totalSheet
End Sub

Sub 查看上课情况()
    Application.ScreenUpdating = False
    
    Dim jc As String, username As String, startRow As Integer, lastRow As Integer
    
    Dim curWs As Worksheet, ws As Worksheet, rg As Range
    
    Set curWs = ActiveSheet
    
    username = curWs.Range("af2").Value
    If Len(username) = 0 Then
        MsgBox "请在AF2单元格添写上课教员"
        Range("af1") = "上课教员:"
        Range("af2").Select
        Exit Sub
    End If
    
    '标记当前活动表
    startRow = curWs.Range("a:a").Find("序号").Row
    lastRow = curWs.Range("a:a").Find("序号").End(xlDown).End(xlDown).Row
    'MsgBox startRow & ":" & lastRow
    '找教员上的课程简称
    For x = startRow + 2 To lastRow - 1
       
        If (curWs.Range("n" & x).Value Like "*" & username & "*") Then
        
            jc = curWs.Range("g" & x).Value
           '简称不能为空
           If (jc <> "") Then
                '如果找到就从课表中寻找上的课并添加底色
                For Each rg In curWs.Range("c4:ad" & startRow - 1)
                    If rg.Value = jc Then '找到
                        rg.Interior.ColorIndex = 39
                    End If
                Next
            End If
        End If
    Next
    
MsgBox "表有" & Worksheets.Count

    '循环所有表除了本表外
    For Each ws In Worksheets
        If (ws.Name <> curWs.Name) Then
           startRow = ws.Range("a:a").Find("序号").Row
           lastRow = ws.Range("a:a").Find("序号").End(xlDown).End(xlDown).Row
           
           '找教员上的课程简称
           For i = startRow + 2 To lastRow - 1
              If (Range("n" & i).Value Like "*" & username & "*") Then
              
               jc = ws.Range("g" & i).Value
                '从所有单元格中找
                ' MsgBox jc
                    If (jc <> "") Then
                         For Each rg In ws.Range("c4:ad" & startRow - 1)
                            If rg.Value = jc Then '找到
                                curWs.Range(rg.Address).Interior.ColorIndex = 39
                            End If
                        Next
                    End If
              End If
           Next
           
        End If
        
    Next
    Application.ScreenUpdating = True
    
End Sub

'清楚背景色标记
Sub 清楚背景色标记()
   ActiveSheet.Cells.Interior.ColorIndex = 0
End Sub
原文地址:https://www.cnblogs.com/lunawzh/p/5920973.html