找回密码
 加入
搜索
查看: 5196|回复: 17

[效率算法] 打开EXCEL 运行就会提示错误。[已解决]

  [复制链接]
发表于 2016-4-18 13:58:26 | 显示全部楼层 |阅读模式
本帖最后由 heroxianf 于 2016-4-18 15:08 编辑

KK兄  我怎么换了个函数,打开就要提示错误呢?

之前用老版本EXCELUDF打开操作没问题的。
_ExcelBookOpen($aWorkbook, $aFileName) ;打開EXCEL表
;~         $aWorkbook = ObjCreate("Excel.Application")
        With $aWorkbook.worksheets("") ;ActiveSheet;
Func liulan()
        $liulan = FileOpenDialog("浏览EXCEL格式", "", "EXCEL2007以下格式(*.xls)|EXCEL2010格式(*.xlsx)", 1)
        If FileExists($liulan) Then
                GUICtrlSetData($Input1, $liulan)
                $aFileName = GUICtrlRead($Input1)
        EndIf

        _Excel_BookOpen($aWorkbook, $aFileName) ;打開EXCEL表
;~         $aWorkbook = ObjCreate("Excel.Application")
        With $aWorkbook.worksheets("") ;ActiveSheet;
                $ProdArray = .range("A1").currentregion.value

                ;下面這段為 尋找跟替換 ;檢查 讀取到的檔案是否 有 不應該出現的字
                For $n = 0 To UBound($ProdArray) - 1
                        For $i = 0 To UBound($ProdArray, 2) - 1
                                $ProdArray[$n][$i] = StringReplace($ProdArray[$n][$i], "'", "")
                        Next
                Next
        EndWith

;~                 MsgBox(0, "", UBound($ProdArray, 2))
                ControlSetText($Form1, "", $Label2, UBound($ProdArray))
                ControlSetText($Form1, "", $label4, UBound($ProdArray, 2) - 1)

MsgBox(0, "", $ProdArray[3][$i])

        _Excel_BookNew($bWorkbook)
        If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookNew Example 1", "Error creating new workbook." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

        GUICtrlSetState($Button_kaishi, 64)

EndFunc   ;==>liulan
发表于 2016-4-18 14:06:11 | 显示全部楼层
本帖最后由 kk_lee69 于 2016-4-18 14:07 编辑

回复 1# heroxianf

_Excel_BookOpen  要返回對象吧

#include <Excel.au3>
$oExcel = _ExcelBookOpen(@ScriptDir&"\A1.xlsx",1,0) ;打開EXCEL表
$oExcel.ActiveSheet.Protect("123")
_ExcelBookClose($oExcel, 1, 0)
发表于 2016-4-18 14:09:20 | 显示全部楼层
回复 1# heroxianf

_Excel_BookOpen
打开一个现有的工作簿


#include <Excel.au3>
_Excel_BookOpen ( $oExcel, $sFilePath [, $bReadOnly = False [, $bVisible = True [, $sPassword = Default [, $sWritePassword = Default]]]] )


参 数
$oExcel 打开工作簿的 Excel 应用对象
$sFilePath 文件的路径与文件名
$bReadOnly [可选] 设置为 True, 以只读方式打开工作簿 (默认 = False)
$bVisible [可选] 设置为 True, 指定工作簿窗口可见 (默认 = True)
$sPassword [可选] 工作簿的读保护密码 (如果有, 默认无)
$sWritePassword [可选] 工作簿的写保护密码 (如果有, 默认无)

返 回 值
成功: 返回工作簿对象
失败: 返回 0, @error 设置 为非 0 值.
@error: 1 - $oExcel 不是一个对象或者不是一个应用对象
2 - $sFilePath 指定对象不存在
3 - 无法打开 $sFilePath. @extended 设置为打开方法返回的 COM 错误代码
4 - 不允许读写访问. 工作簿可能已由另一个用户/任务打开

备 注
 楼主| 发表于 2016-4-18 14:12:45 | 显示全部楼层
回复 3# kk_lee69


    KK啊  就是上次您帮助我的帖子,我想改成新版的UDF函数 结果就出错了
发表于 2016-4-18 14:19:51 | 显示全部楼层
本帖最后由 kk_lee69 于 2016-4-18 14:21 编辑

回复 4# heroxianf

你的第八行 沒有返回對象
第10行 怎麼會有對象可以用

把第八行 改成 $aWorkbook=_Excel_BookOpen($aWorkbook, $aFileName) ;打開EXCEL表
 楼主| 发表于 2016-4-18 14:28:14 | 显示全部楼层
回复 5# kk_lee69

KK  你看看这个呢,上次你帮我的代码。
$oExcel = _ExcelBookOpen($FileName,0,True) ;打開EXCEL表

;$INFNAME=StringTrimRight($FILEarray1[$f],4)

;$INFNAME2=$BillName1

               

        With $oExcel.ActiveSheet;worksheets("")

                $ProdArray=.range("a1").currentregion.value

                ;$arrt=$oExcel.application.intersect(.range("a1").currentregion,.range("a1").currentregion.offset(1)).value ;第一行不讀取

                       

                ;下面這段為 尋找跟替換 ;檢查 讀取到的檔案是否 有 不應該出現的字

                        For $n=0 To UBound($ProdArray)-1

                                For $i=0 To UBound($ProdArray,2)-1

                                        $ProdArray[$n][$i]=StringReplace($ProdArray[$n][$i],"'","")

                                Next

                        Next

                       

                $ProdArray=.application.transpose($ProdArray) ;行列互換

                ;.parent.close(false) ;讀取完畢後 把頁面關掉的

        EndWith

 

_ArrayDisplay($ProdArray)

 

 

_ExcelBookClose($oExcel, 0, 0)

$oExcel=0
发表于 2016-4-18 14:29:38 | 显示全部楼层
回复 6# heroxianf

你看一下第一行  是不是  $oExcel =.....

而你自己的那個位置 有 某某某=......嗎??
发表于 2016-4-18 14:30:31 | 显示全部楼层
回复 6# heroxianf

你看一下第一行  是不是  $oExcel =.....

而你自己的那個位置 有 某某某=......嗎??
   
把你的第八行改成

$aWorkbook=_Excel_BookOpen($aWorkbook, $aFileName)
 楼主| 发表于 2016-4-18 14:40:37 | 显示全部楼层
回复 8# kk_lee69

#include <Excel_new.au3>
#include <array.au3>

Local $oExcel

$oExcel = _Excel_BookOpen($oExcel, "1.xls", 1, 0) ;打開EXCEL表
;$INFNAME=StringTrimRight($FILEarray1[$f],4)
;$INFNAME2=$BillName1

        With $oExcel.ActiveSheet;worksheets("")
                $ProdArray=.range("a1").currentregion.value
                ;$arrt=$oExcel.application.intersect(.range("a1").currentregion,.range("a1").currentregion.offset(1)).value ;第一行不讀取

                ;下面這段為 尋找跟替換 ;檢查 讀取到的檔案是否 有 不應該出現的字
                        For $n=0 To UBound($ProdArray)-1
                                For $i=0 To UBound($ProdArray,2)-1
                                        $ProdArray[$n][$i]=StringReplace($ProdArray[$n][$i],"'","")
                                Next
                        Next

                $ProdArray=.application.transpose($ProdArray) ;行列互換
                ;.parent.close(false) ;讀取完畢後 把頁面關掉的
        EndWith

_ArrayDisplay($ProdArray)


_Excel_BookClose($oExcel)

错误截图



这样还是不行呢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2016-4-18 15:02:14 | 显示全部楼层
回复 8# kk_lee69


    谢谢搞定了,    要使用新的UDF格式 先open一个对象
#include <Excel_new.au3>
#include <array.au3>

Local $otest = "1.xls"
Local $oExcel = _Excel_Open()

$otest = _Excel_BookOpen($oExcel, $otest) ;打開EXCEL表
;$INFNAME=StringTrimRight($FILEarray1[$f],4)
;$INFNAME2=$BillName1

        With $otest.ActiveSheet;worksheets("")
                $ProdArray=.range("a1").currentregion.value
                ;$arrt=$oExcel.application.intersect(.range("a1").currentregion,.range("a1").currentregion.offset(1)).value ;第一行不讀取

                ;下面這段為 尋找跟替換 ;檢查 讀取到的檔案是否 有 不應該出現的字
                        For $n=0 To UBound($ProdArray)-1
                                For $i=0 To UBound($ProdArray,2)-1
                                        $ProdArray[$n][$i]=StringReplace($ProdArray[$n][$i],"'","")
                                Next
                        Next

                $ProdArray=.application.transpose($ProdArray) ;行列互換
                ;.parent.close(false) ;讀取完畢後 把頁面關掉的
        EndWith

_ArrayDisplay($ProdArray)


_Excel_BookClose($oExcel)
发表于 2016-4-18 15:02:58 | 显示全部楼层
本帖最后由 kk_lee69 于 2016-4-18 15:04 编辑

回复 9# heroxianf


    Local $oAppl = _Excel_Open()
Local $sWorkbook =  "C:\1.xlsx"
Local $oExcel = _Excel_BookOpen($oAppl, $sWorkbook, Default, Default, True)

        With $oExcel.ActiveSheet;worksheets("")
                $ProdArray=.range("a1").currentregion.value
                ;$arrt=$oExcel.application.intersect(.range("a1").currentregion,.range("a1").currentregion.offset(1)).value ;第一行不讀取

                ;下面這段為 尋找跟替換 ;檢查 讀取到的檔案是否 有 不應該出現的字
                        For $n=0 To UBound($ProdArray)-1
                                For $i=0 To UBound($ProdArray,2)-1
                                        $ProdArray[$n][$i]=StringReplace($ProdArray[$n][$i],"'","")
                                Next
                        Next

                $ProdArray=.application.transpose($ProdArray) ;行列互換
                ;.parent.close(false) ;讀取完畢後 把頁面關掉的
        EndWith

_ArrayDisplay($ProdArray)


_Excel_BookClose($oExcel)
发表于 2016-4-18 15:04:14 | 显示全部楼层
回复 10# heroxianf

仔細看說明檔的範例

新的UDF 用法是
#include <Excel.au3>
#include <MsgBoxConstants.au3>

; 创建应用对象
Local $oAppl = _Excel_Open()
If @error Then Exit MsgBox(16, "Excel UDF: _Excel_BookOpen 示例", "创建 Excel 应用对象发生错误." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

; *****************************************************************************
; 打开现有工作簿并返回其对象标识符.
; *****************************************************************************
Local $sWorkbook = @ScriptDir & "\Extras\_Excel1.xls"
Local $oWorkbook = _Excel_BookOpen($oAppl, $sWorkbook, Default, Default, True)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookOpen 示例 1", "打开工作簿发生错误 '" & $sWorkbook & "'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookOpen 示例 1", "工作簿 '" & $sWorkbook & "' 已成功打开." & @CRLF & @CRLF & "[微软]创建日期: " & $oWorkbook.BuiltinDocumentProperties("Creation Date").Value)
 楼主| 发表于 2016-4-18 15:10:09 | 显示全部楼层
回复 12# kk_lee69


    嗯,最近在看  你发的一片VBA操作方法的帖子,再了解VBA直接操作,感觉那样速度 很快的样子。
发表于 2016-4-18 15:12:29 | 显示全部楼层
回复 13# heroxianf

跟  VBA 操作 EXCEL 速度快很多  你可以找找 kevinch 的文章 他是高手

我的資料很多都來自於他的手筆
 楼主| 发表于 2016-4-18 15:18:50 | 显示全部楼层
回复 14# kk_lee69


    好的 ,谢谢了哈~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-26 10:01 , Processed in 0.157146 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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