Einfügen vom Namen des aktuellen Worksheets (Excel)

  • Excel

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

    Einfügen vom Namen des aktuellen Worksheets (Excel)

    Hallo,
    ich bin neu hier, also erstmal ein herzliches Hallo an alle. Ich hoffe ich kann hier noch viel lernen und in Zukunft, wenn ich mich etwas besser auskenne, auch etwas zum Forum beitragen.

    Die Suche nach meinem Problem hat nichts ergeben, vielleicht habe ich auch einfach nach den falschen Stichworten gesucht, das Problem hatten bestimmt schon viele Leute.

    Ich möchte gerne ein Makro für Excel erstellen, welches ich auf verschiedene Dateien und Worksheets (mit unterschiedlichen Namen) anwenden kann. Ich brauche das für die Auswertung von Messdaten. Die Worksheets werden beim abspeichern automatisch benannt, und ich habe jetzt ca. 300 solcher Worksheets.

    Mein Problem ist folgender Befehl, der in der Diagrammerstellung (die ich gerne automatisiert hätte) enthalten ist:

    ActiveChart.SeriesCollection(1).Name = "='04_10___'!$C$2"
    (bzw. ActiveChart.SeriesCollection(1).Values = "='04_10___'!$C$3:$C$38")
    (bzw. ActiveChart.SeriesCollection(1).XValues = "='04_10___'!$A$3:$A$38")

    Meine Frage ist ob ich dem Makro irgendwie klarmachen kann, dass es statt '04_10___' den Namen des aktuell ausgewählten Worksheet einfügt?

    EDIT: Ich benutze Excel 2007 und den integrierten VBA-Debugger (Microsoft Visual for Applications 2007)

    Oddy schrieb:

    den Namen des aktuell ausgewählten Worksheet
    kriegst du in VBA mit ActiveSheet.Name.
    Allerdings bin ich mir nicht sicher, ob es in deinem Fall nicht besser wäre, den Code objektorientiert in das Sheet selbst zu verlagern und dafür ohne ActiveSheet und ActiveChart zu arbeiten.

    Ist das Chart-Objekt ein eigenes Sheet oder ist es Teil des Worksheet?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Das Worksheet selbst ist schon ein Objekt.
    Das kannst du beliebig erweitern mit Methoden und Properties.
    Einfach den Code nicht in ein Modul schreiben, sondern in den Code-Bereich des Worksheets.

    Wenn du so ein Worksheet kopierst, werden die User-Methoden mit kopiert.
    Alles was du da drin adressierst, wird auf sich selbst bezogen.
    Also Name gibt immer den Sheet-Namen des Worksheets, in dem der Code steht.

    Beispiel:

    Visual Basic-Quellcode

    1. ​Charts(1).SeriesCollection(1).Name = "='" & Name & "'!$C$2"

    Noch eleganter ist es natürlich, wenn das Chart selbst einen Namen hat und $C$2 noch ein NamedRange, aber wir wollen ja nicht gleich alle Designschwächen auf einmal lösen ;)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Aha, ich verstehe!
    Dazu wie man ein Worksheet kopiert habe ich auf Google genug gefunden. Das ist dann vielleicht besser, als den Code einmal separat im "Personal" Workbook als Modul abzuspeichern.

    Vielen Dank für die schnelle und anfängerfreundliche Hilfe! Dann mache ich mich jetzt mal ans probieren. :)

    EDIT: Oh man, mit dem Befehl und dem Kommentar den du jetzt noch eingefügt hast komme ich mir vor wie der erste blutige Anfänger (was ich ja auch bin). Aber ich komme schon noch dahinter. ;)

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

    Okay, ich nochmal; habe lange rumprobiert und gegoogelt und ich komme nicht drauf.

    Das Problem bei meinem Code

    VB.NET-Quellcode

    1. ActiveChart.SeriesCollection(1).Name = "='ActiveSheet.Name'!$C$2"

    sind ja die hier: ' '
    Weil er mir dann "ActiveSheet.Name" in die Excel-Funktion eingibt, anstatt den Namen des Aktiven Sheets, wie ich es eigentlich will.

    Ich möchte, dass er mir das am Ende so ausspuckt : ' SheetX '!C2

    So langsam bin ich echt am verzweifeln. Wenn ich Anführungszeichen um die ' mache Also

    VB.NET-Quellcode

    1. ActiveChart.SeriesCollection(1).Name = "= ' "ActiveSheet.Name" ' !$C$2"

    Dann gibt es einen Syntaxfehler.

    Hoffe ihr könnt mir weiterhelfen
    Beste Grüße
    Oddy
    Du verwendest ActiveSheet/ActiveChart.
    Du hast dich also für die Modul-Variante entschieden und nicht für das Worksheet-Objekt.
    Aber auch da sollte man nicht die "Active"-Objekte verwenden, sondern diese namentlich nennen.

    Mit deinem Syntaxfehler:
    Vergleiche deinen Code
    ActiveChart.SeriesCollection(1).Name = "= ' "ActiveSheet.Name" ' !$C$2"
    mit meinem
    Charts(1).SeriesCollection(1).Name = "='" & Name & "'!$C$2"
    und überlege dir, wozu die ​& wohl da sind ;)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ja, ich habe mich für die Modulschreibweise entschieden, weil mir das, wenn es mal funktioniert, Arbeit ersparen sollte. Und weil ich mir Sorgen mache, dass ich beim kopieren wieder neue Fehler erzeuge.

    Ich verstehe nicht ganz warum, wenn ich die Objekte direkt anspreche, denn erzeuge ich wieder neue Fehler (Obwohl ich den Chart vorher mit Parent.Name extra nochmal entsprechend benannt habe). Deswegen bin ich beim uneleganten Active* geblieben. Auch wenn das im Allgemeinen anfälliger für Fehler ist. Der Code funktioniert so immerhin.

    Oh ja, ich sehe, die & sind wichtig. Und jetzt funktioniert es auch fast. Das einzige Problem ist, dass der Befehl nur funktioniert, wenn ich Leerzeichen zwischen jedem Sonderzeichen einfüge, also wenn ich "= ' " & ActiveSheet.Name & " ' !$C$2" schreibe. Allerdings steht dann der Name des Sheets mit zwei Leerzeichen da (eins vorne und eins hinten, z.b. ' 04_10___ ') und somit stimmt der Name nicht mehr.

    Wenn ich den Code so schreibe wie du, "= '" & ActiveSheet.Name & "' !$C$2" (keine Leerzeichen zwischen " und ') dann gibt er mir einen Runtime Error 1004. Das war auch der Grund warum ich die & gestern weggelassen habe, ich dachte das liegt and den &. Wenn ich ein anderes Leerzeichen weglasse, dann bekomme ich wieder den Syntaxfehler.
    Das ist doch irgendwie komisch... Ich verstehe nicht was da los ist.

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

    Ja, ich weiß, es dauert eine Weile, bis man die objektorientierte Denke mal drauf hat.
    Danach fragt man sich, wie man je anders programmieren konnte. ;)
    Aber wichtiger ist, dass du mit deiner Methode klar kommst, deshalb will ich dir jetzt auch nichts aufschwatzen.

    Runtime Error 1004
    Dann hast du sonst noch ein (anderes) Problem.
    Wenn deine Sheet-Namen keine Blanks beinhalten, kannst du es auch mal ohne die Apostrophen versuchen.
    ActiveChart.SeriesCollection(1).Name = "=" & ActiveSheet.Name" & "!$C$2"

    Ich schätze mal, dass der 1004 daher rührt, dass du versuchst, das Objekt ActiveChart zu verwenden.
    Das gibt es aber nicht weil du gerade keines angeklickt hast. ;)
    Ich hatte oben schon erwähnt, dass die Active-Objekte Schrott sind, weil sie von der User-Aktion abhängen und deswegen NIE verwendet werden sollen.

    Adressiere die Objekte über den Namen oder den Index! Oder arbeite objektorientiert :D
    Mit dem Debugger kann man solche Fehler aber doch leicht lokalisieren.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ja, das sollte eigentlich der Fehler sein, aber das komische an der Sache ist ja, dass ich den Fehler nicht bekommen habe, als ich die Leerzeichen wie im vorigen Beitrag erwähnt gesetzt habe.
    Der Fehler tritt auch auf, wenn ich nur die einzelne Zeile ausführe, nachdem ich mich versichert habe, dass das Objekt ausgewählt ist.

    Naja, ich versuche jetzt mal die Objekte direkt anzusprechen, wie es sich gehört. :D Auch wenn ich da schon wieder den nächsten Error habe (Runtime 9). Ich sag bescheid, ob es läuft, wenn ich mich da durchgearbeitet habe. :)
    Die Apostrophen zu löschen bringt leider nix.

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

    Soo, der Code läuft! :))
    Ich weiß aber ehrlich gesagt nicht wieso, auf einmal gings einfach... ?(
    So sieht der funktionierende Code aus (bzw. der Teil, der mir Probleme bereitet hat)

    VB.NET-Quellcode

    1. ActiveSheet.Shapes.AddChart.Select
    2. ActiveChart.Parent.Name = "Chart1"
    3. ActiveChart.ChartType = xlRadar
    4. ActiveSheet.Shapes("Chart1").IncrementLeft 89.75
    5. ActiveSheet.Shapes("Chart1").IncrementTop -200
    6. ActiveChart.SeriesCollection.NewSeries
    7. ActiveChart.SeriesCollection(1).Name = "=""Count of impulses in [1/100ms]"""
    8. ActiveChart.SeriesCollection(1).Values = "='" & ActiveSheet.Name & "'!$C$3:$C$38"
    9. ActiveChart.SeriesCollection(1).XValues = "='" & ActiveSheet.Name & "'!$A$3:$A$38"
    10. ActiveChart.ChartTitle.Select
    11. Selection.Caption = "='" & ActiveSheet.Name & "'!C2"


    danke für die Hilfe!!! :)
    Schön, dass es läuft.
    Wahrscheinlich hätte ich es etwas anders gelöst:

    Visual Basic-Quellcode

    1. Set ws = ActiveSheet 'oder vielleicht sogar besser direkt adressieren: Set ws = Sheets("MySheet")
    2. Set ch = ws.Shapes.AddChart
    3. ch.Parent.Name = "Chart1"
    4. ch.ChartType = xlRadar
    5. ch.IncrementLeft 89.75
    6. ch.IncrementTop -200
    7. Set s = ch.SeriesCollection.NewSeries
    8. s.Name = "=""Count of impulses in [1/100ms]"""
    9. s.Name = "Count of impulses in [1/100ms]" 'müsste auch gehen
    10. s.Values = "='" & ws.Name & "'!$C$3:$C$38"
    11. s.XValues = "='" & ws.Name & "'!$A$3:$A$38"
    12. ch.ChartTitle.Caption = "='" & ws.Name & "'!C2"
    Fehler sind allerdings nicht auszuschliessen, da nicht getestet.
    Aber vom Prinzip dürfte klar sein, dass ich die ganzen "Active"- und "Selection"-Objekte versuche zu vermeiden, damit eventuelle User-Interaktionen nicht stören können.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()