rider: VB-Script und Excel Button

Moins!
Habe da mal ne recht komplexe Frage an euch.

Hab mir in Excel ne Tabelle erstellt. Aber nun fehlt mir noch eine
Abfrage um den Spass komplett zu machen.

Es soll auf meinem Starttabellenblatt ein Button stehen. Wenn man auf diesen klickt
soll eine Abfrage erscheinen in der man einen Namen eintippen kann.
Dieser dort verwendete Name soll dann der Name eines Tabellenblattes werden das im gleichen Schritt
auch von einem schon vorhandenen kopiert wird (da ist ne komplexe Tabelle drin).

Kann mir da jemand helfen?

MfG

  1. Hello,

    Kann mir da jemand helfen?

    ich fang einfach mal an...
    InputBox zur Eingabe des Namens
    copy-Methode (-> siehe Worksheet) um ein Worksheet-Objekt zu kopieren.
    Worksheet-Objekt (Referenz mit allen Methoden und Eigenschaften, für dich insbesondere Name um dem Blatt hinterher den neuen Namen zu verpassen)
    Workbook-Objekt um überhaupt erstmal an das Worksheet heranzukommen.

    Schematisch also etwas so

    Sub Button_Click(...)
       InputBox
       ThisWorkbook.Worksheets(name).copy position
       ThisWorkbook.Worksheets(copy of name).Name = neuer name
    End Sub

    MfG
    Rouven

    --
    -------------------
    Unser Problem ist, dass wir eine Demokratie entwickelt haben, was nicht immer der richtige Weg ist  --  Bernie Ecclestone zu den lästigen Diskussionen um Regeländerungen in der Formel 1
    1. Ok ok, danke für die Hilfe. Aber ich gebe zu, ich habe echt kein Plan wie ich dat jetzt machen muss.

      Ich füge einfach via VBS folgendes für meinen Button ein , richtig :

      Sub Button_Click(...)
      InputBox
      ThisWorkbook.Worksheets(name).copy position
      ThisWorkbook.Worksheets(copy of name).Name = neuer name

      Was muss ich an dem Text noch verändern damit es richtig funkioniert? Weil noch haut das nicht so richtig hin. Bin da auch kein wirklicher Experte auf dem Gebiet.

      Danke im Vorraus,

      mfg

      1. Hello,

        InputBox

        1. Parameter wie Titel, Beschreibung, Defaultwert
        2. Rückgabewert in eine Stringvariable legen

        ThisWorkbook.Worksheets(name).copy position

        1. name durch den Namen des zu kopierenden Blatts ersetzen
        2. position befüllen, in der MSDN oder auch per Google finden sich Beispiele, wie man das ganz hinten einfügt

        ThisWorkbook.Worksheets(copy of name).Name = neuer name

        1. gucken mit welchem Namen das Worksheet automatisch angelegt wird, oder ob man bei Copy den Namen angeben kann. Falls letzteres, dann dort direkt die Stringvariable einsetzen, falls nicht, dann bei copy of namen den von Excel vergebenenen Namen eintragen und bei = neuer name = {deine Stringvariable} eintragen.

        MfG
        Rouven

        --
        -------------------
        Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
        1. Ich merk schon, du kennst dich echt aus!
          Aber ich checks irgendwie echt nicht. Kann ich dir die Tabelle vllt mal schicken und du fügst dat ein? Wär echt klasse.
          Ich komme nämlich irgendwie echt nicht weiter.

          mfg

          1. Hello,

            Aber ich checks irgendwie echt nicht. Kann ich dir die Tabelle vllt mal schicken und du fügst dat ein? Wär echt klasse.

            nein! Erstens hat das Forum nichts davon, wenn ich das tue, und zweitens hast du nichts davon, wenn du das tust (zumindest hast du nichts gelernt).
            Bitte poste die relevanten Informationen über dein Excel-Sheet und deinen aktuellen Code, dann kann man dir beim Ergänzen helfen.

            MfG
            Rouven

            --
            -------------------
            Ambition is the last refuge of failure.  --  Oscar Wilde (Irish Poet, Novelist, Dramatist and Critic, 1854-1900)
            1. Mhh, ok. Da hast du nicht ganz unrecht.

              Also ich hab jetzt zwei Tabellenblätter angelegt. Das eine heist "Haupt" und das andere "Auswertung". Das Blatt "Haupt" soll kopiert bzw. neu betitelt werden.

              Auf dem Button liegt jetzt folgender Text:

              Sub CommandButton1_Click()
                 InputBox
                 ThisWorkbook.Worksheets(Haupt).Copy Position
                 ThisWorkbook.Worksheets(copy of Haupt).Name = xxx
              End Sub

              Besonders bei dem "xxx" weis ich nicht was ich eintragen soll. Immerhin wird ja die Kopie immer mit nem neuen Name versehen. Sonst hätt ich ja 100mal ein Tabellenblatt mit dem gleichen Namen. Dat macht ja kein Sinn.

              mfg

              1. Hello,

                Sub CommandButton1_Click()

                OK

                InputBox

                bitte die Parameter nachschlagen, hatte ich verlinkt, dann
                Dim neuerName As String
                neuerName = InputBox(...)

                ThisWorkbook.Worksheets(Haupt).Copy Position

                • Der Name ist keine Variable, sondern muss in Anführungszeichen stehen: ("Haupt")
                • Weiterhin hättest du folgendes Beispiel auf der verlinkten Seite gefunden:
                  Copy method as it applies to the Chart, Charts, Sheets, Worksheet, and Worksheets objects.Copy method as it applies to the Chart, Charts, Sheets, Worksheet, and Worksheets objects.
                  This example copies Sheet1, placing the copy after Sheet3.
                  Worksheets("Sheet1").Copy After:=Worksheets("Sheet3")

                ThisWorkbook.Worksheets(copy of Haupt).Name = xxx

                • copy of haupt ist ungültige Syntax. Setzes es in Anführungszeichen ("Copy of Haupt") - das wird bei deutschen Excel-Versionen allerdings u.U. ein Problem (-> nachgucken)
                • xxx ersetzt du durch die Variable von oben (neuerName)

                End Sub

                MfG
                Rouven

                --
                -------------------
                Computer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice. Like drawing, it can be shaped to a variety of ends: commercial, artistic, and pure entertainment. Programmers have a well-deserved reputation for working long hours but are rarely credited with being driven by creative fevers. Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see. -- Larry OBrien and Bruce Eckel in Thinking in C#
                1. Hi!

                  Also ich denke wir kommen der Sache näher:

                  Sub CommandButton1_Click()
                     InputBox(Propt,[Wie heißt der Traeger?],[Name des Trägers] Dim Traegername As String
                     Traegername = InputBox()

                  ThisWorkbook.Worksheets("Haupt").Copy Position
                     ThisWorkbook.Worksheets("copy of Haupt").name = Traegername
                  End Sub

                  -------------------------------------------------------------

                  Bei dem "ThisWorkbook.Worksheets("Haupt").Copy Position" bin ich mir immer noch unsicher ob da noch was dran kommt. Die verlinkte Seite is ja leider in Englisch ^^.

                  Danke erstmal für deine Hilfe.

                  1. Hello,

                    InputBox(Propt,[Wie heißt der Traeger?],[Name des Trägers] Dim Traegername As String

                    • [ und ] müssen durch Anführungszeichen " ersetzt werden
                    • du schmeißt die Eingabe in den Müll...

                    Traegername = InputBox()

                    hier würdest du eine Eingabe auf die Variable ablegen, aber leider hat die InputBox keine Parameter!

                    Bei dem "ThisWorkbook.Worksheets("Haupt").Copy Position" bin ich mir immer noch unsicher ob da noch was dran kommt. Die verlinkte Seite is ja leider in Englisch ^^.

                    ja, weil Position unbekannt ist. Du müsstest schon eine Position angeben, und das Beispiel, was ich zuletzte gepostet hatte, müsstest du auch mit geringen Englischkenntnissen verstehen.

                    MfG
                    Rouven

                    --
                    -------------------
                    Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
                    1. Wie wärd damit?

                      Sub CommandButton1_Click()
                         InputBox (Propt,"Wie heißt der Traeger?","Name des Trägers" dim Traegername As String
                         Traegername = InputBox("Wie heißt der Traeger?")

                      ThisWorkbook.Worksheets("Haupt").Copy Position Worksheets("Sheet1").Copy After:=Worksheets("Sheet3")
                         ThisWorkbook.Worksheets("copy of Haupt").name = Traegername
                      End Sub

                      Beim ersten Punkt meckert der allerdings immer bei dem "dim" rum.

                      MfG

                      1. Hi,

                        das sieht ja nicht schlecht aus, nur ist etwas zuviel enthalten:

                        InputBox (Propt,"Wie heißt der Traeger?","Name des Trägers" dim Traegername As String

                        Dass er an dem "Dim" meckert, ist normal. Ich empfehle Dir, Dich auch mal mit der Hilfe zu beschäftigen: Klicke in das Wort "Dim" und drücke dann F1. Dann siehst Du auch, wozu es da ist und wo es stehen muss.

                        Der Rest vor dem "Dim" ist wahrscheinlich noch ein Überbleibsel von Deinen vorherigen Versuchen - das kann restlos weg, denn die Inputbox kommt ja hier:

                        Traegername = InputBox("Wie heißt der Traeger?")

                        Das ist richtig, wenn es auch etwas mehr sein könnte. Schreibe mal die Zeile bis zur Klammer auf:

                        Traegername = InputBox(

                        Dann erscheint automatisch ein kleiner Tooltipp, was in den Klammern geschrieben werden kann (durch Komma getrennt). Aber, wie geschrieben, es geht auch so, wie Du es jetzt hast.

                        Hier ist wieder etwas zuviel:

                        ThisWorkbook.Worksheets("Haupt").Copy Position Worksheets("Sheet1").Copy After:=Worksheets("Sheet3")

                        Die Syntax lautet:

                        Objekt.Copy After:=Objekt

                        Das "Copy" kommt bei Dir zweifach vor, das Wort "Position" ist überflüssig, weil es mit "After:=" ja schon ausgedrückt wird. Und dann solltest Du Dich festlegen, was kopiert werden soll: "Haupt" oder "Sheet1"?

                        ThisWorkbook.Worksheets("copy of Haupt").name = Traegername

                        Das ist richtig (wenn der Name "copy of Haupt" stimmt), aber ich würde das etwas einfacher machen, als es Rouven vorgeschlagen hat. Wenn das Blatt kopiert ist, ist es automatisch das aktive Blatt. Deswegen muss man da nicht den Namen der Kopie eintragen, sondern es geht auch:

                        ActiveSheet.Name = Traegername

                        Also: Du brauchst nur ein paar Sachen zu löschen und eventuell die letzte Zeile zu korrigieren - dann funktioniert es auch. Aber sieh Dir auch mal die Hilfe an (Cursor in das Wort und F1), da sind auch ein paar schöne Beispiele enthalten. In VBA finde ich die Hilfe ausnahmsweise mal wirklich gut gemacht.

                        Viele Grüße
                        Jörg

                        1. Danke auch dir für die gute Hilfe.
                          Ich muss demnächst wirklich mal in VBS reinlesen. Kann man so geile Sachen machen und ich hab nicht so richtig Plan davon. Naja.

                          Die Tabelle wollt ich nur für ne Firma machen in der ich zur Zeit mein Praktikum mache. Deshalb sollte alles fix fix gehen. Wollte erst alles über Makros laufen lassen, nur das wird wohl nix.

                          Also hier nochmal bei Syntax:

                          Sub CommandButton1_Click()
                             Dim Traegername As String
                             Traegername = InputBox("Wie heißt der Traeger?")

                          ThisWorkbook.Worksheets("Haupt").Copy Worksheets("Haupt") After:=Worksheets("Sheet3")
                             ActiveSheet.name = Traegername
                          End Sub

                          Bei der vorletzen Zeil meckert er jetzt noch rum. Hab "Position" rausgenommen und das zwei "Copy" gelöscht. Ist sicher nochn kleiner Fehler drinne. Falls dat irgendwann funktioniert mach ich glaub ich Luftsprünge :)

                          mfg

                          1. Hello,

                            ThisWorkbook.Worksheets("Haupt").Copy Worksheets("Haupt") After:=Worksheets("Sheet3")

                            lass mal das Worksheets("Haupt") weg, du möchtest als Parameter nur das After:= haben. Dafür bin ich relativ sicher, dass du in deiner Mappe kein "Sheet3" 3 hast, also solltest du dort den Namen des Blattes einsetzen, hinter das die Kopie soll.

                            MfG
                            Rouven

                            --
                            -------------------
                            Vegetarier essen meinem Essen das Essen weg.
                          2. Hi,

                            das sieht doch schon mal gut aus.

                            Danke auch dir für die gute Hilfe.
                            Ich muss demnächst wirklich mal in VBS reinlesen. Kann man so geile Sachen machen und ich hab nicht so richtig Plan davon. Naja.

                            Ja, damit kann man schon feine Sachen machen, vor allem sich viel Zeit sparen. ;-)

                            Sub CommandButton1_Click()
                               Dim Traegername As String
                               Traegername = InputBox("Wie heißt der Traeger?")

                            Bis hierher ist es richtig, und hier meckert er zu Recht:

                            ThisWorkbook.Worksheets("Haupt").Copy Worksheets("Haupt") After:=Worksheets("Sheet3")

                            Du hast zwar das zweite Copy gelöscht, aber nicht das, was dazugehörte. Etwas ist noch doppelt. ;-)

                            Das stimmt wieder:

                            ActiveSheet.name = Traegername
                            End Sub

                            Bei der vorletzen Zeil meckert er jetzt noch rum. Hab "Position" rausgenommen und das zwei "Copy" gelöscht. Ist sicher nochn kleiner Fehler drinne. Falls dat irgendwann funktioniert mach ich glaub ich Luftsprünge :)

                            Naja, wenn der Code läuft, ist er aber noch nicht fertig. Normalerweise müssen da noch Prüfungen rein, zum Beispiel ob schon eiin Blatt mit dem Namen vorhanden ist, ob es das Blatt Haupt überhaupt gibt, usw.

                            Kannst Dir ja mal den Code ansehen:

                            Sub CommandButton1_Click()  
                            Dim Traegername As String  
                            Dim objBlatt As Object  
                            Dim strQuellBlatt As String  
                              
                            strQuellBlatt = "Haupt"  
                              
                            'Prüfen, ob das zu kopierende Blatt vorhanden ist  
                            On Error GoTo FEHLER  
                            Set objBlatt = ThisWorkbook.Sheets(strQuellBlatt)  
                            On Error GoTo 0  
                              
                            'Blattnamen erfragen:  
                            Traegername = Application.InputBox("Wie heißt der Traeger?", "Name", Traegername)  
                              
                            'Prüfen, ob eine Eingabe erfolgte, wenn nicht, abbrechen:  
                            If Traegername = "" Then Exit Sub  
                              
                            'Prüfen, ob der Name zu lang ist:  
                            If Len(Traegername) > 31 Then  
                                MsgBox "Der Name ist zu lang, er darf nicht mehr als 31 Zeichen enthalten.", vbOKOnly + vbExclamation, "Schwerer Ausnahmefehler"  
                                Exit Sub  
                            End If  
                              
                            'Prüfen, ob ein ungültiges Zeichen enthalten ist:  
                            If Traegername Like "*[:\/?*[]*" Or Traegername Like "*]*" Then  
                                MsgBox "Im Namen ist ein ungültiges Zeichen enthalten.", vbOKOnly + vbExclamation, "Computerabsturz"  
                                Exit Sub  
                            End If  
                              
                            'Prüfen, ob ein Blatt mit dem eingegebenen Namen bereits exisitiert:  
                            'Jedes Blatt der Mappe prüfen:  
                            For Each objBlatt In ThisWorkbook.Sheets  
                                'Wenn das gerade geprüfte Blatt den eingegebenen Namen hat:  
                                If objBlatt.Name = Traegername Then  
                                    'Meldung bringen:  
                                    MsgBox "Ein Blatt mit diesem Namen existiert bereits.", vbOKOnly + vbExclamation, "Allgemeine Schutzverletzung"  
                                    'Routine verlassen:  
                                    Exit Sub  
                                End If  
                            Next  
                              
                            'Blatt "Haupt" hinter das Blatt "Sheet3" kopieren:  
                            ThisWorkbook.Worksheets(strQuellBlatt).Copy After:=ThisWorkbook.Worksheets("Sheet3")  
                              
                            'Das neue Blatt mit dem Namen versehen:  
                            ActiveSheet.Name = Traegername  
                              
                            'Geschafft.  
                            Set objBlatt = Nothing  
                            Exit Sub  
                              
                            FEHLER:  
                            MsgBox "Fehler: Das zu kopierende Blatt " & strQuellBlatt & " existiert nicht.", vbOKOnly + vbCritical, "Schwerer Verlust"  
                            End Sub
                            

                            Viele Grüße

                            Jörg

    2. Hi,

      InputBox zur Eingabe des Namens

      ;-)

      Viele Grüße

      Jörg