关于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
卡在这句上有错误,不知道是什么错误,该怎么改? 个人经验,用值代替常量 回复 2# kevinch
不明白 在vba编辑器的立即窗口输入,如:
?xlValue
回车后会得到一个值,有这个值代替xlValue应用到语句中应该是可以的,就像有些语句用=true报错,但用=1就可以执行一样。 用了值一样不行 有时间我试下 #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)测试代码,具体见附件内容。 回复 7# kevinch
谢谢,不过直接查找数值的代码我会写,也成功了,就如我上面的代码,我要查找的是格式,和单元格的数值无关。
如下图,有三个颜色为黄色的单元格,用格式查找能找到,在find函数中,有个searchformat的是控制格式的,我要的那个,我主题中发的代码就是我仿造vba中的代码写的,但是就是参数上总出问题!
#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: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进程比较保险,否则容易出错。 findformat也实现了,因为要使用application对象,所以创建一个excel进程比较保险,否则容易出错。
kevinch 发表于 2011-5-27 10:51 http://www.autoitx.com/images/common/back.gif
.parent.parent.findformat.interior.color=65535
为什么要用parent,而且还要用两个? 在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的用法。
不知道这样说你明白了没有? 明白了!! 回复 12# kevinch
受教了!最近在这个问题上碰了好多次壁!关于_excelbooknew()与_excelbookattatch()的返回值问题 学习了!!谢谢!!
页:
[1]
2