ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3953|回复: 15

[求助] 根据“教师课程分担”与“部颁课时”得到承担课程课时任务一览表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-9-1 12:10 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
目标:根据“教师课程分担”与“部颁课时”得到承担课程课时任务一览表。公式或VBA均可,关键是速度……最近在工作中遇到这个难题,希望得到各位大神的帮助,成分感激啊!!!

根据“教师课程分担”与“部颁课时”得到承担课程课时任务一览表.zip

9.08 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2018-9-1 12:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Set d = CreateObject("scripting.dictionary")
  6.   Set d1 = CreateObject("scripting.dictionary")
  7.   With Worksheets("部颁课时")
  8.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  9.     c = .Cells(2, .Columns.Count).End(xlToLeft).Column
  10.     arr = .Range("a2").Resize(r - 1, c)
  11.     For i = 2 To UBound(arr)
  12.       bj = InStr("一二三四五六七八九", arr(i, 1))
  13.       Set d1(bj) = CreateObject("scripting.dictionary")
  14.       For j = 2 To UBound(arr, 2)
  15.         If Len(arr(i, j)) <> 0 Then
  16.           d1(bj)(arr(1, j)) = arr(i, j)
  17.         End If
  18.       Next
  19.     Next
  20.   End With
  21.   With Worksheets("教师课程分担")
  22.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  23.     c = .Cells(1, .Columns.Count).End(xlToLeft).Column
  24.     arr = .Range("a1").Resize(r, c)
  25.   End With
  26.   For i = 2 To UBound(arr)
  27.     bj = Val(Left(arr(i, 1), 1))
  28.     If d1.exists(bj) Then
  29.       For j = 2 To UBound(arr, 2)
  30.         If Len(arr(i, j)) <> 0 Then
  31.           If d1(bj).exists(arr(1, j)) Then
  32.             If Not d.exists(arr(i, j)) Then
  33.               ReDim brr(1 To 2)
  34.               brr(1) = arr(i, 1) & arr(1, j) & d1(bj)(arr(1, j))
  35.             Else
  36.               brr = d(arr(i, j))
  37.               brr(1) = brr(1) & ";" & arr(1, j) & d1(bj)(arr(1, j))
  38.             End If
  39.             brr(2) = brr(2) + d1(bj)(arr(1, j))
  40.             d(arr(i, j)) = brr
  41.           End If
  42.         End If
  43.       Next
  44.     End If
  45.   Next
  46.   With Worksheets("课时分担一览表")
  47.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  48.     .Range("c2:d" & r).ClearContents
  49.     arr = .Range("a2:d" & r)
  50.     For i = 1 To UBound(arr)
  51.       If d.exists(arr(i, 2)) Then
  52.         brr = d(arr(i, 2))
  53.         arr(i, 3) = brr(1)
  54.         arr(i, 4) = brr(2)
  55.       End If
  56.     Next
  57.     .Range("a2:d" & r) = arr
  58.   End With
  59. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-9-1 12:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
详见附件。

根据“教师课程分担”与“部颁课时”得到承担课程课时任务一览表.rar

16.96 KB, 下载次数: 16

TA的精华主题

TA的得分主题

发表于 2018-9-1 13:25 | 显示全部楼层
Sub aa()
Set d = CreateObject("scripting.dictionary")
With Sheets("教师课程分担")
    rw1 = .Cells(Rows.Count, 1).End(3).Row
    js = .Range("a1:q" & rw1)
End With
With Sheets("部颁课时")
    rw2 = .Cells(Rows.Count, 1).End(3).Row
    bb = .Range("b2:q" & rw2)
End With
ReDim ar(1 To UBound(js) * UBound(js, 2), 1 To 4)
For i = 1 To UBound(bb, 2)
    ky = bb(1, i)
    For j = 2 To UBound(bb)
        d(ky & j - 1) = bb(j, i)
    Next
Next
For i = 2 To UBound(js)
    lj = Mid(js(i, 1), 1, 1)
    For j = 2 To UBound(js, 2)
        kc = js(1, j)
        If js(i, j) <> "" Then
            r = d(js(i, j))
            If r = "" Then
                s = s + 1
                d(js(i, j)) = s
                ar(s, 1) = s: ar(s, 2) = js(i, j)
                ar(s, 3) = js(i, 1) & kc & d(kc & lj)
                ar(s, 4) = d(kc & lj)
            Else
                ar(r, 3) = ar(r, 3) & ";" & js(i, 1) & kc & d(kc & lj)
                ar(r, 4) = ar(r, 4) + d(kc & lj)
            End If
        End If
    Next
Next
Sheet4.Range("a2").Resize(s, 4) = ar
End Sub
加了一个表做测试

TA的精华主题

TA的得分主题

发表于 2018-9-1 13:26 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-2 16:40 | 显示全部楼层
万分感谢chxw68和excelvlookup两位老师的帮助!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-2 16:46 | 显示全部楼层
还想请教excelvlookup老师,在课程分担表中,我不想改变教师姓名的顺序,该怎么做?

TA的精华主题

TA的得分主题

发表于 2018-9-2 17:28 | 显示全部楼层
本帖最后由 excelvlookup 于 2018-9-2 17:30 编辑
偶然古月照江北 发表于 2018-9-2 16:46
还想请教excelvlookup老师,在课程分担表中,我不想改变教师姓名的顺序,该怎么做?

把这个Sheet4.Range("e2").Resize(s, 4) = ar改成这个Sheet4.Range("e2").Resize(UBound(fd), 4) = fd。并在其前面加上如下代码:
With Sheets("课时分担一览表 ")
    rw3 = .Cells(Rows.Count, 1).End(3).Row
    fd = .Range("a2:d" & rw3)
End With
for i=1 to s
for j=3 to ubound(fd,2)
fd(i,j)=ar(d(fd(i,2)),j)
next
next

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-2 20:22 | 显示全部楼层
excelvlookup 发表于 2018-9-2 17:28
把这个Sheet4.Range("e2").Resize(s, 4) = ar改成这个Sheet4.Range("e2").Resize(UBound(fd), 4) = fd。 ...

谢谢,高手!请问:如果课时分担一览表中的序号和姓名是链接过来的,我想保留序号和姓名链接怎么办?

TA的精华主题

TA的得分主题

发表于 2018-9-2 21:00 | 显示全部楼层
是想要一个超连接吗?
在教师表中增加代码如下:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row > 1 And Target.Column > 1 And Target.Value <> "" Then
    With Sheets("课时分担一览表 ")
        rw = .Cells(Rows.Count, 1).End(3).Row
        Set xm = .Range("b2:b" & rw).Find(Target.Value)
        If Not xm Is Nothing Then
        hh = xm.Row
        .Select
        .Range("a" & hh).Select
        End If
    End With
End If
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-13 15:47 , Processed in 0.026128 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表