Arrays 在类中使用数组(Excel VBA)

Arrays 在类中使用数组(Excel VBA),arrays,excel,class,vba,Arrays,Excel,Class,Vba,我正在做一个程序的一部分,该程序执行以下操作: 1) 确定特定单元格中是否有“X”,以及标头是否与用户输入匹配 2) 如果为true,则将标头的内容添加到类中的元素 例如,如果一行的“离合器”标题下有一个“X”,则在本例中,将“离合器”添加到位置离合器 下面是实现这一点的方法(编辑:这是一个Do-While循环,因此是R+1,如果最初没有澄清的话,很抱歉): 现在,问题是每个元素都有一个很长的ElseIf语句列表(总共有6个)。我想把它转换成一个for循环,经过一些研究后,我认为在类模块中包含一

我正在做一个程序的一部分,该程序执行以下操作:

1) 确定特定单元格中是否有“X”,以及标头是否与用户输入匹配

2) 如果为true,则将标头的内容添加到类中的元素

例如,如果一行的“离合器”标题下有一个“X”,则在本例中,将“离合器”添加到位置离合器

下面是实现这一点的方法(编辑:这是一个Do-While循环,因此是R+1,如果最初没有澄清的话,很抱歉):

现在,问题是每个元素都有一个很长的ElseIf语句列表(总共有6个)。我想把它转换成一个for循环,经过一些研究后,我认为在类模块中包含一个数组是最好的方法,因为我可以循环数组中的每个值


我想知道如何在类模块中创建由类元素组成的数组,以及是否可以为for循环中的每个类元素设置值。此外,如果有更好的解决方案,我想了解更多

我不是100%确定你的意思。但是根据你文章的第一部分,这里有一些带有注释的示例代码

Option Explicit

Sub tryme()

    Dim inp As String
    inp = InputBox("Whats the header:")
    Dim ws As Worksheet
    Set ws = Sheets("Sheet1")
    Dim rng As Range
    Dim i As Long, j As Long

    For i = 1 To ws.Cells(1, Columns.Count).End(xlToLeft).Column
        If StrComp(inp, CStr(ws.Cells(1, i).Value), 1) = 0 Then
            For j = 2 To ws.Cells(Rows.Count, i).End(xlUp).Row
                Set rng = ws.Cells(j, i)
                    If StrComp(CStr(rng.Text), "X", 1) = 0 Then
                        ' youve just found a match
                        ' so if your class constructor takes some params
                        ' for example
                        ' ...MyClass(header as String, row as Long)
                        ' then you can call it
                        ' ...dim newMyClassObj(Cstr(ws.Cells(1, i).Text), rng.row)
                    End If
                Set rng = Nothing
            Next j
        End If
    Next i

End Sub

我不是100%确定你的意思。但是根据你文章的第一部分,这里有一些带有注释的示例代码

Option Explicit

Sub tryme()

    Dim inp As String
    inp = InputBox("Whats the header:")
    Dim ws As Worksheet
    Set ws = Sheets("Sheet1")
    Dim rng As Range
    Dim i As Long, j As Long

    For i = 1 To ws.Cells(1, Columns.Count).End(xlToLeft).Column
        If StrComp(inp, CStr(ws.Cells(1, i).Value), 1) = 0 Then
            For j = 2 To ws.Cells(Rows.Count, i).End(xlUp).Row
                Set rng = ws.Cells(j, i)
                    If StrComp(CStr(rng.Text), "X", 1) = 0 Then
                        ' youve just found a match
                        ' so if your class constructor takes some params
                        ' for example
                        ' ...MyClass(header as String, row as Long)
                        ' then you can call it
                        ' ...dim newMyClassObj(Cstr(ws.Cells(1, i).Text), rng.row)
                    End If
                Set rng = Nothing
            Next j
        End If
    Next i

End Sub

您不会真正将
If-Else
转换为
循环
。您可以考虑使用<代码>选择案例< /代码>,而不是一系列嵌套的<代码> I/EX//COD>语句。我遇到了一个问题,因为选择CASE短路。你建议如何避免这种情况?我不知道你所说的“选择案例短路”是什么意思。我看不懂你的心思——这里的其他人也看不懂——所以,请更新你的问题,包括你尝试过的代码,并指出哪一行出现了错误。如果没有出现错误,请描述输出如何与您想要/期望的不一致。我设法使用完全不同的方法来解决我的问题,但感谢您花时间提供帮助。下次我有问题的时候会更清楚。你不会真的把
If-Else
转换成
循环。您可以考虑使用<代码>选择案例< /代码>,而不是一系列嵌套的<代码> I/EX//COD>语句。我遇到了一个问题,因为选择CASE短路。你建议如何避免这种情况?我不知道你所说的“选择案例短路”是什么意思。我看不懂你的心思——这里的其他人也看不懂——所以,请更新你的问题,包括你尝试过的代码,并指出哪一行出现了错误。如果没有出现错误,请描述输出如何与您想要/期望的不一致。我设法使用完全不同的方法来解决我的问题,但感谢您花时间提供帮助。下次我有问题的时候会说得更清楚。这很有帮助。非常感谢你!这帮了大忙。非常感谢你!