combobox不返回selectlistindex值

我正在创build一个工作簿,每月跟踪可用租金。 它分为12张,每月一张。 每张纸的前三列都跟踪住宿types,卧室数量以及租赁价格中包含的内容。 这里的概念是将会有一个下拉combobox,允许用户使用点击选项填充,而不是input内容以减lessinput错误。

我设置了一个固定的数组,其中的内容根据活动单元格所在的列进行更改,然后将该数组分配给combobox。 该代码位于combobox代码下的Sheet1模块中,并且ThisWorkbook模块在SheetSelectionChange下调用它,以避免重复每个工作表中的代码。

标准模块使arrays公开

所有12个combobox共享相同的名称,cboOptions,并且它们填充正确,无论select哪个表。 我的问题是,没有一个combobox返回所做select的listindex值,无论代码是否告诉它这样做。 我一直在testing,看看所选位置的价值回报的位置,但我还没有能够build立一个模式。 我想清除variables和数组,认为这可能是什么混乱的代码,但它似乎没有效果。 我已经阅读了关于这个问题的一些信息,但是我对什么可能是问题没有意见……提前感谢!

Sheet1模块中的代码:

Private Sub cboOptions_Change() Erase myarray() cboOptions.Visible = True cboOptions.Enabled = True cboOptions.Clear n = ActiveCell.Row If n >= 3 And n < 10000 Then If ActiveSheet.Range(ActiveCell.Address).Address = Range("A" & n).Address Then myarray(1) = "Apartment" myarray(2) = "Room" myarray(3) = "Townhouse" myarray(4) = "House" ElseIf ActiveSheet.Range(ActiveCell.Address).Address = Range("B" & n).Address Then myarray(1) = "1" myarray(2) = "2" myarray(3) = "3" myarray(4) = "4" myarray(5) = "5" ElseIf ActiveSheet.Range(ActiveCell.Address).Address = Range("C" & n).Address Then myarray(1) = "Heat & Water" myarray(2) = "All-inclusive" Else cboOptions.Enabled = False cboOptions.Visible = False End If End If 'ActiveSheet.cboOptions.ListIndex = 0 'Dim x As Long 'MsgBox ActiveSheet.Name With ActiveSheet .cboOptions.Left = .Range(ActiveCell.Address).Left .cboOptions.Top = .Range(ActiveCell.Address).Top .cboOptions.List = myarray() With .cboOptions 'the problem is that x needs to get assigned a value from the combo box before it continues to execute x = .List(.ListIndex) 'MsgBox x End With .Range(ActiveCell.Address) = x 'myarray(x) .Columns(ActiveCell.Column).ColumnWidth = cboOptions.Width * 0.18 x = 0 Erase myarray() End With End Sub 

本工作簿中的代码:

 Sub Workbook_SheetSelectionChange(ByVal sh As Object, ByVal Target As Range) Application.Run "Sheet1.cboOptions_Change" End Sub 

模块1中的代码:

 Option Explicit Public myarray(0 To 5) As String 

问题的本质似乎是对一个combobox使用多个数组会破坏listindex值的计算方式。 我将代码分解为其组件function,以查看问题是否存在

1)创build一个新的文件,并将代码放在Sheet1中2)为每种input制作单独的固定数组3)为每种input创build一个单独的例程

在每个例程的开始处使用ON ERROR RESUME NEXT忽略错误并且代码正常工作。 或者,在给出整数variables的地方放置一个中断combobox的listindex值,允许用户在继续之前做出select并给整数variables赋值。 否则,其默认值为-1,并返回一个错误; 使用.list(.listindex)没有任何区别,暗示代码需要等待用户input(使用除Change之外的combobox事件?)。

可能只需要为每列build立一个单独的combobox。 无论如何,下面的代码是上面这个棒棒的版本,对于一张纸来说,如果应用到工作簿中的每个工作表模块上,它将执行这个工作:

 Sub monthnames() 'add month names to the first cell of each sheet Dim n As Integer 'Sheets(1).Activate For n = 1 To 12 Sheets.Add After:=ActiveSheet ThisWorkbook.Sheets(n).Cells(1, 1) = MonthName(n) Next End Sub Private Sub cboOptions_Change() Dim myarray(1 To 4) As String Dim myarray2(1 To 5) As String Dim myarray3(1 To 2) As String cboOptions.Enabled = True cboOptions.Visible = True Dim n As Integer n = ActiveCell.Row If n >= 3 And n < 10000 Then If Range(ActiveCell.Address).Address = Range("A" & n).Address Then myarray(1) = "Apartment" myarray(2) = "Room" myarray(3) = "Townhouse" myarray(4) = "House" cboOptions.List = myarray() inputdata myarray(), n ElseIf Range(ActiveCell.Address).Address = Range("B" & n).Address Then myarray2(1) = "1" myarray2(2) = "2" myarray2(3) = "3" myarray2(4) = "4" myarray2(5) = "5" cboOptions.List = myarray2() inputdata2 myarray2(), n ElseIf Range(ActiveCell.Address).Address = Range("C" & n).Address Then myarray3(1) = "Heat & Water" myarray3(2) = "All-inclusive" cboOptions.List = myarray3() inputdata3 myarray3(), n Else cboOptions.Enabled = False cboOptions.Visible = False End If End If End Sub Sub inputdata(myarray, n) 'myarray3, ) On Error Resume Next Dim x As Integer cboOptions.Left = Range(ActiveCell.Address).Left cboOptions.Top = Range(ActiveCell.Address).Top Columns(ActiveCell.Column).ColumnWidth = cboOptions.Width * 0.18 If Range(ActiveCell.Address).Address = Range("A" & n).Address Then x = cboOptions.ListIndex + 1 Range(ActiveCell.Address) = myarray(x) Else Exit Sub End If End Sub Sub inputdata2(myarray2, n) On Error Resume Next Dim y As Integer cboOptions.Left = Range(ActiveCell.Address).Left cboOptions.Top = Range(ActiveCell.Address).Top Columns(ActiveCell.Column).ColumnWidth = cboOptions.Width * 0.18 If Range(ActiveCell.Address).Address = Range("B" & n).Address Then y = cboOptions.ListIndex + 1 Range(ActiveCell.Address) = myarray2(y) Else Exit Sub End If End Sub Sub inputdata3(myarray3, n) On Error Resume Next Dim z As Integer cboOptions.Left = Range(ActiveCell.Address).Left cboOptions.Top = Range(ActiveCell.Address).Top Columns(ActiveCell.Column).ColumnWidth = cboOptions.Width * 0.18 If Range(ActiveCell.Address).Address = Range("C" & n).Address Then z = cboOptions.ListIndex + 1 Range(ActiveCell.Address) = myarray3(z) Else Exit Sub End If End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Call cboOptions_Change End Sub