【问题标题】:VB.NET get specific cell value from excelVB.NET 从 excel 中获取特定的单元格值
【发布时间】:2021-10-29 19:16:23
【问题描述】:

我正在尝试评估 Excel 表中的特定单元格值是否为“”以在我的 VB.NET 应用程序的 if 语句中使用。我修改了用于写入 excel 的代码,但无法获取单元格值。我的代码:

   Sub Excel_LoadProjectsSchedule()

        xlApp = New Excel.Application
        xlWorkBook = xlApp.Workbooks.Open("G:\100 Databases\Projects Schedule.xlsx")
        xlApp.Visible = False
        xlWorkSheet = xlWorkBook.Worksheets("sheet1")
        Dim ProjectFinished  as boolean

        'Set variables
        Result = xlWorkSheet.Cells.Find(ProjectNumber, LookAt:=Excel.XlLookAt.xlWhole)

        If xlWorkSheet.Cells(Result.Row, 3).value = "" Then
            ProjectFinished = False
        Else
            ProjectFinished = True
        End If

        'Save and close
        xlApp.DisplayAlerts = False
        xlWorkBook.Close(SaveChanges:=True)
        xlApp.Quit()

    End Sub

错误开启

If xlWorkSheet.Cells(Result.Row, 3).value = "" Then

它说“System.MissingMemberException: 'Public member 'value' on type 'Range' not found.' "

我有

Public xlApp As Excel.Application = Nothing
Public xlWorkBook As Excel.Workbook = Nothing
Public xlWorkSheet As Excel.Worksheet = Nothing

在这个模块的子之外。

我做错了什么,有人可以帮我解决这个问题吗?

【问题讨论】:

  • 我不知道 VB.Net,但我的第一个猜测是找不到该项目。你检查过吗?
  • 这就是错误所说的

标签: excel vb.net


【解决方案1】:

我做了一些转换,以便编译器可以识别类型。

Sub Excel_LoadProjectsSchedule(ProjectNumber As Integer)

    Dim xlApp = New Excel.Application
    Dim xlWorkBook = xlApp.Workbooks.Open("G:\100 Databases\Projects Schedule.xlsx")
    xlApp.Visible = False
    Dim xlWorkSheet = DirectCast(xlWorkBook.Worksheets("sheet1"), Excel.Worksheet)
    Dim ProjectFinished As Boolean

    'Set variables
    Dim Result = xlWorkSheet.Cells.Find(ProjectNumber, LookAt:=Excel.XlLookAt.xlWhole)
    Dim row = Result.Row
    Dim cell = DirectCast(xlWorkSheet.Cells(row, 3), Excel.Range)
    If cell.Value Is Nothing Then
        'What do you want to do?
    Else
        If cell.Value.ToString = "" Then
            ProjectFinished = False
        Else
            ProjectFinished = True
        End If
    End If

    'Save and close
    xlApp.DisplayAlerts = False
    xlWorkBook.Close(SaveChanges:=True)
    xlApp.Quit()

End Sub

【讨论】:

  • 嘿,谢谢这个工作,虽然不知道它是如何工作的,但仍然!
  • @Eduards 这只是编译器将xlWorkSheetcell 视为对象。 Object 没有 Cells 属性或 Value 属性。我们可以使用DirectCast,它会跳过一些检查(更快一点),因为我们确定对象到底是什么。使用 Option Strict On 会出现此类问题。
  • Cells(row, 3) 指的是 C 列。这是您要定位的列吗?
  • 如果单元格为空,则ValueNothing,而不是""。您不能在Nothing 上致电ToString。您收到的确切错误消息是什么?
  • 啊,好吧,我明白了,所以实际执行此操作的代码如下: ```` If DirectCast(xlWorkSheet.Cells(Result.Row, 3), Excel.Range).Value Is Nothing Then ProjectFinished = False Else ProjectFinished = True End If ````
【解决方案2】:

我认为,如果您特别想使用该项目编号检查该行的第 3 列中的内容,那么您离解决方案不远了。 我只在 VBA 内部对其进行了测试,但大致如下:

Sub Excel_LoadProjectsSchedule()
    Dim xlWorksheet As Worksheet, Result As Range, ProjectFinished  As Boolean
    xlApp = New Excel.Application
    xlWorkBook = xlApp.Workbooks.Open("G:\100 Databases\Projects Schedule.xlsx")
    xlApp.Visible = False
    Set xlWorkSheet = xlWorkBook.Worksheets("sheet1")
    
    'Set variables
     Set Result = xlWorksheet.Cells.Find(Projectnumber, LookIn:=Excel.XlLookin.xlValues, LookAt:=Excel.XlLookAt.xlWhole)
     if not Result is nothing then
     If Cells(Result.Row, 3).Value = "" Then
         ProjectFinished = False
     Else
         ProjectFinished = True
     End If
 End Sub

问题在于,“结果”尚未分配给范围,因此您的代码无法访问行属性。

【讨论】:

  • 同样的结果。首先,“XlLookin”不存在,所以我使用了“XlFindLookIn”,结果还是一样——同样的错误
  • 错误发生在If Cells(Result.Row, 3).Value ,对吧? Result 在.Find 行之后返回什么?
  • 是的,它返回的内容与我用来写入同一特定单元格的代码中的内容相同。这段代码正好相反。结果是一行代码缩短为一个单词,您可以在代码中看到
  • 是的,我知道 Result 只是变量...但是在分配之后该变量的值是多少?如果在分配之后它什么都没有,那么难怪你会收到错误
  • 在出现错误时,“结果”与运行我的代码时发现“ProjectNumber”并将值写入 excel 而不是应该在此处获取价值。我很确定它与结果无关,但与“值”或“文本”等有关,因为它们都返回相同的错误。在我的编写代码中,两者都没有使用(“.Value”,“.Text”)并且它在那里工作,但是在这里它没有......给出各种错误
【解决方案3】:

如果在某行中查找某个单元格。

 Dim AppExcel As Object
    Dim workBook As Object
    AppExcel = CreateObject("Excel.Application")

    workBook = AppExcel.Workbooks.Open("C:\SO\SO.xlsx")
    AppExcel.Visible = False

    Worksheets = workBook.worksheets
    If Worksheets("Blad1").Cells(2, 3).text = "" Then

        MessageBox.Show("Empty")

    Else
        MessageBox.Show("Text")
    End If

然后是关闭部分

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2012-12-29
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多