使用VB.NET使用VBA代码将特定单元格的值写入工作簿



我在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

最新更新