Microsoft Excel

Herbers Excel/VBA-Archiv

Call Aufruf führt zu Fehler | Herbers Excel-Forum


Betrifft: Call Aufruf führt zu Fehler von: Peter Mayer
Geschrieben am: 24.01.2012 15:48:52

Hallo alle zusammen,

leider kann ich meinem vorhergehendem Beitrag nichts mehr hinzufügen, deshalb jetzt der neue Beitrag!

Im Beitrag Highlighten von mehreren Zellen habe ich einen Code gepostet, welcher es mir erlaubt, mehrere Zellen in einer Zeile mittels Shape hervorzuheben. Das funktioniert soweit auch ganz gut.

Erstellt habe ich den Code in einer Tabelle, damit er jetzt auch anderen Tabellen zugänglich ist, habe ich ihn in ein Modul (Marker) ausgelagert und rufe diesen jetzt durch folgenden Befehl auf:

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

On Error Resume Next
Dim shp As Shape

If Not Intersect(Target, ActiveSheet.Range("F15:z48")) Is Nothing Then
Call Marker

Else

For Each shp In ActiveSheet.Shapes
If shp.Name = "marker" Then
ActiveSheet.Shapes("marker").Delete
Else
End If
Next shp

End If

End Sub

Doch leider kommt es nun bei der Ausführung zu einem eigenartigen Verhalten:

  • in der Tabelle, in welcher ursprünglich der Code entstand: Klicke ich in den ausgwählten Bereich funktioniert alles einwandfrei

  • alle anderen Tabellen: Bei Klick in den ausgwählten Bereich kommt die Fehlermeldung:
    Laufzeitfehler 1004:  Der angegebene Wert ist außerhalb des zulässigen Bereichs
    Klicke ich hier auf Debuggen, wird folgende Zeile des Highlight-Codes markeirt:

    With ActiveSheet.Shapes.AddShape(msoShapeRectangle, 10, 20, 10, 10)



  • Vermutlich handelt es sich nur um eine Kleinigkeit, aber ich komm einfach nicht drauf!

    Könnt Ihr mir eventuell bei diesem Problem helfen?

    Danke schon mal im Voraus!
    Viele Grüße

    Peter

      

    Betrifft: Versuch ... von: Matthias L
    Geschrieben am: 24.01.2012 16:25:02

    Hallo Peter

    Vielleicht als Ansatz, die Vorgeschichte kenne ich nicht.
    Da Du mit With ActiveSheet ... arbeitest müsste ja noch mehr Code vorhanden sein.
    Darum bitte also auch nur als Ansatz verstehen!


    Code in Diese Arbeitsmappe

    Option Explicit
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Dim myDocument As Worksheet
    Set myDocument = ActiveSheet
    On Error Resume Next
    Dim shp As Shape
      If Not Intersect(Target, myDocument.Range("F15:z48")) Is Nothing Then
         myDocument.Shapes.AddShape msoShapeRectangle, 10, 20, 10, 10
      Else
         For Each shp In myDocument.Shapes
             If shp.Name = "marker" Then
                myDocument.Shapes("marker").Delete
             Else
             End If
         Next
      End If
      Set myDocument = Nothing
    End Sub
    Gruß Matthias


      

    Betrifft: AW: Versuch ... von: Peter Mayer
    Geschrieben am: 24.01.2012 16:35:47

    Hallo Matthias,

    danke für deinen Vorschlag!

    Wenn ich den vor dir vorgeschlagenen Code richtig lese, dann erzeugst dieser ein Shape-Objekt, wenn der Shape-Name nicht existiert. Dies geschieht allerdings falls kein Rechteck vorhanden ist, bereits im Modul "Marker". Der von mir gepostete Code soll einzig und alleine das Modul "Marker" aufrufen. Doch leider kommt es bei der Ausführung dieses Moduls zu einem Fehler im Modul, der in allen Tabellen auftritt außer in der ursprünglichen!
    Ich vermute, dass ich irgend einen Bezug auf die erste Tabelle produziert habe, der das Problem verursacht und den ich jetzt nicht mehr finde!

    VG Peter


      

    Betrifft: Das hast du doch aus dem Bsp von Sepp, ... von: Luc:-?
    Geschrieben am: 24.01.2012 16:52:00

    …Peter!
    Warum nur löschst du das ZeigeObjekt erst und fügst es dann wieder hinzu? Das kann man doch viel eleganter über die Eigenschaft .Visible lösen! Ich mache das in vglbaren Fällen immer so; mehr noch, meine Objekte stehen alle unsichtbar auf einem Blatt. Werden sie in dem benötigt, wdn sie an die entsprd Position, anschld wieder zurück verschoben. Bei Anzeige in anderen Blättern wdn sie im 1. kopiert, im anderen eingefügt und bei Nicht-Bedarf wieder gelöscht. In deinem Fall würde ich aber empfehlen, 1 „Marker” auf jeder Seite permanent zu stationieren. Er könnte ruhig weiter nur Marker heißen, denn es handelt sich ja stets um ein anderes Blatt bei ActiveSheet.Shapes("marker"). Übrigens, wenn du bspw aSh As Worksheet deklarierst und ihm dann mit Set ash = ActiveSheet das aktBlatt zuweist, hast du für ash auch die volle VBE-Intellisense-Unterstützung! Am ProzEnde dann Set ash = Nothing, weil der Speicherplatz für Objekt-Variablen sonst angebl nicht freigegeben wird (das geschieht bei For Each-Objekt-Laufvariablen automatisch, wenn der Zyklus nicht vorzeitig verlassen wird).
    Übrigens ist dein alter Beitrag noch keine 7 Tage alt. Du hättest also auch dort antworten können, wenn du nicht das Forum verlassen hättest, denn Deine Beiträge führt nur noch ins Archiv (um Missbrauch zu vermeiden!). Benutze <<Forumsliste und trage zuvor deinen unikaten Nickname (unter dem du postest) in das Feld davor (bzw darüber) ein. So bleibst du im Forum.
    Gruß Luc :-?


      

    Betrifft: AW: Das hast du doch aus dem Bsp von Sepp, ... von: Peter Mayer
    Geschrieben am: 24.01.2012 17:46:32

    Servus Luc,

    danke für den Hinweis bezüglich des Beantwortens der Beiträge. Das wusste ich bisher nicht!

    Ja richtig, mein Code basiert auf dem Code von Sepp! Hab mich dafür auch brav bedankt! :-)

    Zu deinen Anmerkungen:

    Ich habe inzwischen das Problem ausfindig gemacht. Das Problem lag nur mittelbar am Code. Der Aufruf funktioniert demnach bei allen Tabellen.

    Das Problem war wie vermutet eine Unachtsamkeit! Die anderen Tabellen waren geschützt und damit konnte VBA kein Shape Objekt einfügen. Deshalb werde ich auf deinen Vorschlag eingehen und auf jeden Tabellenblatt ein Shape Objekt platzieren und verstecken.

    Danke für die Hilfe

    Peter


      

    Betrifft: Dachte ich mir! Bitte sehr, gern! Gruß owT von: Luc:-?
    Geschrieben am: 24.01.2012 20:08:19

    :-?


    Beiträge aus den Excel-Beispielen zum Thema "Call Aufruf führt zu Fehler"