2017-01-25 6 views
0

私は月に利用可能なレンタルを追跡するワークブックを作成しています。毎月1枚ずつ12枚に分かれています。各シートの最初の3つの列は、宿泊施設の種類、寝室の数、賃貸料に含まれるものを追跡します。コンセプトには、入力エラーを減らすために入力するのではなく、ポイントアンドクリックオプションでユーザーが入力できるドロップダウンコンボボックスがあります。コンボボックスが選択されたリストインデックス値を返さない

アクティブなセルがどの列にあるかによって内容が変化し、次に配列がコンボボックスに割り当てられる固定配列をセットアップしました。コードは、Sheet1モジュールのコンボボックスコードの下にあり、ThisWorkbookモジュールはSheetSelectionChangeの下で呼び出すため、各シートのコードが繰り返されることはありません。

A標準モジュールは、すべての12個のコンボボックスは、同じ名前、cboOptionsを共有

公共の配列を作り、彼らは関係なく、選択されたものをシートの、正しく取り込みます。私の問題は、コンボボックスのどれも、それを指示するコードに関係なく、選択されたリストの値を返すことがないということです。私は選択された位置の値に対して返された位置の値を調べるためにテストしましたが、パターンを確立することはできませんでした。私は、変数と配列をクリアして、コードが邪魔になるかもしれないと思っていましたが、効果がないようです。問題について私ができることを読んだことがありますが、問題の可能性については考えていません...事前に感謝しています!

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 

はThisWorkbookにおけるコード:Module1の中

Sub Workbook_SheetSelectionChange(ByVal sh As Object, ByVal Target As Range) 

Application.Run "Sheet1.cboOptions_Change" 

End Sub 

コード:

Option Explicit 
Public myarray(0 To 5) As String 
+0

あなたのコードはcboOptions_Changeである理由? –

+0

これは、コンボボックスを作成するために必要な場所です。元のコンボボックスはSheet1にあり、他のすべての参照点です。私は標準的なモジュールの中でそれを作ることができると思います... – quadrature

+0

それで、条件は訂正されていますか?なぜなら、もしそうでなければ、あなたはコンボボックスに何も持たないからです。 –

答えて

1

問題の本質は、より多くのを使用していることのようです1つのコンボボックスの1つの配列は、listindex値の計算方法を分解します。私は、問題が

1を持続かどうかを確認するために、そのコンポーネントの機能にコードを壊した)新しいファイルを作り、次の使用例は、シート1 2のコードを入れて)入力 3の種類ごとに別々の固定配列を作った)別のルーチンを作成しました各種類の入力について

エラーを再開するそれぞれのルーチンの始めにNEXTを使用すると、エラーが見落とされ、コードが正しく機能します。あるいは、整数変数にコンボボックスのlistindex値が与えられたブレークを入れることで、ユーザは選択を行い、続ける前に整数変数に値を割り当てることができます。それ以外の場合、デフォルト値は-1でエラーを返します。 .list(.listindex)を使用しても、コードはユーザーの入力を待つ必要があることを示唆しています(変更以外のコンボボックスイベントを使用しています)。

各列に別々のコンボボックスを設定するだけでよい場合があります。とにかく、次のコードは、単一のシートのために、上記のスティック-と-石バージョンで、ワークブック内の各シートモジュールに適用された場合、それは仕事をする:

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 
関連する問題