ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

运行时错误“9”,下标越界。跪求高手指点

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-1-14 14:41 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
下面这段代码是编制“提示到龄退休员工”
运行显示“运行时错误“9” 下标越界”

点击调试,“arrRmContent(1, k) = arrData(i, 1)” 上面语句变成黄色。

请问如何处理。

我学的这段编程excel中录入的“员工信息”条目为10条,如果“员工信息”条目为20条,请问编程该如何修改。谢谢,请高手们指点。

全部编程如下:
Dim iRemindTimes As Integer
Const AllowRtTimes = 100
Const BefDays = 60
Private Function RetireDay(ByVal datBirthDay As Date, ByVal strSex As String, ByVal strCap As String) As Date
Dim iRtage As Integer
iRtage = IIf(strSex = "男", 60, IIf(strCap = "工人", 50, 55))
RetireDay = DateSerial(Year(datBirthDay) + iRtaAge, Month(datBirthDay), Day(datBirthDay))
End Function
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim arrData
Dim i As Integer
Dim k As Integer
Dim datRtr As Date
Dim arrRmContent
if iRemindTimes >= AllowRtTimes Then Exit Sub
If Sh.Name = "人事数据表" Then
iRemindTimes = iRemindTimes + 1
arrData = Range("b3:k3" & [b65536].End(xlUp).Row)
ReDim arrRmContent(1 To 11, 1 To UBound(arrData))
arrRmContent(1, 1) = "工号"
arrRmContent(2, 1) = "姓名"
arrRmContent(3, 1) = "部门"
arrRmContent(4, 1) = "学历"
arrRmContent(5, 1) = "生日"
arrRmContent(6, 1) = "性别"
arrRmContent(7, 1) = "入职"
arrRmContent(8, 1) = "职称"
arrRmContent(9, 1) = "职务"
arrRmContent(10, 1) = "身份"
arrRmContent(11, 1) = "退休日期"
k = 1
For i = 1 To UBound(arrData)
datRtr = RetireDay(arrData(i, 5), arrData(i, 6), arrData(i, 10))
If RetireDay(arrData(i, 5), arrData(i, 6), arrData(i, 10)) - Now < BefDays Then
k = k + 1
arrRmContent(1, k) = arrData(i, 1)
arrRmContent(2, k) = arrData(i, 2)
arrRmContent(3, k) = arrData(i, 3)
arrRmContent(4, k) = arrData(i, 4)
arrRmContent(5, k) = arrData(i, 5)
arrRmContent(6, k) = arrData(i, 6)
arrRmContent(7, k) = arrData(i, 7)
arrRmContent(8, k) = arrData(i, 8)
arrRmContent(9, k) = arrData(i, 9)
arrRmContent(10, k) = arrData(i, 10)
arrRmContent(11, k) = datRtr
End If
Next i
ReDim Preserve arrRmContent(i To 11, 1 To k)
If k > 1 Then
UsfRtRmnd.lstRtRmnd.List = Application.Transpose(arrRmContent)
UsfRtRmnd.Show False
End If
End If
End Sub
Private Sub Workbook_Activate()
If ActiveSheet.Name = "人事数据表" Then Call Workbook_SheetActivate(ActiveSheet)
End Sub

TA的精华主题

TA的得分主题

发表于 2014-1-14 14:52 | 显示全部楼层
下标越界可能是数组访问超下标,也可能是访问到不存在的对象。
你最好上个附件,说明想要做什么。光看一段代码是无法确定问题所在的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-14 15:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
antlia 发表于 2014-1-14 14:52
下标越界可能是数组访问超下标,也可能是访问到不存在的对象。
你最好上个附件,说明想要做什么。光看一段 ...

谢谢,马上上传,忘您多指点。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-14 15:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
还望大侠们多多指导,谢谢了。附件已上传。

职工退休年龄提醒表.rar

22.72 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2014-1-14 16:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 antlia 于 2014-1-14 16:05 编辑
sophia_yang 发表于 2014-1-14 15:11
还望大侠们多多指导,谢谢了。附件已上传。


你原来的程序除了这句 ReDim Preserve arrRmContent(i To 11, 1 To k) 造成的运行时错误之外,
还有退休年龄计算函数Private Function RetireDay(ByVal datBirthDay As Date, ByVal strSex As String, ByVal strCap As String) As Date 内部代码的逻辑错误,造成计算退休日期不准确的问题,我已经一并帮你修复了。

此外还有2 个问题:
1. 你原表的 “入职时间” 列似乎应该是记录的员工年龄
2. 所有已经退职的员工记录不应该再存在于这张表格中,本表中应该仅提醒60天内即将退休的员工记录。

目前按照你原有程序的逻辑,将已经退休的员工与即将退休的员工一并提示在那个窗口里了。

具体请参考附件

职工退休年龄提醒表.zip

21.49 KB, 下载次数: 7

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-14 16:14 | 显示全部楼层
antlia 发表于 2014-1-14 16:03
你原来的程序除了这句 ReDim Preserve arrRmContent(i To 11, 1 To k) 造成的运行时错误之外,
还有退 ...

谢谢了,我刚接触编程,这段编程从昨天就开始看了,看到现在也不太明白。

前辈还有一个问题,现在统计的员工是10人,如果员工增加至20人,需要如何修改程序?
您有空了,再指点我一下,谢谢了。

TA的精华主题

TA的得分主题

发表于 2014-1-14 16:37 | 显示全部楼层
本帖最后由 antlia 于 2014-1-14 16:47 编辑
sophia_yang 发表于 2014-1-14 16:14
谢谢了,我刚接触编程,这段编程从昨天就开始看了,看到现在也不太明白。

前辈还有一个问题,现在统计 ...


你是说条目从10条修改为20条?
等俺给修改一下程序变成条目自适应的。

TA的精华主题

TA的得分主题

发表于 2014-1-14 17:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
antlia 发表于 2014-1-14 16:03
你原来的程序除了这句 ReDim Preserve arrRmContent(i To 11, 1 To k) 造成的运行时错误之外,
还有退 ...

已修改完成。
现在程序会自适应表格的条目,即有多少条都自动读取。

职工退休年龄提醒表.zip

22.91 KB, 下载次数: 19

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-14 17:17 | 显示全部楼层
antlia 发表于 2014-1-14 17:10
已修改完成。
现在程序会自适应表格的条目,即有多少条都自动读取。

谢谢了。 我还要再研究好几天了。

TA的精华主题

TA的得分主题

发表于 2014-1-14 20:43 | 显示全部楼层
感觉有的不需要重复写,用循环语句应该简单点
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-23 10:08 , Processed in 0.036541 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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