即使选择了某些内容,ListIndex属性也将返回-1

时间:2019-01-15 18:48:50

标签: excel vba

我已经在Google上进行了广泛的搜索,询问了我的同事,甚至尝试创建替代方法代码。我尝试更改列表框的名称并创建一个新列表框。

我在用户窗体上有一个名为lbx_genoutages的列表框。我想获取选择的行号。即使选择了某项,它也会始终返回负一(-1)。

它唯一有效的时间是我选择了第一条记录(记录0)。

以下是其错误所在的代码行:

listboxId = Me.lbx_genoutages.List(Me.lbx_genoutages.ListIndex, 0)

我尝试将“ me”更改为用户表单的名称。我已附加了列表框的图像,其中显示了选定的内容,但仍然显示错误。我还仔细检查了列表框的名称是否正确拼写,等等。listbox

这适用于同一程序中其他用户窗体上的其他列表框。我比较了两个列表框的属性,但没有任何区别。

以下是在初始化用户表单时填充列表框的代码:

    frm_dbGenBrowser.lbx_genoutages.Clear
    frm_dbGenBrowser.lbx_genoutages.ColumnCount = 8
    frm_dbGenBrowser.lbx_genoutages.ColumnWidths = "0, 40, 40, 40, 40, 60, 70, 50"

    If q = "" Then 'query could be already filled if specified when this sub was called. This is used for sorting.
        q = "SELECT * FROM SLA_Generators as s left join (list_lcc as l) on s.sg_lcc = l.id" & _
            " WHERE SG_deleted = No " & _
            " AND SG_outDate <= #" & frm_dbGenBrowser.DTPicker2.Value & "# " & _
            " AND SG_retDate >= #" & frm_dbGenBrowser.DTPicker1.Value & "# " & _
            " ORDER BY " & orderby
    End If
        Set rs = con.Execute(q)

    Do Until rs.EOF 'for each outage, add it into the list
        If rs.Fields("SG_isOutage").Value = True Then partialOutage = "" Else partialOutage = " *"
        With frm_dbGenBrowser.lbx_genoutages
            .addItem
            .List(i, 0) = rs.Fields("s.ID").Value
            .List(i, 2) = nz(rs.Fields("lccname").Value, "")
            .List(i, 1) = rs.Fields("SG_unit").Value
            .List(i, 3) = rs.Fields("SG_reduction").Value & partialOutage
            .List(i, 4) = IIf(rs.Fields("SG_dailyReport").Value = True, "Y", "N")
            .List(i, 5) = rs.Fields("SG_outDate").Value
            .List(i, 6) = rs.Fields("SG_retDate").Value
            If Len(rs.Fields("SG_reason")) > 0 Then
                .List(i, 7) = rs.Fields("SG_reason").Value
            Else
                .List(i, 7) = ""
            End If
            If rs.Fields("s.ID").Value = outageId Then .ListIndex = i
        End With
        rs.MoveNext
        i = i + 1
    Loop

1 个答案:

答案 0 :(得分:0)

您正在以某种方式处理两个实例。

大概是您在表单的默认实例上填充列表框:

frm_dbGenBrowser.lbx_genoutages.Clear
frm_dbGenBrowser.lbx_genoutages.ColumnCount = 8
frm_dbGenBrowser.lbx_genoutages.ColumnWidths = "0, 40, 40, 40, 40, 60, 70, 50"

但是您没有显示那个实例:

With New frm_dbGenBrowser
    .Show
End With

当上面的(正确的)代码运行时,所有引用默认实例的东西(即,使用表单的名称而不是Me /当前实例)都发生在以下情况上,显示但在内存中无关的实例,您会得到-1,因为实际上在该实例上没有选择任何东西。

表单是对象,如您所见,不能将表单这么快地对待就容易产生错误和混乱。

避免在其自身的代码后方引用表单的默认实例。使用Me而不是表单的类名,无论您是针对默认实例还是针对.Show实例运行New,问题都会消失。

经验法则,请避免使用任何类(包括表单类)的有状态默认实例。有关更多信息,请参见UserForm1.Show(免责声明:我写了该文章)。