zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    C#之集合常用扩展方法与Linq
    PHP核心之MVC设计模式
    Javascript高级之变量
    Javascript高级之console调试
    Javascript高级之概述
    MySQL数据库之PDO扩展
    MySQL数据库之MySQL扩展
    MySQL数据库之数据库备份与还原
    MySQL数据库之预处理
    MySQL数据库之函数
  • 原文地址:https://www.cnblogs.com/lunawzh/p/5920973.html
Copyright © 2011-2022 走看看