Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA检查工作表中的行是否包含多个变量_Vba_Excel - Fatal编程技术网

VBA检查工作表中的行是否包含多个变量

VBA检查工作表中的行是否包含多个变量,vba,excel,Vba,Excel,我在一张工作表中循环查找与某些变量匹配的行时遇到问题 我每行有8列,我想找到一行,其中包含6个变量,一个空单元格和一个值为0的单元格。像这样: - | A | B | C | D | E | F | G | H | i | x1 | | x2 | 0 | x3 | x4 | x5 | x6 | 你可以试试这样的。我把一切都留给了你,除了几个例外 lastcol = 8 Dim vars ReDim vars(1 To lastcol) 'Set vars() to

我在一张工作表中循环查找与某些变量匹配的行时遇到问题

我每行有8列,我想找到一行,其中包含6个变量,一个空单元格和一个值为0的单元格。像这样:

- | A | B | C | D | E | F | G | H | i | x1 | | x2 | 0 | x3 | x4 | x5 | x6 |
你可以试试这样的。我把一切都留给了你,除了几个例外

lastcol = 8

Dim vars

ReDim vars(1 To lastcol)

'Set vars() to the values you're looking for in the columns.

    LastRow = ThisWorkbook.Sheets("Boekingen AMS-IAD").Range("A" & Rows.Count).End(xlUp).Row

    For i = 1 To LastRow
        accept = ""
        met = 0
        For j = 1 To lastcol
            With ThisWorkbook.Sheets("Boekingen AMS-IAD").Cells(i, j)
            If .Value = vars(j) Then
                met = met + 1
            End If
            End With
        Next j
        If met = lastcol Then accept = "nvt"
        'At this point you have to do something with the row you just
        ' found--maybe leave the loop and do something, or do something
        ' before going to the next row.
    Next i

我在一个新的excel文件夹中制作了这个快速的小测试子,将
Sheet1
重命名为您的工作表的名称,它工作得非常出色:

Sub testing()
    Dim ws As Worksheet
    Dim rng As Range

    Set ws = ThisWorkbook.Sheets("Boekingen AMS-IAD")
    LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    For i = 1 To LastRow
        If ws.Cells(i, 1).Value = x1 And _
        ws.Cells(i, 2).Value = "" And _
        ws.Cells(i, 3).Value = x2 And _
        ws.Cells(i, 4).Value = "0" And _
        ws.Cells(i, 5).Value = x3 And _
        ws.Cells(i, 6).Value = x4 And _
        ws.Cells(i, 7).Value = x5 And _
        ws.Cells(i, 8).Value = x6 Then
            'MsgBox "nvt at row " & i
            Accept = "nvt"
        End If
    Next i


End Sub
这应该在变量后面的行中显示“nvt:)

PS-任何想要测试此代码的人,只需在
Dim rng as Range
下添加以下内容:

    Dim x1 As Integer
    Dim x2 As Integer
    Dim x3 As Integer
    Dim x4 As Integer
    Dim x5 As Integer
    Dim x6 As Integer

    x1 = 1
    x2 = 1
    x3 = 1
    x4 = 1
    x5 = 1
    x6 = 1

我解决了这个问题,问题不在于在工作表中循环,而在于变量的值。当我从Excel表格中读取日期时,日期从D-M-Y更改为M-D-Y。但是我修正了这个问题,对于那些对答案感兴趣的人来说:

他们必须按照这个顺序吗,或者你想检查一行是否以任何顺序包含他们所有人吗?它是如何工作的?你有错误吗?仅供参考,您应该始终限定范围,因此将行更改为:
LastRow=thiswook.Sheets(“Boekingen AMS-IAD”).Range(“A”和thiswook.Sheets(“Boekingen AMS-IAD”).Rows.Count)。End(xlUp)。Row
GSerg是,它们必须按该顺序排列。我没有得到一个错误,它只是没有为Accept提供输出“nvt”,而它应该这样做。特别是现在,我只有8个条件中的1个,其中我确定有超过1行包含变量x1的值。您如何知道它没有给出输出,以及什么是
Accept
?因为我正在Excel工作表中“打印”输出。Accept是一个变量,它将以“Yes”、“No”或“nvt”作为值。我在这里列出的代码是许多“Else If”代码之一。如何将vars()设置为所需的值?这些值是(x1,”,x2,“0”,x3,x4,x5,x6),第二个值应该是一个空单元格。如果x1等是实际的VBA变量,您可以只分配它们,如
vars(1)=x1
vars(2)=“”
vars(4)=0
下面的代码是通用的——它将处理您想要的任何数量的检查,但在某些时候您必须手动初始化值或使用外部值源。它为我提供空值(“”),以供立即接受。所以,直到“accept=”“”开始工作,但循环似乎仍然不起作用。我还没有在“If met=lastcol Then accept=“nvt”之后添加任何内容。你认为这就是问题所在吗?如果是这样的话,我应该试着把什么放在那里?很抱歉离线这么久。我不知道你剩下的代码是什么样子的,所以我不知道你真正想做什么。我的直觉告诉你,你必须把你的代码,以处理“nvt”的情况下,我的意见是。否则,它将继续检查下一行,而不对当前行执行任何操作。类似于
如果accept=“nvt”那么msgbox“在第行找到一个”&i
这给了我一个错误,即“对于ws.Range中的每个rng(“A1:A”&lastRow)”。执行时出现错误1004:对象\工作表的方法范围失败。由于我的Excel不是英文的,所以错误的表述可能略有不同。@Stan谢谢你的提醒!我已经更新了我的答案,像你一样使用
.Cells
,希望这会有所帮助:)现在没有错误,但“nvt”仍然没有结果。我觉得这个循环是可行的,但值可能有问题?当我将LastCol设置为1并且只写下“If ws.Cells(I,1).Value=x1”时,它仍然找不到任何内容,而在它们的第一列中有超过1行包含x1的值。如果我将“If ws.Cells(I,1).Value=x1”更改为“If ws.Cells(I,1).Value=“4-sep-16”,它仍然找不到任何内容。(“2016年9月4日”是x1的值)@Stan感谢您提供更多信息。您是否尝试过将
Accept=“nvm”
更改为类似于
Msgbox“在此处找到的”
?问题可能在于您打印的接受语句,您是否可以编辑您的问题以显示它是如何打印到工作表的?在代码的这一部分之后,Accept是否在其他地方被更改?是的,我在Accept=“nvm”行下放置了一个Msgbox,但它也不会显示Msgbox。该程序存在多个If和Else If,其中Accept=“Yes”工作正常,并按其应有的方式打印“Yes”。带“nvm”的Else If就是我在这里发布的。在这一次之后,我只有一个Else,它给出Accept=“No”,并完美地打印出来。所以印刷效果很好。
    Dim x1 As Integer
    Dim x2 As Integer
    Dim x3 As Integer
    Dim x4 As Integer
    Dim x5 As Integer
    Dim x6 As Integer

    x1 = 1
    x2 = 1
    x3 = 1
    x4 = 1
    x5 = 1
    x6 = 1