VB-Script und Excel Button
rider
- programmiertechnik
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
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
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
Hello,
InputBox
ThisWorkbook.Worksheets(name).copy position
ThisWorkbook.Worksheets(copy of name).Name = neuer name
MfG
Rouven
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
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
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
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
ThisWorkbook.Worksheets(copy of Haupt).Name = xxx
End Sub
MfG
Rouven
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.
Hello,
InputBox(Propt,[Wie heißt der Traeger?],[Name des Trägers] Dim Traegername As String
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
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
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
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
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
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