Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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,我正在使用select case语句和函数来创建VBA中的故障,但我似乎不知道应该如何构造它。我希望它能做到以下几点: 检查行值1和10是否具有相同的唯一ID,如果没有:1和9;1号和8号,1号和7号,…,1号和2号 1a。如果行值1和10具有相同的唯一ID,则中间的所有行也具有相同的唯一ID 2a。尽管所有行都有相同的唯一ID,但这并不意味着我以后要检查的单元格都是相同的-例如:行1、3、4、7、8、10可能有空白单元格,而行2、5、9不是空白单元格。为了确定这一点,它必须通过从10到1的每一

我正在使用select case语句和函数来创建VBA中的故障,但我似乎不知道应该如何构造它。我希望它能做到以下几点:

检查行值1和10是否具有相同的唯一ID,如果没有:1和9;1号和8号,1号和7号,…,1号和2号

1a。如果行值1和10具有相同的唯一ID,则中间的所有行也具有相同的唯一ID

2a。尽管所有行都有相同的唯一ID,但这并不意味着我以后要检查的单元格都是相同的-例如:行1、3、4、7、8、10可能有空白单元格,而行2、5、9不是空白单元格。为了确定这一点,它必须通过从10到1的每一行来确定这一点。一行不影响另一行;1-10中的任何/all/none行都不能有空白单元格,尽管它们都具有相同的唯一ID

检查第一行和最后一行之间的所有行中是否有空白单元格

用空白单元格连接所有行的唯一ID

问题是:仅在第一次检查时,我就需要10+9+8+7+6+5+4+3+2个嵌套的select语句

以下是一个psuedocode示例:

开始第一个循环第一个范围:Excel工作表第2-12行;10行:

第1行和第10行具有相同的唯一id

检查第10行的空白单元格

第10行没有空白单元格

检查第9行的空白单元格

找到空白单元格->将信息添加到字符串

检查第8行的空白单元格

找到空白单元格->将信息添加到字符串

检查第7行的空白单元格

未找到空白单元格

检查第6行的空白单元格

找到空白单元格->将信息添加到字符串

检查第5行的空白单元格

没有找到更多的空白单元格

开始第二个循环第二个范围:Excel工作表第12-14行;3行:

第12单元和第14单元匹配

检查第14行的空白单元格

找到空白单元格->将信息添加到单独的字符串

检查第13行的空白单元格

未找到空白单元格

检查第12行的空白单元格

未找到空白单元格

我目前的代码如下:

Sub selectcasetryagain()
Dim c As Range
Dim r As Range
Dim lastRow As Long
Dim lastCol As Long

lastRow = Range("A:A").End(xlDown).Row
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column

Set r = ActiveSheet.Range(Cells(1, 1), Cells(lastRow, lastCol))

For i = 2 To lastRow
    Set c = r.Cells(i, 6)
    Select Case c.Value
        Case SelectCaseFallThru(c)

    End Select
Next i

End Sub

Option Explicit
Public c, r As Range
Public i As Integer
Public lastRow, lastCol As Long
Public RMissing As Variant

Function SelectCaseFallThru(Optional c As Variant, Optional d As Variant)
    If c.Value = c.Offset(10, 0).Value Then
        Debug.Print c.Value & " - " & c.Offset(10, 0).Value
        If IsEmpty(c.Offset(0, 46)).Value And IsEmpty(c.Offset(0, 47)).Value Then
            RMissing = c.Offset(0, 42).Value
        i = i + 10
    ElseIf c.Value = c.Offset(9, 0).Value Then
        Debug.Print c.Value & " - " & c.Offset(9, 0).Value
        i = i + 9
    ElseIf c.Value = c.Offset(8, 0).Value Then
        Debug.Print c.Value & " - " & c.Offset(8, 0).Value
        i = i + 8
    ElseIf c.Value = c.Offset(7, 0).Value Then
        Debug.Print c.Value & " - " & c.Offset(7, 0).Value
        i = i + 7
    ElseIf c.Value = c.Offset(6, 0).Value Then
        Debug.Print c.Value & " - " & c.Offset(6, 0).Value
        i = i + 6
    ElseIf c.Value = c.Offset(5, 0).Value Then
        Debug.Print c.Value & " - " & c.Offset(5, 0).Value
        i = i + 5
    ElseIf c.Value = c.Offset(4, 0).Value Then
        Debug.Print c.Value & " - " & c.Offset(4, 0).Value
        i = i + 4
    ElseIf c.Value = c.Offset(3, 0).Value Then
        Debug.Print c.Value & " - " & c.Offset(3, 0).Value
        i = i + 3
    ElseIf c.Value = c.Offset(2, 0).Value Then
        Debug.Print c.Value & " - " & c.Offset(2, 0).Value
        i = i + 2
    ElseIf c.Value = c.Offset(1, 0).Value Then
        Debug.Print c.Value & " - " & c.Offset(1, 0).Value
        i = i + 1
    Else
        Exit Function
    End If


End Function
我重新编写了SelectCase故障诊断,使其更加灵活,并添加了一些附加注释。由于我不确定您的psuedocode的哪个部分当前给您带来了麻烦,所以我没有添加任何附加功能。但是,一旦我知道您当前使用的是哪个psuedocode步骤,我就可以在中编辑它们

Sub selectcasetryagain()
Dim c As Range 'Will no longer access Global c
Dim r As Range
Dim lastRow As Long
Dim lastCol As Long

lastRow = Range("A:A").End(xlDown).Row
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column

Set r = ActiveSheet.Range(Cells(1, 1), Cells(lastRow, lastCol))

For i = 2 To lastRow
    Set c = r.Cells(i, 6)
    Select Case c.Value
        Case SelectCaseFallThru(10, c) ' Added in row number to make it variable

    End Select
Next i

End Sub

Option Explicit
Public c, r As Range 'Note: currently Global c is defined as a Variant
Public i As Integer
Public lastRow, lastCol As Long
Public RMissing As Variant

'This function does not currently return anything.
Function SelectCaseFallThru(maxRowNum as Integer, Optional c As Variant, Optional d As Variant) 'This Function will use the Optional c, not the Global c
    Dim counter as Integer
    Dim found as Boolean

    For counter = maxRowNum to 1 step -1
        If c.Value = c.Offset(counter, 0).Value Then
            Debug.Print c.Value & " - " & c.Offset(counter, 0).Value
            If IsEmpty(c.Offset(0, 46)).Value And IsEmpty(c.Offset(0, 47)).Value and counter = maxRowNum Then 'added check for counter
                RMissing = c.Offset(0, 42).Value
            End if
            i = i + counter
            found = True
            Exit For
        End If
    Next counter

    If not found Then Exit Function

End Function

我不理解这条语句,我需要10*9*8*7*6*5*4*3*2嵌套select语句来进行第一次检查。你不是只需要10吗?在我看来你想得太多了-我认为你可以通过两个嵌套的循环来实现所有这些。两个值之间的所有行都是相同的,例如,1&10=相同,然后2-9=与1&10相同。我想单独检查每一行,并将其唯一id添加到字符串中。如果循环命中一个,那么就我所知,它不会检查其他条件?这意味着它必须在每一次命中都要更深一层才能成功地收集所有带有空白单元格的行的唯一ID。你能发布截图吗?我在努力跟上这一点吗?