2016-07-21 4 views
0

ここに私の小さな問題で私を助けてくれることを願っています。データは実際には実現されずにコンボボックスに保存されます

私のファイルは3つのワークシートで構成されています。私は、ファイルを開くと、いくつかの計算が

、私はいくつかの要求を開始し、計算を実装するためのボタンをクリックして作成するワークシートを助け 1.データ 2.レポート 3.。この要求は、最初にワークシート1(データ)からワークシート3(ワークシートを手助けする)にデータをコピーします。それ以降の要求はすべてユーザーフォームで行われ、ワークシート3のデータは要求されたデータに対してフィルタリングされます。ユーザーフォームはワークシート3からそのデータを取得し、スクリプティング辞書を介してコンボボックスに表示されます。

は、ここで問題です:

私のデータは、3枚のスプレッドシートに含まれています。 ワークシート2のボタンを押すと、要求は初めての作業です。もう一度やり直したいのであれば(ボタンをもう一度クリックしてコピー、フィルタ、計算を実装してください)、フィルタが正しく設定されていないので、計算も同じです。 しかし、ワークシート3を開くと(現在のビューはワークシート2ではなく、ワークシート2上にあり、ボタンがある場合)、エディタウィンドウで手動でリクエストと計算を開始すると、フィルタと計算は常に正しくなります。

私は、コンボボックスが辞書を生成してそれぞれのデータを取得してフィルタを適用するときにエラーが発生すると思います。フィルタは、常に最初のリクエストで設定されたものです。それ以降のリクエストでは、フィルタは変更されませんが、それは最初のリクエストのフィルタです。 要求と計算を行った後に何らかの種類のリセットが必要なのでしょうか?

私は辞書をscritping /ユーザーフォーム/コンボボックスのために、次のコードを使用:

Sub UserForm_Initialize() 

'Taking the data from the helping working sheet 

    Dim objDic As Object 
    Dim lngZ As Long 
    Dim i As Integer 

    Set objDic = CreateObject("Scripting.Dictionary") 

    With Sheets("helpsheet") 

    For i = 12 To Sheets("helpsheet").Cells(.Rows.Count, 3).End(xlUp).Row 
    If Sheets("helpsheet").Rows(i).Hidden = False Then 
    ComboBox2.AddItem .Cells(i, 3) 
    objDic(.Cells(i, 3).Value) = 0 
    End If 

    Next 

    End With 

    Me.ComboBox2.List = objDic.keys 

    With Me.ComboBox2 
    .AddItem "all areas" 
    End With 

End Sub 

私は本当に私が続行できないよう誰かが私を助けることができると思います:(

おかげ

ラファ

答えて

1

フィルタを実行してそのシートからデータをコピーする前に、ソースシートを最初にアクティブにして選択する方が良いです。

確かに、人々は自分のコードでSheets("SheetName").selectを使用すべきではないと言いますが、私のエラーを解決する限り、私はそれをします:)。

コードを実行する前に、このSheets("YourSource").selectを入れてみてください。シート2(ボタンのある場所)に戻る場合は、Sheets("Sheet2Name").selectを使用してください。

希望すると助かります!

0

あなたは常にフルレンジリファレンスを使用する場合はすべての問題

私は推測を満たしていなければならないが、あなたの他の(図示せず)のコードで、あなたがしているということです。

  • 作るいくつかのシートの活性化/完全に参照されていない範囲変数を使用して第二スタート

  • のために「悪い環境」を作る選択

あなたは私たちが次のようにところであなたはUserForm_Initializeコードをリファクタリングすることができますあなたの

を助ける助けるために他のコードを表示したい場合があります。

Option Explicit 

Sub UserForm_Initialize() 
    Dim objDic As Object 
    Dim i As Long 

    Set objDic = CreateObject("Scripting.Dictionary") 

    With Sheets("helpsheet") 
     For i = 12 To .Cells(.Rows.Count, 3).End(xlUp).Row 
      If Not .Rows(i).Hidden Then objDic(.Cells(i, 3).Value) = 0 
     Next 
    End With 

    With Me.ComboBox2 
     .List = objDic.keys 
     .AddItem "all areas" 
    End With 
End Sub 

か、もう少しそれを短縮するに:

Sub UserForm_Initialize() 
    Dim objDic As Object 
    Dim cell As Range 

    Set objDic = CreateObject("Scripting.Dictionary") 

    For Each cell In Sheets("helpsheet").Columns(3).SpecialCells(xlCellTypeConstants).SpecialCells(xlCellTypeVisible) 
     objDic(cell.Value) = 0 
    Next cell 

    With Me.ComboBox2 
     .List = objDic.keys 
     .AddItem "all areas" 
    End With 
End Sub 
0

解決策が見つかりました。それは超簡単です。

コンボボックスをリセットするには、ENDを前に追加するだけですサブ。このようにして、すべての値やプロパティがなくても初期状態になります。

誰かが背後にあるものを見ることを望まないため、ワークシートをアクティブ化または選択しませんでした。しかし、とにかくありがとう:)

+0

'ENDを使用して、非常に落胆です!代わりに私の解決策を試す – user3598756

関連する問題