Vb.net 使用>;运算符比较excel范围中的值引发异常。未为范围定义运算符

Vb.net 使用>;运算符比较excel范围中的值引发异常。未为范围定义运算符,vb.net,Vb.net,我更新了我的帖子和程序,解决了所有操作员的错误。该过程现在的效果是预期的一半,而不是将值放在列E中,而是将它们放在列J中。如果我从列E更改为列B,那么它将值放在G中。因此问题是,不知何故,我的值从我需要的列移到了右边的6列 这是我的全部代码 Dim xlWB As Excel.Workbook = CType(Globals.ThisWorkbook.Application.ActiveWorkbook, Excel.Workbook) Dim xlWSPosition As Excel.W

我更新了我的帖子和程序,解决了所有操作员的错误。该过程现在的效果是预期的一半,而不是将值放在列E中,而是将它们放在列J中。如果我从列E更改为列B,那么它将值放在G中。因此问题是,不知何故,我的值从我需要的列移到了右边的6列

这是我的全部代码

  Dim xlWB As Excel.Workbook = CType(Globals.ThisWorkbook.Application.ActiveWorkbook, Excel.Workbook)
Dim xlWSPosition As Excel.Worksheet = CType(CType(xlWB.Sheets("byPosition"), Excel.Worksheet), Excel.Worksheet)

                   With xlWSPosition

                .Application.ScreenUpdating = False

                '.Columns("E").Insert(Excel.XlDirection.xlDown)
                '.Range("E1").Value = "Exemption"
                '.Cells.EntireColumn.AutoFit()

                Dim colValue As Excel.Range
                Dim lngLr As Long
                lngLr = .Range("E" & .Rows.Count).End(Excel.XlDirection.xlUp).Row



                .Application.ScreenUpdating = True

                For Each colValue In .Range("F2:F" & .Range("F" & xlWSPosition.Rows.Count).End(XlDirection.xlUp).Row)

                    If colValue.Value > 0 Then

                        colValue.Cells.Range("E2:E" & lngLr).Value = "N"

                    Else

                        colValue.Cells.Range("E2:E" & lngLr).Value = "Y"


                    End If

                Next colValue

            End With
       End Sub
正如您在屏幕截图中所看到的,N值会转到第J列,而不是E列,而且在查找>0时,它似乎会再向下移动一行

应该是这样的:


您收到此错误消息是因为打算对
范围执行无效操作(检查其是否大于零)。您应该使用
属性,而不是整个
范围
。下面是对代码的更正,这将帮助您更好地理解:

For Each range In .Range("F2:F" & .Range("F" & xlWSPosition.Rows.Count).End(XlDirection.xlUp).Row)
   If(range IsNot Nothing AndAlso range.Value.Trim().Length > 0) Then
      Dim colValue As Double = DirectCast(range.Value, Double)
      If colValue > 0 Then
         .Cells(xlWSPosition.Rows, "E").Value = "N"
      Else
         .Cells(xlWSPosition.Rows, "E").Value = "Y"
      End If
   End If
Next

请注意,我假设给定单元格中的值为类型
Double
;请将此位(colValue的类型和DirectCast中的类型)调整为您期望的类型。

您收到此错误消息,因为您打算在
范围内执行无效操作(检查其是否大于零)。您应该使用
属性,而不是整个
范围
。下面是对代码的更正,这将帮助您更好地理解:

For Each range In .Range("F2:F" & .Range("F" & xlWSPosition.Rows.Count).End(XlDirection.xlUp).Row)
   If(range IsNot Nothing AndAlso range.Value.Trim().Length > 0) Then
      Dim colValue As Double = DirectCast(range.Value, Double)
      If colValue > 0 Then
         .Cells(xlWSPosition.Rows, "E").Value = "N"
      Else
         .Cells(xlWSPosition.Rows, "E").Value = "Y"
      End If
   End If
Next


请注意,我假设给定单元格中的值为类型
Double
;请将此位(colValue的类型和DirectCast中的类型)调整为您期望的类型。

谢谢。这似乎解决了一个问题。但是现在我在.Cells(xlWSPosition.Rows,“E”).Value=“N”@JoseM上得到一个类型不匹配错误。我做了一个小的修改,使代码更安全(确保DirectCast行不会触发任何错误);但是您必须确保单元格中的信息是预期的。在任何情况下,在向单元格写入文本时出现类型不匹配听起来都很奇怪。希望现在一切都好;如果没有,我可能会帮你一点忙,但你必须一步一步地执行,并清楚地知道单元格中的确切信息。列E1有列名。从E2开始,列为空。我将尝试新的代码,看看会发生什么happens@JoseM. 我指的是单元格的格式。但这并不重要,因为文本无论如何都可以写成。如果它不起作用,请在循环上设置一个断点(在Dim colValue上),然后告诉我你看到了什么。我更新了代码,工作了一半。我在上面发布了一些屏幕截图,包括当前结果和预期结果。我不明白为什么我的结果会移到另一列,右边6列。谢谢。这似乎解决了一个问题。但是现在我在.Cells(xlWSPosition.Rows,“E”).Value=“N”@JoseM上得到一个类型不匹配错误。我做了一个小的修改,使代码更安全(确保DirectCast行不会触发任何错误);但是您必须确保单元格中的信息是预期的。在任何情况下,在向单元格写入文本时出现类型不匹配听起来都很奇怪。希望现在一切都好;如果没有,我可能会帮你一点忙,但你必须一步一步地执行,并清楚地知道单元格中的确切信息。列E1有列名。从E2开始,列为空。我将尝试新的代码,看看会发生什么happens@JoseM. 我指的是单元格的格式。但这并不重要,因为文本无论如何都可以写成。如果它不起作用,请在循环上设置一个断点(在Dim colValue上),然后告诉我你看到了什么。我更新了代码,工作了一半。我在上面发布了一些屏幕截图,包括当前结果和预期结果。我不明白为什么我的结果会移动到另一列右侧的6列。应该是
dim colvalue as Excel.Range
如果colvalue.value>0
您现在会出现此错误,因为VBA“很好”,因为它选择了
.value
,即使您没有明确告诉它(您实际上只是告诉它一个范围变量)。但是在.net中,您需要显式地写出所有内容,.net不会为您假设。@JasonBayldon实际上,这种行为并不值得骄傲。范围是一个不仅仅是值的完整实相。请记住,这是不同程序共享的现实(所有的办公设备,其中一些根据条件使用不同的属性名称表示价值)。正确定义有助于避免出现不清楚、容易出错的情况,并有助于构建全面的会计、可扩展的系统。假设往往狭义地定义情况,并可能生成错误的框架(不久前讨论了Val函数只接受“.”。@varocarbas谁说我为任何人的行为感到骄傲?一旦他了解范围对象的工作原理,他应该能够修改他的变量以适应正确的场景(你已经为他做了)我刚才解释了为什么他的错误现在发生,而不是在.net中,所以OP可能想考虑用VBA显式地编写代码,就像他必须在VBA中那样。NET@JasonBayldon我指的是VBA的行为(不管是否有书面价值).但是,如果您指出这一点只是为了强调所有内容都应该用VBA明确编写,那么我误解了您的意思(我认为您发现这个选项更好)。我们说的是同一件事。@varocabas啊,对。我从来都不明白为什么VBA是这样做的,对对象的属性进行编码比假设对象自动成为值更有意义。也许是这样设想的,所以你不需要理解