2016-07-21 10 views
0

aktualisiert werden ich hoffe, dass Sie mich mit meinem kleinen Problem hier helfen kann ..Daten werden in einer Combobox gespeichert statt

Meine Datei besteht drei Arbeitsblätter. 1. Daten 2. Bericht 3. Arbeitsblatt helfen einige Berechnungen

zu machen, wenn ich die Datei öffnen, ich auf eine Schaltfläche klicken, um eine Berechnung zu implementieren, die einige Anfragen beginnt. Diese Anforderung kopiert zuerst die Daten von Arbeitsblatt 1 (Daten) in Arbeitsblatt 3 (Arbeitsblatt). Nach weiteren Anforderungen, die alle in Benutzerformularen ausgeführt wurden, werden die Daten in Arbeitsblatt 3 nach den angeforderten Daten gefiltert. Das Benutzerformular erhält seine Daten aus Arbeitsblatt 3 und wird in einer Combobox über das Scripting Dictionary angezeigt.

Hier ist das Problem:

Meine Daten auf drei Tabellen enthalten ist. Wenn ich den Knopf auf Arbeitsblatt 2 drücke, erledigen die Anfragen ihre Arbeit zum ersten Mal. Wenn ich es noch einmal machen möchte (Klicken Sie erneut auf die Schaltfläche, um Kopieren, Filtern und Berechnen zu implementieren), wird der Filter falsch eingestellt und die Berechnung wird ebenfalls ausgeführt. Wenn jedoch Arbeitsblatt 3 geöffnet wird (die aktuelle Ansicht befindet sich auf Arbeitsblatt 3, nicht Arbeitsblatt 2, wo die Schaltfläche ist) und ich die Anforderungen und Berechnungen manuell im Editorfenster starte, sind Filter und Berechnung immer korrekt.

Ich denke, der Fehler ist, wenn die Combobox generiert das Wörterbuch bzw. erhält seine Daten und wendet einen Filter an. Der Filter ist immer derjenige, der bei den ersten Anfragen gesetzt wurde. Bei weiteren Anfragen ändert sich der Filter nicht, es ist immer noch der Filter von der ersten Anfrage. Vielleicht sollte es nach den Anfragen und Berechnungen eine Art Reset geben?

habe ich den folgenden Code für die Userform/Combobox/scritping Wörterbuch:

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 

ich mich wirklich jemand hoffen helfen kann, da ich nicht gehen kann :(

Dank

Rafa

Antwort

1

Es ist besser, zuerst das Quellblatt zu aktivieren/auszuwählen, bevor der Filter ausgeführt wird und Daten auf diesem Blatt kopiert werden

Sicher, Leute sagen, dass man nicht Sheets("SheetName").select in seinem Code verwenden sollte, aber solange es meinen Fehler löst, würde ich es tun :).

Also, versuchen Sie, diese Sheets("YourSource").select vor der Ausführung Ihres Codes zu setzen. Wenn Sie zu Ihrem Blatt 2 zurückkehren möchten (wo sich die Schaltfläche befindet), verwenden Sie einfach Sheets("Sheet2Name").select.

Ich hoffe, ich könnte helfen!

0

, wenn Sie immer vollständige Palette Referenz verwenden sollten Sie keine Ausgabe treffen

mein erraten ist, dass Sie in Ihrem anderen Code (nicht dargestellt) sind:

  • einige Blätter machen Aktivierung/Auswahl, die eine „schlechte Umgebung“ für den zweiten Start

  • mit nicht vollständig referenziert Bereichsvariablen

macht

Sie können den anderen Code zeigen wollen, dass wir Sie

BTW können Sie Refactoring den UserForm_Initialize Code zu helfen, helfen Sie wie folgt vor:

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 

oder, um es zu verkürzen, nach unten ein wenig mehr:

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

Ich fand die Lösung und es ist super einfach ..

Um die Comboboxen zurückzusetzen, müssen Sie nur ENDE vor ENDE hinzufügen SUB. Auf diese Weise erhält alles seinen ursprünglichen Zustand ohne irgendwelche Werte oder Eigenschaften.

Ich habe das Arbeitsblatt nicht aktiviert oder ausgewählt, weil ich nicht möchte, dass jemand sieht, was dahinter steckt. Aber danke trotzdem :)

+0

mit 'END' wird dringend abgeraten! Versuchen Sie stattdessen meine Lösung – user3598756