2
Sub search       
Set objExl = CreateObject("Excel.Application")
Set objWb = objExl.Workbooks
objWb.Open("C:\Documents and Settings\user\Desktop\book.xls")
Set strbol = objWb("C:\Documents and Settings\user\Desktop\book.xls").Sheets(1).Cells.Find(document.getElementById("q").Value, Range("A1"), xlValues, xlPart, xlByRows, xlNext, False, False)
Set objDiv = document.getElementById("content")
objDiv.innerText = "Result: " & objWb.Sheets(1).Cells(strbol.Row,strbol.Column).Offset(0,-4).Value      
objWb("C:\Documents and Settings\user\Desktop\book.xls").Close
Set objWb = Nothing
Set objExl  = Nothing
End Sub

以上是 HTA 代码,它从 HTA 文本框中获取查询词,在 excel 中找到该词,并在名为 div 的内容中返回/显示结果偏移行值。我可以成功运行脚本,直到打开 excel 文件。但是脚本在以下行给出错误: Set strbol 。. . 错误消息:下标超出范围。

我在 excel vba 中测试了 find 方法,它可以正常工作,但不能在 HTA 注意:从 IE6 发布,所以请原谅缩进和格式错误。

4

1 回答 1

2

您必须完全限定该范围。

我也换成xlValues, xlPart, xlByRows, xlNext了他们的价值观。我不确定hta在 VBS 中是否可以在代码顶部定义一个常量

试试这个(未经测试,因为我从未在 hta 工作过)。

Sub search()
    Set objExl = CreateObject("Excel.Application")
    Set objWb = objExl.Workbooks.Open("C:\Documents and Settings\user\Desktop\book.xls")
    Set strbol = objWb.Sheets(1).Cells.Find(document.getElementById("q").Value, objWb.Sheets(1).Range("A1"), -4163, 2, 1, 1, False, False)
    Set objDiv = document.getElementById("content")
    objDiv.innerText = "Result: " & objWb.Sheets(1).Cells(strbol.Row, strbol.Column).Offset(0, -4).Value
    objWb.Close
    Set objWb = Nothing
    Set objExl = Nothing
End Sub

额外说明

由于您使用的是.Find,因此您还需要捕获代码以查看是否确实找到了匹配项,否则objDiv.innerText = "Result: " & objWb.Sheets(1).Cells(strbol.Row, strbol.Column).Offset(0, -4).Value将失败。

就像是

If Not strbol Is Nothing Then
    objDiv.innerText = "Result: " & _
                       objWb.Sheets(1).Cells(strbol.Row, strbol.Column).Offset(0, -4).Value
End If

跟进(来自下面的评论)

在 VBS 中测试的代码。我创建一个文件C:\Sample.xlsx并在 Cell 中键入“Sid” N95,然后运行具有以下代码的 VBS 文件。它没有错误地工作,并向我显示了一个消息框$N$95

Dim objExl, objWb, strbol

Set objExl = CreateObject("Excel.Application")
Set objWb = objExl.Workbooks.Open("C:\Sample.xls")
Set strbol = objWb.Sheets(1).Cells.Find("Sid", objWb.Sheets(1).Range("A1"), _
             -4163, 2, 1, 1, False, False)

msgbox strbol.address

objWb.Close
Set objWb = Nothing
Set objExl = Nothing
于 2013-04-16T16:52:50.477 回答