【问题标题】:For Loop Ignores True IF Condition When ELSE Is Present当 ELSE 存在时,For 循环忽略真 IF 条件
【发布时间】:2017-04-26 01:22:21
【问题描述】:

当循环体中存在ELSE 条件时,我似乎无法让我的 For 循环确认我有一个 True IF 条件。这是我写的:

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    'TEST FIND/SEARCH FEATURES
    Dim String2Find As String = txtCPUSerial.Text
    Dim ColumnNumber As Integer = 1

    'Access the worksheet
    Dim xlApp As Excel.Application
    xlApp = CreateObject("Excel.Application")
    xlApp = GetObject(, "Excel.Application")

    Dim xlWB As Excel.Workbook = xlApp.Workbooks.Open("C:\Users\Machine\Desktop\DocDirectory\MyDoc.xls") 

    Dim xWS As Excel.Worksheet

    xWS = xlWB.Worksheets("Sheet1")

    'TRY TO LOOP THROUGH THE ROWS..

     For x As Integer = 1 To xWS.Rows.Count Step 1

        'Check if cell value matches the search string...
        If xWS.Cells(x, ColumnNumber).value = String2Find Then
            MessageBox.Show("Got it..." & String2Find & " in row " & x)

        Else
            MessageBox.Show("Item not in the sheet...")

            Exit For
        End If
    Next

End Sub

我尝试在String2Find <> txtCPUSerial.TextElse 中写一个直接的语句,但要么语法错误,要么我仍然收到的消息对话框“项目不在工作表中.. .",因此我的 For 循环的 True 部分在单步执行时会被忽略,并且在获得 True 条件时不会返回对话框。

如果我删除我的Else,那么显然代码会相应地循环并返回文本,如果我的工作表中确实存在文本框值(我在工作表中写了一个任意值以查找。我不是什么包括或指定导致这种情况发生的原因?

【问题讨论】:

  • define syntax blows up 您正在将Object 与字符串进行比较,所以就是这样
  • 步过程序时,IF statementString2Find的值是多少?是否正确获取txtCPUSerial.Text
  • 想想你的代码第一次在For循环中做了什么。如果未找到该字符串,您将执行退出 For 循环 (Exit For) 的 If 语句的 Else 块。
  • @BranislavKollár 是的。有趣的是,提到布莱克伍德所说的,当代码第一次找到字符串时,它仍然忽略它,从而运行 Else 条件。如果条件为真,我尝试在 Else 之前放置一个 Exit For 来突破,但它仍然被忽略。
  • @Plutonix 我的意思是在尝试说出类似以下内容时语法不正确:Else 语句中的(txtCPUSerial.Text <> String2Find) 。我收到语法错误。

标签: excel vb.net if-statement for-loop


【解决方案1】:

如果代码的目的是查找所有出现并替换它们,我建议使用查找和替换方法

示例代码,经过测试和工作:

Sub FindAndReplace()
    Dim FoundCell As Range

    With Columns("A:A")
        Set FoundCell = .Find(What:="old", After:=.Cells(1), _
        LookIn:=-4163, LookAt:=1, SearchOrder:=1, SearchDirection:=1, MatchCase:=True, MatchByte:=False, SearchFormat:=False)

        If FoundCell Is Nothing Then
            MsgBox ("Item not in the sheet...")
            Exit Sub
        Else
            .Replace What:="old", Replacement:="new", LookAt:=1, _
                SearchOrder:=1, MatchCase:=True, SearchFormat:=False, _
                ReplaceFormat:=False
        End If
    End With
End Sub

它的作用:

  1. find 方法返回找到的单元格的Range objectNothing 以防它没有找到任何东西。将结果存储在 FoundCell 变量中。
  2. 它检查FoundCell 变量是否为Nothing
  3. 如果没有,则显示消息并退出子。
  4. 如果不是什么都没有(意味着它找到了匹配项),它使用替换方法将所有“旧”值更改为“新”值。

【讨论】:

  • 这看起来不错,但 VB.Net 无法识别:我在 xlWhole, xlValues, xlNext 等处遇到代码错误。几乎所有 xl 项目。
  • 嗨。这些是excel枚举。我已将它们替换为整数等价物。您可以在 MSDN 上找到有关 Find Method 的更多信息:msdn.microsoft.com/en-us/library/office/ff839746.aspx
【解决方案2】:

向您展示如何找到它的示例似乎比解释代码中的所有问题更容易:

Dim xlApp = New Excel.Application  ' this starts new Excel Application
Dim xlWB = xlApp.Workbooks.Open("C:\Users\Machine\Desktop\DocDirectory\MyDoc.xls") 
Dim xlWS = xlWB.Worksheets("Sheet1") 
Dim xlColA = xlWS.Range("A:A")       ' Column A
Dim xlCell = xlColA.Find(txtCPUSerial.Text) ' or .Find(txtCPUSerial.Text,,,XlLookAt.xlWhole)

If xlCell Is Nothing Then
    MsgBox(txtCPUSerial.Text & " not found")
Else 
    MsgBox(txtCPUSerial.Text & " found on row " & xlCell.Row)
End If

' don't forget to close the Workbook and Excel Application
xlWB.Close() 
xlApp.Quit()

How to: Programmatically Search for Text in Worksheet Ranges

【讨论】:

  • 这似乎运作良好,允许重新排列,但是当我尝试将它与Replace 一起使用时,我被 Excel 挂断,告诉我它找不到任何可以替换的东西。然而,我正在通过textbox 搜索的项目出现了。我已经有了xlwB.Save(), xlWB.Close(), xlApp.Quit(),然后是一些发布声明。有什么东西还在锁着我的床单,就像它现在受到保护一样。
  • Range.Find 和 Range.Replace 具有搜索整个单元格或部分的参数,因此您可以尝试使用该参数或 .Replace("*" & txtCPUSerial.Text & "*") 等通配符。通常使用 Excel 中的 Record Macro 来生成代码会更容易,然后您可以通过一些小调整来使用它。
  • 所以看看你的例子和其他一些例子,我能够做一些事情。但是,我注意到 Excel 查找功能中的“匹配整个单元格内容”选项没有等效项。 MatchCase:= 似乎可用,当尝试使用 MatchEntireCellContents:= 之类的东西时,它返回了一个错误。有没有办法在...中添加这个?还是我会编写专门禁止返回文本框中值的substring 的逻辑?
  • 这是Lookat:=XlLookAt.xlWhole
  • 我已经有了这个,事实上,像这样使用它:LookAt:=Excel.XlLookAt.XlWhole。我仍然能够检索给定字符串的一部分。如果你尝试一个值,你会明白我的意思。即使在 Excel 中,也有匹配整个单元格内容复选框。我不相信有 VB.Net 在没有严格声明不带回子字符串的情况下实现这一目标的方法。
猜你喜欢
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多