Über einen Button eine Datei aufrufen

  • Excel

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

    Über einen Button eine Datei aufrufen

    Hallo zusammen!
    Ich hoffe Ihr könnt mir bei meinem Problem helfen.
    Ich möchte in VBA (unter Excel2007) eine Form erstellen, die mehrere Buttons besitzt. Über einen dieser Buttons möchte ich eine bestehende Kundendatei, die da originellerweise Kunden heißt, aufrufen und über eine ListBox anzeigen lassen.
    Ich hab jetzt schon alles getan was in meiner Macht stand aber ich komm nicht drauf wie der Befehl heißen könnte! Ok, mit Rumpelstilzchen hab ich´s noch nicht versucht aber sonst schon fast alles:-D.
    Wär schön wenn ihr n´bisschen Nachsichtig seid mit mir. Ich mach das noch nicht sehr lang. Danke!
    Wenn es eine Excel-Datei ist, müsste es so gehen (habs nicht getestet):

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. Dim KundenDatei As Workbook, Bereich As Range
    3. Set KundenDatei = Workbooks.Open("C:\Kunden.xlsx")
    4. Set Bereich = KundenDatei.Sheets("Tabelle1").UsedRange
    5. With ListBox1
    6. .Clear
    7. .ColumnCount = Bereich.Columns.Count
    8. For z = 1 To Bereich.Rows.Count
    9. .AddItem
    10. For s = 1 To Bereich.Columns.Count
    11. .List(z - 1, s - 1) = Bereich.Cells(z, s)
    12. Next
    13. Next
    14. End With
    15. End Sub
    Was genau funktioniert denn nicht? Kommt eine Fehlermeldung? Wenn ja, welche und an welcher Stelle? Oder kommt nicht das gewünschte Ergebnis? Oder passiert einfach nichts?

    Ich habs jetzt bei mir (allerdings Excel 2002) probiert und es hat funktioniert. Nach dem Klick auf den Button erscheint der Inhalt der Tabelle in der ListBox.

    Ein weiterer Ansatz wäre, über die RowSource-Eigenschaft der ListBox selbige mit der Tabelle zu verknüpfen. In diesem Fall würden sich alle Änderungen in der ListBox direkt auf die Tabelle auswirken und umgekehrt.

    Funktioniert doch

    Tut mir echt leid! Ich hab den Code noch mal neu geschrieben weil ich nicht wußte was falsch ist. Tatsächlich kam noch mal der Hinweis Laufzeitfehler 1004 aber nicht mehr der Laufzeitfehler 424. Habs schon rausgefunden, man muß halt den ganzen Pfad angeben!
    Aber vielleicht kannst du mir sagen wie ich die List Box jetzt angezeigt bekomme wenn ich zum Beispiel die Zelle H9 anklicke. Es wäre doch wirklich umständlich jedesmal den VBA Editor öffnen zu müssen.
    Vielen Dank für dein Brainstorming! Viellleicht kann ich mich mal erkenntlich zeigen :)
    Um direkt von Excel aus eine UserForm aufzurufen oder sonstige Befehle auszulösen gibt es unzählige Möglichkeiten:

    1) Die einfachste wird, denke ich, sein, ein Makro zu machen, das die UserForm erschienen lässt

    Visual Basic-Quellcode

    1. Sub FormShow()
    2. UserForm1.Show
    3. End Sub


    und für dieses dann in der oberen Symbolleiste (die einzige, die man in Excel 2007 noch bearbeiten kann) einen Button einzufügen.

    2) Dieses Makro kannst du natürlich auch über "Makro ausführen", oder wie die Schaltfläche heißt, auch auswählen.

    3) Eine AutoForm, der du dieses Makro zuweist, kannst du auch machen.

    4) Du kannst auch in der Excel-Tabelle einen Button erstellen, in dessen Click-Event du das Erscheinen der UserForm schreibst:

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. UserForm1.Show
    3. End Sub


    5) Wenn du es durch Klicken auf H9 machen willst, schreibe das in die Code-Ebene der entsprechenden Tabelle:

    Visual Basic-Quellcode

    1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    2. If ActiveCell.Address = "$H$9" Then UserForm1.Show
    3. End Sub


    6) oder wenn man in H9 "Form" schreiben soll, kannst du das machen:

    Visual Basic-Quellcode

    1. Private Sub Worksheet_Change(ByVal Target As Range)
    2. Dim Zelle As Range
    3. For Each Zelle In Target
    4. If Target.Address = "$H$9" And Target.Value = "Form" Then UserForm1.Show
    5. Next
    6. End Sub


    und viele weitere Möglichkeiten mehr...

    Der Fantasie sind da (so gut wie) keine Grenzen gesetzt.


    Im Prinzip kann man jedes Ereignis, das Excel oder auch die Steuerelemente bieten, benutzen, um das Erscheinen der Form auszulösen. Wie gesagt, denke ich, dass mein erster Vorschlag der einfachste ist. Du kannst natürlich auch mehrere Vorschläge parallel anwenden. Diese schließen sich gegenseitig nicht aus.

    Button erstellt

    Hi Roddy!
    Wenn dir meine Fragen zu viel werden sags bitte einfach. Danke!
    Ich hab jetzt mal einen Button in das Excel-Formular eingebracht und die ListBox per UserForm1.Show aufgerufen. Funktioniert prima. Aber wenn ich jetzt in der List Box Command Button1 anklicke um meine Kunden anzeigen zu lassen erscheint auch gleich das ganze Arbeitsblatt was ja so nicht gewollt ist. Also wie krieg ichs hin daß die Kundendaten nur in der Listbox angezeigt werden und um das ganze noch etwas zu erschweren: Ist es möglich die Daten dann aus der Listbox z.B. per Doppelklick auf das Rechnungsformular zu übertragen? P.S. Da ich VBA wirklich auch lernen möchte und nicht nur dauernd fragen will; Wärs möglich dass du erklärst warum du die eine oder andere Zeile schreibst? Vielen Dank für deinen grandiosen Einsatz!!! Werner
    Hier zunächst mein Code mit Kommentaren. Ich hoffe du kannst jetzt die einzelnen Zeilen nachvollziehen:

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. Dim KundenDatei As Workbook, Bereich As Range
    3. 'Man sollte nach Möglichkeit alle Variablen, die man verwendet, deklarieren,
    4. 'damit das Programm "weiß", was es ist und nicht erst aufgrund von Zuweisungen u. Ä.
    5. '"erraten" muss, was es ist.
    6. 'Da fällt mir auf, dass ich z und s nicht deklariert hatte:
    7. Dim z As Long, s As Integer
    8. 'Für z könnte man auch Integer nehmen,
    9. 'jedoch würde dann bei mehr als ca. 32.000 Zeilen ein Überlauf ausgelöst.
    10. 'Wenn du jedoch sicher weißt, dass es nie mehr als 32.000 Zeilen werden,
    11. 'kannst du Integer nehmen.
    12. Set KundenDatei = Workbooks.Open("C:\Kunden.xlsx")
    13. 'Öffnet die Datei und weist die Arbeitsmappe der Variablen KundenDatei zu.
    14. Set Bereich = KundenDatei.Sheets("Tabelle1").UsedRange
    15. 'UsedRange ist der benutzte Bereich einer Tabelle,
    16. 'also der Bereich, in dem Daten stehen.
    17. 'In der ListBox braucht man nur diesen Bereich anzeigen
    18. 'und nicht die ganze Tabelle mit über 1 Mio. Zeilen
    19. 'Daher benutze ich nachfolgend diesen Bereich der Tabelle
    20. 'und weise hier diesen Bereich der Variablen Bereich zu.
    21. With ListBox1
    22. .Clear
    23. 'Löscht den Inhalt der ListBox
    24. .ColumnCount = Bereich.Columns.Count
    25. 'Setzt die Spaltenanzahl der ListBox auf die Anzahl der Spalten im Bereich
    26. 'Bei folgender Schleife werden auf die einzelnen Zeilen (z)
    27. 'und pro Zeile auf die einzelnen Spalten (s) zugegriffen.
    28. 'Der Wert der dieser Zelle mit den Koordinaten (z, s)
    29. 'wird in die ListBox an entsprechender Stelle eingetragen.
    30. 'Da bei der ListBox die erste Zeile/Spalte den Index 0 hat,
    31. 'bei der Excel-Tabelle jedoch 1, schreibe ich .List(z-1,s-1)
    32. 'z und s habe ich ausgewählt, damit es leichter nachzuvollziehen ist.
    33. 'Man hätte auch i und j nehmen können oder beliebig andere.
    34. For z = 1 To Bereich.Rows.Count
    35. .AddItem
    36. 'Fügt eine (leere) Zeile der ListBox hinzu
    37. For s = 1 To Bereich.Columns.Count
    38. .List(z - 1, s - 1) = Bereich.Cells(z, s)
    39. Next
    40. Next
    41. End With
    42. KundenDatei.Close SaveChanges:=False
    43. 'Schließt die Datei "Kunden". Dadurch ist die Datei nur kurz zu sehen,
    44. 'solange die Daten in die ListBox übertragen werden.
    45. 'SaveChanges:=False bedeutet, dass eine eventuelle Frage,
    46. 'ob Änderungen gespeichert werden sollen, ausbleibt und nicht gespeichert wird.
    47. End Sub


    Wie du vielleicht siehst, habe ich am Ende noch einen Befehl hinzugefügt. Sollte das nicht ausreichend sein, sehe ich da vielleicht noch andere Möglichkeiten.


    Was das Abrufen der ListBox-Inhalte betrifft, kannst du das DblClick-Ereignis verwenden:

    Visual Basic-Quellcode

    1. Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    2. Wert1 = ListBox1.Column(1)
    3. 'Der Inhalt der 2. Spalte der Zeile, auf die doppelt geklickt wird,
    4. 'wird der Variablen Wert1 zugewiesen.
    5. End Sub

    Doppel Klick funktioniert aber

    wie krieg ich jetzt z.B. den Nachnamen in Zeile 9, die Strasse in Zeile 10 und Plz und Ort in Zeile 13 kopiert. Kann mans mit If...Then im List Box Code lösen? Oder gehts anders vielleicht besser?! Übrigens vielen Dank für die "Übersetzung". Es bringt echt viel wenn mans Gedanklich nachvollziehen kann warum und wieso. Gruß Werner!
    Wenn deine Zeilen in der gerade aktiven Excel-Tabelle sind, wird es so gehen:

    Visual Basic-Quellcode

    1. Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    2. Range("A9") = ListBox1.Column(0) 'Wenn der Nachname in der 1. Spalte der ListBox ist.
    3. Range("A10") = ListBox1.Column(1) 'Wenn die Straße in der 2. Spalte der ListBox ist.
    4. Range("A13") = ListBox1.Column(2) 'Wenn PLZ und Ort in der 3. Spalte der ListBox ist.
    5. End Sub


    Schau dir mal in der VB-Hilfe die Einträge über "Range" und "Cells" an.

    Ich helfe zwar gerne, aber ich denke, gerade, wenn du gerade dabei bist, es zu lernen, musst auch selbst erst mal ein bisschen nachlesen.

    Das meiste habe ich durch "Try and Error" und Stöbern in der VB-Hilfe gelernt.

    Habs verstanden

    Hi Roddy! Ich hab mich dahintergeklemmt und rausgekriegt wie ich die "Speichern unter" Funktion aufrufe und direkt im Anschluss die beschriebenen Zellen wieder gelöscht werden. Was ich einfach nicht rauskriege ist was ich tun muss wenn ich eine MsgBox erstellen möchte bei der, wenn ich auf Ja Klicke eine Datei "Gangliste" geöffnet wird, die ich dann Bearbeiten kann und wenn ich auf Nein Klicke sich die MsgBox wieder schließt. Ich habs mit folgendem Ansatz versucht:

    Dim Gangliste As Boolean
    Gangliste = True
    MsgBox "Gangliste Öffnen?", vbYesNo
    Click.vbYes = Workbooks.Open("C:\Users\werner\Documents\Gangliste.xlsx")
    Click.vbNo = "Gangliste öffnen?".Close
    End Sub

    Wäre wirklich schön wenn ich noch mal Hilfe bekommen könnte,da ich diese Lösung noch öfter einsetzen möchte.
    Vielen Dank für alles! Werner
    So müsste es funktionieren:

    Visual Basic-Quellcode

    1. If MsgBox("Gangliste Öffnen?", vbYesNo) = vbYes Then
    2. Workbooks.Open "C:\Users\werner\Documents\Gangliste.xlsx"
    3. End If




    Noch ein Tipp: Um herauszufinden, mit welchem VB-Befehl man bestimmte Excel-Vorgänge (z. B. Zeilen löschen, Formeln eingeben u. v. m.) ausführt, kannst du den Vorgang als Makro aufzeichnen und dir dann den VB-Code des Makros anschauen und evtl. in der VB-Hilfe bei den entsprechenden Befehlen nachlesen. Es gibt zwar Fälle, bei denen man den Makro-Code direkt übernehmen kann bzw. leicht abgeändert in sein Programm einbauen kann, man sollte aber, denke ich, versuchen selbst zu programmieren, d. h. zu überlegen, welche Code-Zeilen wirklich notwendig sind und welche weiteren Möglichkeiten mir der Befehl bietet.

    Kleines Beispiel:

    Wenn ich aufzeichne, dass ich in D6 "Test" eintrage, sieht das so aus:

    Visual Basic-Quellcode

    1. Range("D6").Select
    2. ActiveCell.FormulaR1C1 = "Test"


    Dabei kann man genausogut gleich das machen:

    Visual Basic-Quellcode

    1. Range("D6") = "Test"




    Dies soll nur eine kleine Hilfestellung beim "Kennenlernen" von VBA sein.