Makro aus anderen Tabellenblatt starten

  • Excel

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von roddy.

    Makro aus anderen Tabellenblatt starten

    Hallo,

    ich habe eine Userform mit mehreren Buttons/Aktionen und dafür hinterlegten Makros. Die Userform rufe ich über einen Startbutton mit folgenden Makro auf:

    Visual Basic-Quellcode

    1. Sub UserFormAnzeigen1()
    2. Dim AnzahlVokabeln As String
    3. Set frm = UserForm1
    4. AnzahlVokabeln = _
    5. ThisWorkbook.Sheets("Vokabeln").UsedRange.Rows.Count
    6. With frm
    7. .TextBox5.Value = AnzahlVokabeln - 1
    8. .TextBox1.SetFocus
    9. End With
    10. UserForm1.Show
    11. End Sub


    Jetzt möchte ich jedoch diesen Startbutton in ein anderes Tabellenblatt („Menü“) einfügen und von dort aus die Userform starten, bedienen und beenden. Das starten funktioniert auch soweit, indem ich dem Startbutton obiges Makro zuweise. Jedoch führen Aktionen innerhalb der Userform dazu, dass die Ansicht in das andere Tabellenblatt („Vokabeln“) springt und auch nach Beendigung dort bleibt. Ich möchte im Prinzip das bei der Bedienung der Userform stets das Tabellenblatt(„Menü“) zu sehen bleibt.

    Muss ich dazu im Makro für die Userform irgendwie einen Verweis auf das Tabellenblatt(„Vokabeln“) machen???
    Vielleicht funktioniert das:

    Visual Basic-Quellcode

    1. Sub UserFormAnzeigen1()
    2. Dim AnzahlVokabeln As String
    3. Dim Blatt As Worksheet
    4. Set Blatt = ActiveSheet
    5. Set frm = UserForm1
    6. AnzahlVokabeln = _
    7. ThisWorkbook.Sheets("Vokabeln").UsedRange.Rows.Count
    8. With frm
    9. .TextBox5.Value = AnzahlVokabeln - 1
    10. .TextBox1.SetFocus
    11. End With
    12. UserForm1.Show
    13. Blatt.Activate
    14. End Sub

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. 'Textfelder leeren und Abbrechen
    3. Dim Tb As Object
    4. Dim Ob As Object
    5. For Each Tb In UserForm1.Controls
    6. If TypeName(Tb) = "TextBox" Then Tb.Value = ""
    7. Next Tb
    8. For Each Ob In UserForm1.Controls
    9. If TypeName(Ob) = "OptionButton" Then Ob.Value = False
    10. Next Ob
    11. UserForm1.Hide
    12. End Sub
    13. Private Sub CommandButton2_Click()
    14. 'Vokabeln speichern
    15. Dim frm As UserForm
    16. Dim AnzahlVokabeln As String
    17. Dim Vokabel As Object
    18. Set frm = UserForm1
    19. Beginn:
    20. If WorksheetFunction.CountIf(Sheets("Vokabeln").Range("A:A"), TextBox1.Text) > 0 Then
    21. MsgBox "Diese Vokabel existiert schon!"
    22. Exit Sub
    23. End If
    24. AnzahlVokabeln = _
    25. ThisWorkbook.Sheets("Vokabeln").UsedRange.Rows.Count
    26. Sheets("Vokabeln").Activate
    27. Range("A65536").End(xlUp).Offset(1, 0).Select
    28. With frm
    29. ActiveCell.Value = .TextBox1.Value
    30. ActiveCell.Offset(0, 1).Value = .TextBox2.Value
    31. ActiveCell.Offset(0, 2).Value = .TextBox3.Value
    32. ActiveCell.Offset(0, 3).Value = .TextBox4.Value
    33. .TextBox5.Value = AnzahlVokabeln
    34. .TextBox1.Value = ""
    35. .TextBox2.Value = ""
    36. .TextBox3.Value = ""
    37. .TextBox4.Value = ""
    38. .OptionButton1 = False
    39. .OptionButton2 = False
    40. .OptionButton3 = False
    41. .OptionButton4 = False
    42. .TextBox1.SetFocus
    43. End With
    44. Set frm = Nothing
    45. End Sub
    In Zeile 26 wird die Tabelle "Vokabeln" aktiviert.

    Mein Vorschlag, damit die Tabelle nicht gewechselt wird:

    Zunächst statt der Zeile 17 (Die Variable "Vokabel" brauchst du ja dank "CountIf" nicht mehr):

    Visual Basic-Quellcode

    1. Dim Vokabeln As Worksheet, Zelle As Range


    Dann statt der Zeilen 20 bis 32:

    Visual Basic-Quellcode

    1. Set Vokabeln = ThisWorkbook.Sheets("Vokabeln")
    2. If WorksheetFunction.CountIf(Vokabeln.Range("A:A"), TextBox1.Text) > 0 Then
    3. MsgBox "Diese Vokabel existiert schon!"
    4. Exit Sub
    5. End If
    6. AnzahlVokabeln = Vokabeln.UsedRange.Rows.Count
    7. Set Zelle = Vokabeln.Range("A65536").End(xlUp).Offset(1, 0)
    8. With frm
    9. Zelle.Value = .TextBox1.Value
    10. Zelle.Offset(0, 1).Value = .TextBox2.Value
    11. Zelle.Offset(0, 2).Value = .TextBox3.Value
    12. Zelle.Offset(0, 3).Value = .TextBox4.Value


    Dann sollte der Code genaudasselbe machen wie zuvor, nur eben ohne, dass die Tabelle gewechselt wird. Trotzdem landen die TextBox-Inhalte in der gewünschten Tabelle.

    Dann brauchst du auch wahrscheinlich meine Konstruktion mit dem "Blatt" (meine erste Antwort in diesem Thema) nicht mehr.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „roddy“ ()