我在Excel VBA中有一段代码,它在第2列中找到一个特定值,并将该值写入找到的行第3列:
ThisWorkbook.Worksheets("Sheet1").Cells(Cells.Find("ProjectNumber", lookat:=xlWhole).Row, 3).Value = "TEST"
我正试图从我的Visual Studio应用程序中运行该函数。
Imports Excel = Microsoft.Office.Interop.Excel
Module Automate_Excel
Public xlApp As Excel.Application = Nothing
Public xlWorkBook As Excel.Workbook = Nothing
Public xlWorkSheet As Excel.Worksheet = Nothing
Sub Excel_FinishProject()
xlApp = New Excel.Application
xlWorkBook = xlApp.Workbooks.Open("G:100 DatabasesProjects Schedule.xlsx")
xlApp.Visible = True
xlWorkSheet = xlWorkBook.Worksheets("sheet1")
'Write
xlWorksheet("Sheet1").Cells(Cells.Find("ProjectNumber", lookat:=xlWhole).Row, 3).Value = "TEST"
xlWorkBook.Close()
xlApp.Quit()
End Sub
End Module
它给了我类似的错误
xlwhole未声明为
和
单元格未声明为
我的理解是它应该来自Excel的类型库和代码,例如:
xlWorkSheet.Cells(2, 5) = "TEST"
它确实使用了";细胞";。
您需要完全限定每个枚举。在这种情况下,
Excel.XlLookAt.xlWhole
XlLookAt枚举(Excel)
在Excel/VBA环境中,它们只是一个基本的枚举。
代码中的Cells
也不是完全限定的。Cells.Find
需要一个工作表限定符。VB.NET不知道没有限定符的Cells
是什么。同样,在VBA环境中,您不必如此明确,但在VB.NET中,您可以这样做,因为没有";默认上下文";
您的xlWorkSheet
变量未编入索引。它已经包含了对xlWorkBook.Worksheets("Sheet1")
的单个引用,所以您不再指定它的名称。
此外,在使用Find
之前,您应该将其结果存储在Range
变量中,而不是试图在一行中完成所有操作。然后你可以检查一下它是否";没有发现任何东西";在你尝试使用结果之前,甚至可以在采取行动之前看到结果
xlWorkSheet = xlWorkBook.Worksheets("Sheet1")
Dim result as Excel.Range = xlWorkSheet.Cells.Find("ProjectNumber", lookat:=Excel.XlLookAt.xlWhole)
If result IsNot Nothing Then
' xlWorkSheet.Cells(result.Row, 3).Value = "TEST"
' OP says this works instead
xlWorkSheet.Cells(result.Row, 3) = "TEST"
End IF