找回密码
 加入
搜索
查看: 10024|回复: 15

[系统综合] 关于EXCEL VBA在au3中使用的问题【已解决】

 火.. [复制链接]
发表于 2011-5-25 21:19:46 | 显示全部楼层 |阅读模式
本帖最后由 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


卡在这句上有错误,不知道是什么错误,该怎么改?
发表于 2011-5-25 21:55:21 | 显示全部楼层
个人经验,用值代替常量
 楼主| 发表于 2011-5-25 22:48:35 | 显示全部楼层
回复 2# kevinch


不明白
发表于 2011-5-26 07:06:48 | 显示全部楼层
在vba编辑器的立即窗口输入,如:
?xlValue
回车后会得到一个值,有这个值代替xlValue应用到语句中应该是可以的,就像有些语句用=true报错,但用=1就可以执行一样。
 楼主| 发表于 2011-5-26 07:26:15 | 显示全部楼层
用了值一样不行
发表于 2011-5-26 09:43:02 | 显示全部楼层
有时间我试下
发表于 2011-5-26 10:43:45 | 显示全部楼层
#include <array.au3>

Dim $a_Arr[1]
$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[0]=$Rng.address(0,0)
                do
                        $Rng=.cells.findnext($Rng)
                        if $Rng.address<>$RngStart.address then
                                ReDim $a_Arr[UBound($a_Arr)+1]
                                $a_Arr[UBound($a_Arr)-1]=$Rng.address(0,0)
                        EndIf
                Until $Rng.address=$RngStart.address
        EndIf
        .parent.close(false)
EndWith
_ArrayDisplay($a_Arr)
测试代码,具体见附件内容。

本帖子中包含更多资源

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

×
 楼主| 发表于 2011-5-26 19:44:17 | 显示全部楼层
回复 7# kevinch

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

本帖子中包含更多资源

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

×
发表于 2011-5-27 10:00:30 | 显示全部楼层
#include <array.au3>

Dim $a_Arr[1]
$o_Workbook=ObjGet(@ScriptDir&"\test.xls")
With $o_Workbook.worksheets(1)
        For $Rng in .usedrange
                If $Rng.interior.color=65535 Then
                        if $a_Arr[UBound($a_Arr)-1]<>"" then ReDim $a_Arr[UBound($a_Arr)+1]
                        $a_Arr[UBound($a_Arr)-1]=$Rng.address(0,0)
                EndIf
        Next
        .parent.close(false)
EndWith
_ArrayDisplay($a_Arr)
这段可以实现
发表于 2011-5-27 10:51:21 | 显示全部楼层
本帖最后由 kevinch 于 2011-5-27 10:56 编辑
#include <array.au3>

Dim $a_Arr[1]
$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[0]=$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[UBound($a_Arr)+1]
                                        $a_Arr[UBound($a_Arr)-1]=$Rng.address(0,0)
                        EndIf
                Until $Rng.address=$RngStart.address
        EndIf
        .parent.close(false)
EndWith
$o_Excel.quit
_ArrayDisplay($a_Arr)
findformat也实现了,因为要使用application对象,所以创建一个excel进程比较保险,否则容易出错。

评分

参与人数 1金钱 +100 贡献 +25 收起 理由
gto250 + 100 + 25 非常非常的感谢! 我自己一直都没有想出来 ...

查看全部评分

 楼主| 发表于 2011-5-27 20:14:25 | 显示全部楼层
findformat也实现了,因为要使用application对象,所以创建一个excel进程比较保险,否则容易出错。
kevinch 发表于 2011-5-27 10:51


.parent.parent.findformat.interior.color=65535
为什么要用parent,而且还要用两个?
发表于 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的用法。

不知道这样说你明白了没有?
 楼主| 发表于 2011-5-27 22:31:46 | 显示全部楼层
明白了!!
发表于 2011-6-2 23:15:29 | 显示全部楼层
回复 12# kevinch


    受教了!最近在这个问题上碰了好多次壁!关于_excelbooknew()与_excelbookattatch()的返回值问题
发表于 2011-7-20 12:58:19 | 显示全部楼层
学习了!!谢谢!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-11 14:28 , Processed in 0.089649 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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