Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Namen definiert- in Ereignis verwenden?

Betrifft: Namen definiert- in Ereignis verwenden? von: Webran
Geschrieben am: 06.07.2008 16:52:53

Hallo zusammen,
ich verstehe die ganzen Beiträge zu "Namen definieren" nicht und hoffe, dass mir jemand speziell für mein Problem helfen kann. Ich kann leider keine Arbeitsmappe hochladen, sorry, ist alles zu komplex für mich.

In meinem Tabellenblatt habe ich eine ganze Menge Bereiche (B10:B20,D10:D20,F10:F20.......insgesamt 144 Stück), auf die mehrere Ereignisse reagieren sollen.
Diese Bereiche habe ich unter dem Namen "Eingabebereich" unter "Einfügen", "Namen definieren" festgelegt (in der Benutzeroberfläche).

Beispiel:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

'Muss ich meinen Namen "Eingabebereich" vorher einführen? Wenn ja, wie?

Application.CommandBars("cell").Enabled = False
If Selection.Count < 1 Then Exit Sub

        If Not Application.Intersect(Target, Range("  Eingabebereich   ") Is Nothing  _
Then

             Call Mach_Mittagessen
        End If
End Sub



Außerdem noch ein anderes Ereignis (Change), das ähnlich aussieht. Dafür muss ich diese Bereiche auch verwenden.
Soweit ich weiß, kann man nicht unbegrenzt Bereiche angeben, zumindest bei mir bekomme ich bei knapp 100 Bereichen ein Fehlermeldung.

Würde mich über eine Antwort freuen.

Viele Grüße

Webran

  

Betrifft: AW: Namen definiert- in Ereignis verwenden? von: Chris
Geschrieben am: 06.07.2008 19:43:42

Servus Webran,

das Problem ist, dass VBA deine Bereiche nicht kennt:

Bsp.: Du hast in Tabelle1 den Bereich Test = Tabelle1!$A:$A, dann weiß eben VBA nicht, dass wenn du jetzt Test im Makro (Test ist eben eine Variable) schreibst, dass dieser Bereich gemeint ist.

Du kannst natürlich für deine 144 Namen alle Bereiche abfragen und diese dann in eine Union schreiben, das ist aber ziemlich umständlich, da auch die Bereichsschreibweise nicht direkt kompatibel ist.

Mach dir lieber die Arbeit und schreibs so:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect (Target, Union(Range("B10:B20"),Range("D10:D20"),...)) is Nothing Then
... us.w.

Gruß

Chris


  

Betrifft: AW: Nun gut... von: Chris
Geschrieben am: 06.07.2008 21:21:06

Servus Webran,

...hier mal eine Möglichkeit alle Bereiche auszulesen und dann entsprechend als Range in einem Ws_Change-Ereignis zu übergeben (Bsp. Tabelle1):

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Wkb As Workbook
Set Wkb = ThisWorkbook
Dim RangeBereich As Range
Dim Bereich As Name, zähler As Long
Dim Wks As Worksheet
Dim strName As String, strRange As String, strRange0 As String, strRange1 As String
Set Wks = Worksheets("Tabelle2")
zähler = 0
For Each Bereich In Wkb.Names
   strName = Bereich.Name
   strRange0 = Mid(Bereich, 2, Len(Bereich))
   strRange1 = Left(strRange0, InStr(strRange0, "!") - 1)
   strRange = Right(strRange0, Len(strRange0) - InStr(strRange0, "!"))
   If strRange1 = Wks.Name Then
      zähler = zähler + 1
    If zähler = 1 Then
       Set RangeBereich = Range(strRange)
    Else
       Set RangeBereich = Union(RangeBereich, Range(strRange))
    End If
   End If
Next Bereich
If Not Intersect(Target, RangeBereich) Is Nothing Then
   MsgBox "Hallo WS"
End If
End Sub



Gruß

Chris


  

Betrifft: AW: Sorry, natürlich Tabelle2...owT von: Chris
Geschrieben am: 06.07.2008 21:31:13

.


  

Betrifft: AW: Sorry, natürlich Tabelle2...owT von: Webran
Geschrieben am: 07.07.2008 06:09:42

Hallo Chris,
vielen Dank für Deinen Code, den werde ich gleich mal testen.

Ich dachte nicht, dass das so schwierig wäre, na ja, wieder was dazu gelernt.

Danke, noch mal!

Viele Grüße

Webran


  

Betrifft: AW: Sorry, natürlich Tabelle2...owT von: Erich G.
Geschrieben am: 07.07.2008 07:17:50

Hallo Vorname(?),
das sollte es auch schon tun:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim objNam As Name

   For Each objNam In ThisWorkbook.Names
      If Left(objNam.RefersTo, Len(Me.Name) + 2) = "=" & Me.Name & "!" Then
         If Not Intersect(Target, Range(objNam.Name)) Is Nothing Then
            MsgBox "Hallo WS"
         End If
      End If
   Next objNam
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort


  

Betrifft: AW: Sorry, natürlich Tabelle2...owT von: Webran
Geschrieben am: 07.07.2008 07:27:41

Hallo Erich,
danke, für Deine Idee, das werde ich auch mal testen.

Der Code von Chris funktioniert auch, ich muss nur noch an der Schnelligkeit arbeiten.

Toll, das es dieses Forum (und seine Mitglieder) gibt!

Viele Grüße

Webran


 

Beiträge aus den Excel-Beispielen zum Thema "Namen definiert- in Ereignis verwenden?"