Zeilen mit bestimmten Werten in ein anderes Tabellenblatt kopieren

  • Excel

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Zeilen mit bestimmten Werten in ein anderes Tabellenblatt kopieren

    Hallo,

    habe folgende Problemstellung:

    Ich habe eine Userform erstellt mit zwei Komboboxen, in denen ein Leistungsbereich (kW) von: bis: ausgewählt werden kann. Mit klick auf den OK-Button soll im Tabellenblatt Database1 die Spalte D nach den ausgewählten Werten (einschließlich und zwischen) suchen und die komplette Zeile in das Tabellenblatt Comparison chart (ab erster freie Zeile) kopieren.

    Merci vorab!

    Visual Basic-Quellcode

    1. For r = 1 to Database1.Cells(Rows.Count).End(xlUp).Row
    2. If Database1.Cells(r,1) >= LeistungMin And Database1.Cells(r,2) <= LeistungMax Then
    3. Database1.Rows(r).EntireRow.Copy ComparisonChart.Cells(Rows.Count,1).End(xlup).Offset(1)
    4. End If
    5. Next
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Der Code funktioniert leider nicht. Wo ist denn die Spalte D definiert? Als was muss das r deklariert (Objekt erforderlich) werden?

    anbei mein code:

    Quellcode

    1. Private Sub btn_OK_Click()
    2. LeistungsMin = cbx_powerband1.Value
    3. LeistungMax = cbx_powerband2.Value
    4. r = 'noch offen
    5. For r = 1 To Database1.Cells(Rows.Count).End(xlUp).Row
    6. If Database1.Cells(r, 1) >= LeistungMin And Database1.Cells(r, 2) <= LeistungMax Then
    7. Database1.Rows(r).EntireRow.Copy ComparisonChart.Cells(Rows.Count, 1).End(xlUp).Offset(1)
    8. End If
    9. Next
    10. End Sub

    keepsmile schrieb:

    Der Code funktioniert leider nicht
    Das soll ja auch nur ein Rohentwurf gewesen sein.
    Ich hab schon erwartet, dass du den Rest selbst an deine Struktur anpasst.

    Visual Basic-Quellcode

    1. Set Database1=Sheets("Database1")
    2. Set ComparisonChart=Sheets("ComparisonChart")
    Falls du "Option Explicit" eingeschaltet hast, musst du die Variablen auch noch definieren.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich verstehe aber immer noch nicht an welcher Stelle ich meine Spalte definiere in der nach den Werten gesucht werden soll. Normal kenne ich es mit beispielsweise Spalte F bis Zeile (6, Zeile XYZ). Bisher passiert bei Klick auf den OK-Button noch nichts. Tut mir leid, aber ich arbeite nur selten mit VBA.

    keepsmile schrieb:

    If Database1.Cells(r, 1) >= LeistungMin And Database1.Cells(r, 2) <= LeistungMax
    In meinem Beispiel ist es Spalte 1 für LeistungMin und Spalte 2 für LeistungMax.
    Du musst das schon auf deine Umgebung anpassen.

    keepsmile schrieb:

    Bisher passiert bei Klick auf den OK-Button noch nichts
    "nichts" glaube ich nicht (es sei denn, du hast Macros disabled).
    Wie wärs mit Debuggen?
    Breakpoint setzen und im Singlestep durchgehen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Meine Makros sind aktiviert! Und ich bin den Code schon mit F8 durchgegangen. Es passiert beim Klicken des OK-Button nichts. Anbei nochmals mein Code. Habe es jetzt auf Spalte F angepasst.

    Quellcode

    1. Private Sub btn_OK_Click()
    2. LeistungsMin = cbx_powerband1.Value
    3. LeistungMax = cbx_powerband2.Value
    4. Set Database1 = Sheets("Database1")
    5. Set ComparisonChart = Sheets("ComparisonChart")
    6. For r = 1 To Database1.Cells(Rows.Count).End(xlUp).Row
    7. If Database1.Cells(r, 6) >= LeistungMin And Database1.Cells(r, 6) <= LeistungMax Then
    8. Database1.Rows(r).EntireRow.Copy ComparisonChart.Cells(Rows.Count, 1).End(xlUp).Offset(1)
    9. End If
    10. Next
    11. Unload Me
    12. End Sub
    13. Private Sub UserForm_Initialize()
    14. 'Füllt die Kombinationsfelder mit einer Vorauswahl
    15. With Me.cbx_powerband1
    16. .AddItem ""
    17. .AddItem "0"
    18. .AddItem "200"
    19. .AddItem "400"
    20. .AddItem "600"
    21. .AddItem "800"
    22. .AddItem "1000"
    23. .AddItem "1200"
    24. .AddItem "1400"
    25. .AddItem "1600"
    26. .AddItem "1800"
    27. .AddItem "2000"
    28. .AddItem "2500"
    29. .AddItem "3000"
    30. .AddItem "4000"
    31. .AddItem "5000"
    32. .AddItem "6000"
    33. .AddItem "7000"
    34. .AddItem "8000"
    35. .AddItem "9000"
    36. .AddItem "10000"
    37. .AddItem "11000"
    38. .AddItem "12000"
    39. .AddItem "13000"
    40. .AddItem "14000"
    41. .AddItem "15000"
    42. .AddItem "16000"
    43. .AddItem "17000"
    44. .AddItem "18000"
    45. .AddItem "19000"
    46. .AddItem "20000"
    47. End With
    48. cbx_powerband2.List = cbx_powerband1.List
    49. End Sub
    Wie soll man VBA ganz ohne Hilfe lernen
    Durch Eigeninitiative und qualifizierte Fragestellung ;)
    Mach nicht andere dafür verantwortlich, wenn du deine Aufgaben nicht gelöst kriegst.
    In der Aussage "Ereignisroutine und Forms-Button sagen mir nichts" sehe ich keine konkrete Frage, die man beantworten sollte.
    Da hätte ich erwartet, dass du selbständig mit diesen Begriffen eine Suchmaschine bemühst.



    Es gibt zwei Arten von Buttons in Excel.

    Der eine ist ein Formularsteuerelement.
    Das wesentliche, was du damit tun kannst, ist beim Erzeugen ein Makro (eine Ereignisroutine) zuweisen.

    Der andere ist ein AxtiveX-Control.
    Damit kannst du wesentlich mehr machen.
    Deswegen verwende ich normalerweise diese Variante.

    Für deinen Zweck sind beide ausreichend.
    Die Ereignisroutine ist das, was passieren soll, wenn du auf den Button klickst (also das Ereignis auslöst).

    Wenn beim Klicken des Buttons nichts passiert, dann hast du dem Button vermutlich keine (oder eine andere) Ereignisroutine zugewiesen.
    Du musst deine Sub btn_OK_Click dem Button zuweisen.
    Oder aus der zugewiesenen Routine diese aufrufen.

    Verwende in der ersten Zeile deiner Routine den Befehl

    Visual Basic-Quellcode

    1. Stop
    Wenn beim Klicken auf den Button der Code nicht an dieser Stelle angehalten wird, dann wird die Routine nicht angesprungen (weil sie nicht zugewiesen ist).
    Wenn der Code anhält, kannst du im Singlestep-Verfahren (F8) durch den Code steppen und dabei den Programmablauf beobachten und die Variablen anschauen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich bin nunmal hauptberuflich keine Programmiererin. Hatte VBA ein halbes Semester lang. TOP! Denke wenn man dann nicht so viel Ahnung hat ist das legitim. Aber wird auch meine letzte Fragestellung in diesem Forum sein.

    Ich verwende immer ActiveX Steuerelemente.

    Und meine Routine ist dem Button btn_OK zugewiesen. Bei Doppelklick auf den Button wird es ja automatisch zugewiesen. Bin jetzt schon weiß gott wie oft mit F8 den Code durchgegangen. Ich habe mir sogar meine Excelfenster dabei angeschautö. Es passiert nichts. Habe es jetzt mit Option explicit versucht. Leider kein Erfolg.

    Quellcode

    1. Option Explicit
    2. Private Sub btn_OK_Click()
    3. Dim Database1 As Worksheet
    4. Dim ComparisonChart As Worksheet
    5. Dim LeistungMin As Integer
    6. Dim LeistungMax As Integer
    7. Dim r As Long
    8. LeistungMin = cbx_powerband1.Value
    9. LeistungMax = cbx_powerband2.Value
    10. Set Database1 = Sheets("Database1")
    11. Set ComparisonChart = Sheets("ComparisonChart")
    12. For r = 1 To Database1.Cells(Rows.Count).End(xlUp).Row
    13. If Database1.Cells(r, 6) >= LeistungMin And Database1.Cells(r, 6) <= LeistungMax Then
    14. Database1.Rows(r).EntireRow.Copy ComparisonChart.Cells(Rows.Count, 1).End(xlUp).Offset(1)
    15. End If
    16. Next
    17. Unload Me
    18. End Sub
    19. Private Sub UserForm_Initialize()
    20. 'Füllt die Kombinationsfelder mit einer Vorauswahl
    21. With Me.cbx_powerband1
    22. .AddItem ""
    23. .AddItem "0"
    24. .AddItem "200"
    25. .AddItem "400"
    26. .AddItem "600"
    27. .AddItem "800"
    28. .AddItem "1000"
    29. .AddItem "1200"
    30. .AddItem "1400"
    31. .AddItem "1600"
    32. .AddItem "1800"
    33. .AddItem "2000"
    34. .AddItem "2500"
    35. .AddItem "3000"
    36. .AddItem "4000"
    37. .AddItem "5000"
    38. .AddItem "6000"
    39. .AddItem "7000"
    40. .AddItem "8000"
    41. .AddItem "9000"
    42. .AddItem "10000"
    43. .AddItem "11000"
    44. .AddItem "12000"
    45. .AddItem "13000"
    46. .AddItem "14000"
    47. .AddItem "15000"
    48. .AddItem "16000"
    49. .AddItem "17000"
    50. .AddItem "18000"
    51. .AddItem "19000"
    52. .AddItem "20000"
    53. End With
    54. cbx_powerband2.List = cbx_powerband1.List
    55. End Sub

    keepsmile schrieb:

    Es passiert nichts.
    Mit dieser Aussage hast du mich oben schon auf den Holzweg geführt.
    Er wird zumindest zeilenweise im Code vorangehen.

    Wenn du nicht sagen willst, an welcher Stelle nicht das von dir erwartete passiert, mag ich auch nicht raten.

    Aber wird auch meine letzte Fragestellung in diesem Forum sein.
    Auch in anderen Foren wirst du, um Hilfe zu bekommen, qualifizierten Input liefern müssen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Mich nervt es nur etwas als "dumm" dargestellt zu werden. Glaube meine Beschreibung am Anfang war akzeptabel. Diese Codezeile wird übersprungen:


    Database1.Rows(r).EntireRow.Copy ComparisonChart.Cells(Rows.Count, 1).End(xlUp).Offset(1)

    Die Userform öffnet sich problemlos. Sie wird auch mit dem vorgegebenen Input gefüllt.