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
时间: 2024-10-10 07:29:37

VBA练习-复杂一点的相关文章

应用VBA在Excel表中执行统计

临时接到一个Excel表,要执行统计工作,手工做法很麻烦,应用VBA稍微熟悉一点. 很长时间不做的话就会陌生,写一点记录以备后查. 1.在一个模块中定义结构体,用于记录数据,一般是针对一行一个结构体. '定义物料编码的结构体 Public Type WZStruct WLBM As String '物料编码 WLZ As String '物料组 WLMS As String '物料描述 DW As String '单位 WLSum2017 As Single '计算统计的和 WLSum2018

VB类模块中属性的参数——VBA中Range对象的Value属性和Value2属性的一点区别

在VB中,属性是可以有参数的 -- 即: VB的语法,使用参数的不一定是方法,也有可能是属性!(虽然属性的本质是方法) 例一:参数当作"索引"使用 定义一个类模块,模块名称Ints.为简化模型,使用了只读属性. 1 Private arr(3) As Integer 2 3 Public Property Get ArrValue(Index As Integer) As Integer 4 ArrValue = arr(Index) 5 End Property 6 7 '初始化ar

冒个泡,还活着??做了个项目,一点感想。

的确,成家后,很多时间都由不得自己安安静静地花时间去学习了.从3月底到7月底,香港.买车.婚礼,很多事情都在今年一起办了. 8月初的时候接到一个项目,做微信定制开发的,由于是兼职,有持续一周的时间,每天晚上和朋友加班到晚上3.4点,第二天又正常上班.而且之前没做过定制开发(甲方要求用户体验高.很多细节的技术还要即时攻尖),虽然很累,但是最后做出来了,而且上线20多天,经过2000人左右的体验,没出什么大问题,已经感到很高兴了. 虽然还有项目尾款没拿到,但还是用之前的钱,为自己换了一台mac pr

使用VBA进行JS反混淆,还原JS代码。

本文地址:http://www.cnblogs.com/Charltsing/p/JSEval.html 联系QQ:564955427 类似下面的代码是登陆 全国企业信用信息公示系统(安徽)(网址:http://www.ahcredit.gov.cn/search.jspx)时得到的,需要反混淆. eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>32?String.fromCha

Excel VBA自动添加证书(二)

继续上次没有写完的随笔,本来是很想一次性写完的,但是到中午一点了还没有吃东西,其实饿的不行了,还好写博客时会自动保存,中间电脑实然蓝屏,花了二个多小时写的没有点击保存,吓我一下,以为会全没了. 前面讲到的证书,对大多数公司来说,对安全要求不高的,可能也就不会去管这个东东了,只有像一些金融或政府的软件会对这个东西加安全证书,我到现在对它的了解也不是很深,先看一下它的样子: 关于它的详细信息,可以参考http://msdn.microsoft.com/zh-cn/library/cc728388%2

[VBA]批量替换PPT里的字体颜色

不知道为什么计组老师的大量课件字体是伤害视力的亮蓝色……看久了眼睛疼,想把颜色替换成保护视力一点的灰色,但是找了N久也没找到在图形界面上直接操作的方法,于是在MSDN上晃了晃,Google了一下,写了个VBA小脚本,只替换选定颜色,这样可以保留红色或者其他颜色的高亮,顺便把让人分心的花花背景也干掉. Sub ReplaceColor() Dim shape As shape Dim slide As slide Dim txt As TextRange On Error Resume Next

excel中VBA的使用

遇到的问题 在工作中遇到了一点小小的问题,需要给我负责带的班级的同学们测试男生1000米,女生800米的成绩.表格是这样的: 体育成绩表 序号 班级 姓名 性别 男1000.女800 成绩 1 1 张三 男 3.50   2 1 李四 女 3.44   我们在录入完成绩后,需要按照一定的标准去给出学生成绩,标准是这样的: 需要我们根据每个学生的成绩,给出对应的分数.于是,我就计算了下我的工作量:每个人对应的需要给分数,总共需要给六个班 x 70 个人也就是差不多420个人给分数.那样的一个工作量

VBA编程的工程性规划

看过很多人写的VBA代码,一团一团的,一点规划都没有,为了VBA编程更具工程性,这里讨论一下,并列出自己的一些建议:0.给VBA工程定义一个名字,而非直接使用默认的名称--"VBAProject",以方便以后可能要进行的跨VBA工程编码1.定义一个命名为"O"的标准模块[拼音中"O"字母的读音,意指"我"这个字],用于定义所有的全局对象,管理本工程的代码与数据,主要API:    [1]About(Optional ShowD

Excel 中用 VBA 字典查找代替 VLOOKUP

从上一篇<PYTHON操作EXCEL>可以看到,Python 操作 Excel 已非常自如方便.但是 Python 和相关库毕竟是一个额外的依赖,若能从 Excel 自身解决此类问题,自然是更为易用. 1. VBA 中的哈希表 用 Python 的着眼点主要是 VLOOKUP 公式太慢了,所以关键是要找到一种更高效的算法或数据结构定位数据.VLOOKUP 要求对列进行排序,内部应该是对列内数据进行二分查找,算法上不好再优化了,那就只好更换一种数据结构.搜索了一下,VBA 提供了 Scripti