1、实现原理:

艾宾浩斯seid一个知识点学习后要复习8次后可达到永久记忆(这个还有待验证。。。),其复习间隔时间分别为1d、2d、4d、7d、15d、30d、90d、180d。

2、实现效果:

在一个sheet【学习清单】里按日期记录每天的学习内容(如图1),在另外一个sheet【当日复习清单】里提供日期选择功能,并根据选择日期切换显示当日需要复习的内容(如图2)。

图1:

图2:

3、用到的知识点:

3.1 二分查找算法:

随着记录的学习内容渐渐多,需要节省查找时间。使用这个算法的前提是每天的学习内容是按日期升序排序的。

3.2 vba返回单元格的3种方式:

sheet1.range("b2:d4");sheet1.cells(3,4);sheet1.[a2:d6]。因为涉及不同sheet表之间的取值,所以需要标明sheet页名称。

3.3 返回一列单元格有数据的最后一行:

Worksheets("学习清单").Range("a1048576").End(3).Row

Range("a1048576").End(3) 代表从 a1048576单元格往前查找到的第一个有数据的单元格。

Range("a1048576").End(3).Row 表示A列单元格最下面一个有数据的单元格的行号。

End(3)这个3代表常量 xlup,表示向上搜索。

2003版本后一张Excel工作表,最多可以包括1048576行和16384列。

3.4 vba中实现数值改变单元格后触发事件:

假设要判断的值在A1,则代码为:

Dim oldval

Private Sub Worksheet_Activate()

oldval = [a1]

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

If oldval <> [a1] Then

oldval = [a1]

'在此输入操作代码

End If

End Sub

4、全部vba代码如下:

1 Dim date_select '选择的复习日期

2 Dim array_a(8) '存储复习间隔,共8个间隔

3

4 Private SubWorksheet_Activate()5 date_select = Worksheets("当日复习清单").[b1]6 array_a(8) = 1

7 array_a(7) = 2

8 array_a(6) = 4

9 array_a(5) = 7

10 array_a(4) = 15

11 array_a(3) = 30

12 array_a(2) = 90

13 array_a(1) = 180

14 End Sub

15 Private Sub Worksheet_Change(ByVal Target AsRange)16 If date_select <> Worksheets("当日复习清单").[b1] Then

17 date_select = Worksheets("当日复习清单").[b1]18 Worksheets("当日复习清单").[a4:d1048576] = ""

19

20 Dim array_b(8) '存储所选择的复习日期对应的学习日期,共8个

21 Dim hang_all, hang_half '学习日期的有数据的最后行号和中间行号

22 Dim find_begin, find_end '查找学习日期时的开始行号和结束行号

23

24 Dim hang_now '存储复习内容的长度,每次选择日期后会更新为0

25 hang_now = 0

26

27 hang_all = Worksheets("学习清单").Range("a1048576").End(3).Row '返回一列单元格有数据的最后一行

28 hang_half = Int(hang_all / 2)29

30 For i = 1 To 8 '计算学习日期

31 array_b(i) = date_select -array_a(i)32

33 If Worksheets("学习清单").Cells(hang_half, 1) <= array_b(i) Then '利用二分查找算法提高查找效率

34 Do While Worksheets("学习清单").Cells(hang_half, 1) = Worksheets("学习清单").Cells(hang_half - 1, 1)35 hang_half = hang_half - 1

36 Loop '解决:中间行号的学习日期和前后日期相等的情况

37 find_begin =hang_half38 find_end =hang_all39 Else

40 Do While Worksheets("学习清单").Cells(hang_half, 1) = Worksheets("学习清单").Cells(hang_half + 1, 1)41 hang_half = hang_half + 1

42 Loop '解决:中间行号的学习日期和前后日期相等的情况

43 find_begin = 2

44 find_end =hang_half45 End If

46

47 For j = find_begin To find_end '根据学习日期返回复习内容

48 If Worksheets("学习清单").Cells(j, 1) = array_b(i) Then

49 hang_now = hang_now + 1

50 Worksheets("当日复习清单").Cells(hang_now + 3, 1) =hang_now51 Worksheets("当日复习清单").Cells(hang_now + 3, 2) = Worksheets("学习清单").Cells(j, 2) '复习内容

52 Worksheets("当日复习清单").Cells(hang_now + 3, 3) = Worksheets("学习清单").Cells(j, 3) '时长

53 Worksheets("当日复习清单").Cells(hang_now + 3, 4) = Worksheets("学习清单").Cells(j, 1) '学习日期

54 End If

55 Nextj56 find_find = j '因为要找的学习日期是升序存储的,所以查找下一个学习日期时可以把查找的开始行号改为j

57 Nexti58 Dimtime_sum59 time_sum = Application.WorksheetFunction.Sum(Worksheets("当日复习清单").Range("c:c"))60 Worksheets("当日复习清单").[a2] = "共需复习" & hang_now & "个内容,共需" & time_sum & "分钟"

61 End If

62 End Sub

java编辑遗忘曲线代码_通过excel vba 实现艾宾浩斯遗忘曲线的复习提醒相关推荐

  1. ie 不执行回调函时_「Excel VBA操作IE篇」10分钟内设置完成,3句代码打开IE浏览器

    大家好,我是咚腔! Excel VBA还可以 操作IE浏览器,有没有搞错? 没错,可以操作,而且非常好用.因为Excel有强大的数据分析功能. 这有什么关系?关系很大. 现在是数据时代,定期数据获取以 ...

  2. iframe视频代码_在Excel中创建IFRAME代码

    iframe视频代码 If you want to embed a YouTube video on your website, YouTube will create some IFRAME cod ...

  3. cxgrid 行合并单元格_【Excel VBA】如何批量撤销合并单元格?

    周末好,之前我们分享了批量合并单元格的VBA小代码,链接参考: [Excel VBA]如何批量合并相同值单元格? 天下大势合久必分.分久必合.分分合合合合分分又合合合再分分分又又合合合合合合合---- ...

  4. zemax 宏怎么编写数组_编写Excel VBA程序的10个技巧

    学习Excel技术,关注微信公众号: excelperfect 学会一些有趣的技巧或想法,能够有效地提高ExcelVBA编程水平.下面是chandoo.org总结的编写Excel VBA程序的10个技 ...

  5. java电子日记本代码_计算法日记将规则的价值视为无需计算机的代码

    java电子日记本代码 I've been preparing a presentation for the Canadian Institute for the Administration of ...

  6. java局域网聊天代码_简单的局域网聊天程序(java版本的)

    局域网聊天程序,首先我已经默认你的电脑已经配置好的java开发的一些环境,所需代码有两个java的源代码,他们分别是1:Server_Test.java-------2:Socket_Test.jav ...

  7. java三目运算符简化代码_如何使用传播运算符简化代码

    java三目运算符简化代码 by Matt Granmoe 通过Matt Granmoe 如何使用传播运算符简化代码 (How to simplify your code with the sprea ...

  8. java 测试用例核心代码_核心Java测验

    java 测试用例核心代码 Welcome to Core Java Quiz. Java is an object-oriented programming language. 欢迎来到Core J ...

  9. cdo收取邮件_【Excel VBA】- 使用CDO批量发送邮件(二)

    前一期为大家介绍了如何使用VBA结合Outlook批量发送邮件,需要批量为不同的人发送不同的附件等,可以很方便的批量发送.但缺点是需要事先配置Outlook邮箱.那有没有不需要配置Outlook即可批 ...

最新文章

  1. fanuc机器人四边形编程_FANUC机器人示教编程:原始路径恢复功能介绍与使用方法...
  2. Vim 下使用 Slimv(类似Slime) 轻松调试 Common Lisp
  3. 【String类、static、Arrays类、Math类】
  4. 《假如编程是魔法之零基础看得懂的Python入门教程 》——(七)我把魔法变成了积木
  5. 那些在11gR2中可能惹祸的新特性,一张列表帮助你摆脱升级11gR2带来的烦恼
  6. UPX3.03+UpolyX.5 Shell v1.0 汉化绿色版
  7. 15、三数之和(python)
  8. Android App图标尺寸
  9. Mac运行node.js连接oracle数据库报DPI-1047: Cannot locate a 64-bit Oracle Client library: “dlopen(libclntsh.dy
  10. java 串行_java串行化
  11. java开发是it行业吗_转行IT行业为什么选择学习Java开发
  12. opencv入门Vec3f
  13. 将切割后的小图片还原为大图片
  14. 简单易学的机器学习算法——Metropolis-Hastings算法
  15. 【git之路】拉取远程分支到本地
  16. 计算机一直显示配置更新失败怎么办,win10电脑windows更新失败怎么办?更新失败却一直在更新...
  17. 以网游服务端的网络接入层设计为例,理解实时通信的技术挑战
  18. 读书笔记:《SEO教程:搜索引擎优化入门与进阶》(4)——代码优化
  19. JAVA事务回滚的使用方法
  20. 轮播图制作(htmlcssjs)

热门文章

  1. 超市管理系统用例建模
  2. Go 1.19.3 error原理简析
  3. android初学者_初学者:如何在Android设备上的打开的应用程序之间切换
  4. Apache Doris技术实践
  5. Golang-channel实现
  6. 古玩文物字画寄售系统源码
  7. pygame 实现键盘鼠标映射
  8. 遇到bug的解决办法,测试再也不背锅了
  9. 发票OCR识别技术太屌了,哈哈哈哈
  10. super oj p528