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)

我认为保护需要保持。 (如果没有,只是删除保护,它应该工作…)

  1. 在sorting部分之前进行.Unprotect然后保护
  2. 如果代码在某处设置了保护,请添加UserInterFaceOnly:=True以便为用户保护工作表,但不保护代码( XXX.Protect UserInterFaceOnly:=True