在我自己电脑上测试过,你的宏代码没有问题,当然,由于是我自己的环境测试的,可能跟你的不同.
我感觉可能出现的问题是下标越界,即你的Workbook中,有时没有 Sheets(bm) 这个对象,
你可以 加一段检测代码,来确保执行效果:
LOCAL shtOK as Boolean
&& Sheet名称是否存在?
TRY
myexcel = CREATEOBJECT("Excel.Application")
wb = myexcel.Workbooks.open(cExl)
* myexcel.Visible = .T.
FOR ii=1 TO wb.sheets.count
IF wb.sheets(ii).name =cSht
then
shtOK = .t.
EXIT for
ENDIF
ENDFOR
CATCH TO ex
MESSAGEBOX(ex.message)
ENDTRY
IF shtOK = .f. THEN
RETURN -3
ENDIF
*......如果Sheet存在,再执行以下代码......*
Try
&& 这一段是确保用户的Excel允许运行宏,没有VBA信任设置方面的问题
oVBE = myexcel.VBE.ActiveVBProject
oErr = Null
Catch To oErr
MESSAGEBOX(oErr.message)
Endtry
If !Isnull(oErr) And oErr.ErrorNo == 1943
Text to cMsg Noshow Pretext 1+2
当前的 Excel 配置不允许执行这个宏,请检查 Excel 配置。
请确认勾选了: 可靠发行商中的 “信任对 Visual Basic 项目”的访问
EndText
Messagebox(cMsg, 16, 'pasteDbf2Excel')
myexcel.Visible = .T.
(1).Controls(6).Controls(14).Controls(3).Execute()
Endif
TRY
* Excel写入宏代码
*
wb.vbproject.vbcomponents.Add(1).codemodule.addfromstring(cVbCode)
&& 这样加也可以,但是不方便最后删除宏
*
所以我这样给Excel添加宏,这样的好处是方便最后删除宏代码
om = myexcel.VBE.ActiveVBProject.VBComponents.Add(1)
om.name = "FillFromArray_vbs"
om.CodeModule.AddFromString(cVbCode)
myexcel.Run('ArrayFill', @arrEsj)
* 输出表头
FOR ii =1 TO FCOUNT(cAlias)
wb.sheets(cSht).cells(1,ii).value = FIELD(ii,cAlias)
ENDFOR
* 删除宏代码:
myexcel.VBE.ActiveVBProject.VBComponents.remove(om)
wb.save()
wb.close()
myexcel.quit()
CATCH TO ex
MESSAGEBOX(ex.message)
FINALLY
myexcel.quit()
RELEASE myexcel
RELEASE arrEsj
ENDTRY