gto250 发表于 2011-5-25 21:19:46

关于EXCEL VBA在au3中使用的问题【已解决】

本帖最后由 gto250 于 2011-5-27 22:32 编辑

excel vba中的find在au3中该如何使用?Sub Macro1()

Dim RNG As Range
Dim FirstAddress As String
Dim FindAddress As String

With Sheet1
    Set RNG = .Range("A1:w66").Find(what:=5, after:=.Range("A1"), LookIn:=xlValues, lookat:=xlWhole)
    If Not (RNG Is Nothing) Then
      FirstAddress = RNG.Address
      
      Do
            FindAddress = FindAddress & RNG.Address & vbCrLf
            Set RNG = .Range("A1:w66").FindNext(RNG)
      Loop Until RNG.Address = FirstAddress
    End If
    MsgBox "查找结果是:" & vbCrLf & FindAddress
End With
End Sub上面是使用的find的例子

我用au3改了个相视的,不过查找的是颜色格式的单元格
#include <Excel.au3>
Dim $FirstAddress,$FindAddress
$myex = ObjGet("","excel.Application")
$myex.findformat.Interior.ColorIndex = 6



With $myex.activesheet
    $RNG = .Range("A1:w66").Find("", .ActiveCell, $xlValue, $xlPart, $xlByRows, $xlNext, False,False,True)
    If $RNG="" Then
      $FirstAddress = $RNG.Address
      
      Do
            $FindAddress = $FindAddress & $RNG.Address & @CrLf
            $RNG = .Range("A1:w66").FindNext($RNG)
      Until $RNG.Address = $FirstAddress
    EndIf
    MsgBox(0,"", "查找结果是:" &$FindAddress)
EndWith

卡在这句上有错误,不知道是什么错误,该怎么改?

kevinch 发表于 2011-5-25 21:55:21

个人经验,用值代替常量

gto250 发表于 2011-5-25 22:48:35

回复 2# kevinch


不明白

kevinch 发表于 2011-5-26 07:06:48

在vba编辑器的立即窗口输入,如:
?xlValue
回车后会得到一个值,有这个值代替xlValue应用到语句中应该是可以的,就像有些语句用=true报错,但用=1就可以执行一样。

gto250 发表于 2011-5-26 07:26:15

用了值一样不行

kevinch 发表于 2011-5-26 09:43:02

有时间我试下

kevinch 发表于 2011-5-26 10:43:45

#include <array.au3>

Dim $a_Arr
$o_Workbook=ObjGet(@ScriptDir&"\test.xls")
With $o_Workbook.worksheets(1)
        if .parent.parent.worksheetfunction.countif(.cells,"123")>0 Then
                $Rng=.cells.find("123",Default,Default,1)
                $RngStart=$Rng
                $a_Arr=$Rng.address(0,0)
                do
                        $Rng=.cells.findnext($Rng)
                        if $Rng.address<>$RngStart.address then
                                ReDim $a_Arr
                                $a_Arr=$Rng.address(0,0)
                        EndIf
                Until $Rng.address=$RngStart.address
        EndIf
        .parent.close(false)
EndWith
_ArrayDisplay($a_Arr)测试代码,具体见附件内容。

gto250 发表于 2011-5-26 19:44:17

回复 7# kevinch

谢谢,不过直接查找数值的代码我会写,也成功了,就如我上面的代码,我要查找的是格式,和单元格的数值无关。
如下图,有三个颜色为黄色的单元格,用格式查找能找到,在find函数中,有个searchformat的是控制格式的,我要的那个,我主题中发的代码就是我仿造vba中的代码写的,但是就是参数上总出问题!

kevinch 发表于 2011-5-27 10:00:30

#include <array.au3>

Dim $a_Arr
$o_Workbook=ObjGet(@ScriptDir&"\test.xls")
With $o_Workbook.worksheets(1)
        For $Rng in .usedrange
                If $Rng.interior.color=65535 Then
                        if $a_Arr<>"" then ReDim $a_Arr
                        $a_Arr=$Rng.address(0,0)
                EndIf
        Next
        .parent.close(false)
EndWith
_ArrayDisplay($a_Arr)这段可以实现

kevinch 发表于 2011-5-27 10:51:21

本帖最后由 kevinch 于 2011-5-27 10:56 编辑

#include <array.au3>

Dim $a_Arr
$o_Excel=ObjCreate("excel.application")
$o_Excel.visible=False
$o_Workbook=$o_Excel.workbooks.open(@ScriptDir&"\test.xls")
With $o_Workbook.worksheets(1)
        .parent.parent.findformat.clear
        .parent.parent.findformat.interior.color=65535
        $Rng=.usedrange.find("",Default,Default,Default,Default,Default,Default,Default,True)
        if IsObj($Rng) then
                $RngStart=$Rng
                $a_Arr=$Rng.address(0,0)
                do
                        $Rng=.usedrange.find("",$Rng,Default,Default,Default,Default,Default,Default,True)
                        if $Rng.address<>$RngStart.address then
                                        ReDim $a_Arr
                                        $a_Arr=$Rng.address(0,0)
                        EndIf
                Until $Rng.address=$RngStart.address
        EndIf
        .parent.close(false)
EndWith
$o_Excel.quit
_ArrayDisplay($a_Arr)findformat也实现了,因为要使用application对象,所以创建一个excel进程比较保险,否则容易出错。

gto250 发表于 2011-5-27 20:14:25

findformat也实现了,因为要使用application对象,所以创建一个excel进程比较保险,否则容易出错。
kevinch 发表于 2011-5-27 10:51 http://www.autoitx.com/images/common/back.gif

.parent.parent.findformat.interior.color=65535
为什么要用parent,而且还要用两个?

kevinch 发表于 2011-5-27 20:42:15

在vba中可以直接使用application对象,但是在封装语言里就要使用创建的excel对象,本例中是$o_Excel,但是因为在With $o_Workbook.worksheets(1)语句中引用,可以有两种方式:
1. 直接引用 $o_Excel对象,可以写成: $o_Excel.findformat.interior.color=65535 这种形式;
2. 从当前with对象处通过parent语句向上回溯到excel对象处,第一个parent回溯到了父对象$o_Workbook这一层,所以还要再回溯一层才能到达$o_Excel对象这一层,于是就出现了两个parent的用法。

不知道这样说你明白了没有?

gto250 发表于 2011-5-27 22:31:46

明白了!!

sutj333 发表于 2011-6-2 23:15:29

回复 12# kevinch


    受教了!最近在这个问题上碰了好多次壁!关于_excelbooknew()与_excelbookattatch()的返回值问题

hpdeskjet 发表于 2011-7-20 12:58:19

学习了!!谢谢!!
页: [1] 2
查看完整版本: 关于EXCEL VBA在au3中使用的问题【已解决】