VBS +错误:Microsoft Excel:范围类的sorting方法失败
这是我的第一篇文章,我是一个最近接pipe这个职位的系统pipe理员,以前有过这个职位的人已经退休了,我真的不知道该怎么联系他,所以我必须把自己的事情都弄清楚。
我遇到的问题是以下,我们在W2K8 R2机箱中有一个计划任务,这个任务基本上只是调用一个查询AD的.vbs(脚本),然后把输出放到Excel中,并发送一封电子邮件给很less有人以excel文件作为附件,我们最近从2010年(约4个月前)将Office套件升级到2013年。
我们并没有意识到这个报告并没有被发送出去,直到一个通常审查的人联系我们并要求报告,我才查看了计划任务的日志,但是没有logging任何错误,然后当审查脚本的日志,我注意到,执行查询广告的例程后回顾了所有的信息,并试图把所有的Excel Spreedsheet发生的事情,它突然停止,只有一个错误logging,见下一行:
Microsoft Excel: Sort method of Range class failed
我真的认为,最近升级到2013年做了一些事情,这就是为什么不生成报告,但我想从VB和Excel中更多expirence的人得到第二个意见。
我认为这段代码将信息添加到Excel中的是以下内容:
'sortthedetailssheet ' Set objRange=objSheetDetails.columns("A:D").EntireColumn Set objRange2=objSheetDetails.Range("C1") Set objRange3=objSheetDetails.Range("A1") objRange.Sort objRange2, xlAscending, objRange3, , xlDescending, , , xlYes ' 'sorttheMembershipsheet ' Set objRange=objSheetMembership.columns("A:C").EntireColumn Set objRange2=objSheetMembership.Range("A1") Set objRange3=objSheetMembership.Range("B1") objRange.Sort objRange2, xlAscending, objRange3, , xlAscending, , , xlYes
我会很感激任何的build议,因为我是非常新的vba,并认为将需要一段时间,以加快速度。
问题在于使用了Excel常量,这些常量在VB上下文中没有定义。 添加这个片段。
Const xlAscending = 1 Const xlYes = 1
你的潜在问题
经过一些更多的testing,我想我发现了什么可能会导致你的情况下这个错误: objSheetDetails
指的是一个受保护的(密码保护?)表,因此.sort
实际上不能sorting,因为它没有权利。
例
这个工作
Sheets("Feuil3").Protect Password:="pswdtest" Sheets("Feuil3").Unprotect Password:="pswdtest" Set objRange = Sheets("Feuil3").Columns("F:H").EntireColumn Set objRange2 = Sheets("Feuil3").Range("F1") Set objRange3 = Sheets("Feuil3").Range("G1") objRange.Sort objRange2, xlAscending, objRange3, , xlAscending, , , xlYes
1.这个失败了
Sheets("Feuil3").Protect Password:="pswdtest" Set objRange = Sheets("Feuil3").Columns("F:H").EntireColumn Set objRange2 = Sheets("Feuil3").Range("F1") Set objRange3 = Sheets("Feuil3").Range("G1") objRange.Sort objRange2, xlAscending, objRange3, , xlAscending, , , xlYes Sheets("Feuil3").Unprotect Password:="pswdtest"
解决scheme(S)
我认为保护需要保持。 (如果没有,只是删除保护,它应该工作…)
- 在sorting部分之前进行
.Unprotect
然后保护 - 如果代码在某处设置了保护,请添加
UserInterFaceOnly:=True
以便为用户保护工作表,但不保护代码(XXX.Protect UserInterFaceOnly:=True
)