Microsoft Excel

Herbers Excel/VBA-Archiv

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

Range - WBK_Sheet_Change - nicht bekannt


Betrifft: Range - WBK_Sheet_Change - nicht bekannt von: STeve
Geschrieben am: 22.06.2017 07:51:49

Schönen guten Morgen.
Steh wieder mal am Schlauch. Wer kann mir bitte helfen.

Über Userform wird ein neues Tabellenblatt Name: (ABC usw.) erstellt.

Dabei werden über Modul:

Modulkopf: (Allg.)(Deklarationen)
Public multibereich1_neu As Range

(Allg.)(ZeilenermittelnundinUnionzusammenfassen_neu)
Public Call ZeilenermittelnundinUnionzusammenfassen_neu
Bereichsnamen vergeben und eben in die Union - multibereich1_neu zusammengefasst - diese Sub dauert 45 Sekunden.

Wenn ich jetzt auf das Blatt (ABC usw.) arbeite sollte ja bei:

(Workbook) (Sheet_Change)
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Left(Sh.Name, 9) = "ABC usw." Then


If Not Intersect(Target, multibereich1_neu) Is Nothing Then
Call........
End If

der Rangebereich multibereich1_neu erkannt werden.

ABER: multibereich1_neu..... ist leer - außerhalb des Kontext -

Wo ist multibereich1_neu - wenn überhaupt - nach Beendigung der Sub (ZeilenermittelnundinUnionzusammenfassen_neu) gespeichert??

mfg STeve

  

Betrifft: AW: Range - WBK_Sheet_Change - nicht bekannt von: Hajo_Zi
Geschrieben am: 22.06.2017 07:56:26

Du hast "multibereich1_neu " mit Public in einem Modul definiert?

GrußformelHomepage


  

Betrifft: AW: Range - WBK_Sheet_Change - nicht bekannt von: STeve
Geschrieben am: 22.06.2017 08:11:34

Hallo Hajo... Danke für die so schnelle Antwort/Frage.

In meiner Hilflosigkeit habe ich:
Public multibereich1_neu As Range...

a.) unter diese Arbeitsmappe (Allg)(Deklarationen)

und

b.) in den Modulkopf (Allg)(Deklarationen)des ...Public Sub ZeilenermittelnundinUnionzusammenfassen_neu

eingefügt.
mfg STeve


  

Betrifft: AW: Range - WBK_Sheet_Change - nicht bekannt von: Hajo_Zi
Geschrieben am: 22.06.2017 08:22:08

das ist falsch, das hatte ich auch nicht vorgeschlagen.
Da mein Vorschlag nicht interessiert bin ich dann raus.

Gruß Hajo


  

Betrifft: AW: Range - WBK_Sheet_Change - nicht bekannt von: STeve
Geschrieben am: 22.06.2017 08:34:15

Hallo Hajo.

Du hast eine Frage gestellt und die habe ich beantwortet - eben dass ich es zweimal eingefügt habe.

Du sagst das ist falsch........ok danke.

Was ist dein Vorschlag??

mfg Steve


  

Betrifft: Range - WBK_Sheet_Change - nicht bekannt von: STeve
Geschrieben am: 22.06.2017 08:44:25

???


  

Betrifft: AW: Range - WBK_Sheet_Change - nicht bekannt von: Mullit
Geschrieben am: 22.06.2017 11:28:05

Hallo,

Du mußt

Public multibereich1_neu As Range

nur einmal in einem Standardmodul deklarieren, nicht noch zusätzlich in der Public Sub ZeilenermittelnundinUnionzusammenfassen_neu ...

Gruß, Mullit


  

Betrifft: AW: Range - WBK_Sheet_Change - nicht bekannt von: STeve
Geschrieben am: 22.06.2017 15:38:49

Hallo Mullit... Bedanke mich vorab schon mal recht herzlich dass du dich meines Problemes angenommen hast.

Habe jetzt die RangeVariable und eben vier weitere:

Public multibereich1_neu As Range
Public multibereich2_neu As Range
Public Rechenzeile_neu As Range
Public JD_Zeile_neu As Range

nur mehr im Kopf des StandardModules

Public Sub ZeilenermittelnundinUnionzusammenfassen_neu ... 

wo die vier großen RangeBereiche erstellt werden.

Lt. Überwachungsfenster sind sie nach Erstellung da. 

Aber nach End Sub
wieder nicht mehr.

mfg
STeve


  

Betrifft: AW: Range - WBK_Sheet_Change - nicht bekannt von: Mullit
Geschrieben am: 22.06.2017 15:47:08

Hallo,

okidoki, also zunächst mal müsste die Deklaration in Deinem Std.-Modul so aussehen:

Option Explicit

Public multibereich1_neu As Range
Public multibereich2_neu As Range
Public Rechenzeile_neu As Range
Public JD_Zeile_neu As Range

Public Sub ZeilenermittelnundinUnionzusammenfassen_neu()
'// hier Dein bisher unbek. Code....
End Sub

Wenn das der Fall ist und immer noch was nicht hinhaut, wirst Du mal den Code der Public Sub ZeilenermittelnundinUnionzusammenfassen_neu zeigen , oder ein Bsp.mappe hochladen müssen....

Gruß, Mullit


  

Betrifft: Merci Mullit - deine Anstoß hat d. Erfolg gebracht von: STeve
Geschrieben am: 22.06.2017 16:18:28

Klasse Mullit.....DANKE !!!

durch deinen Tipp den Code mal hochzuladen ist mir aufgefallen, dass ich im Code nochmal jede RangeVar vor der UnionZusammenfassung mit

Dim multibereich1_neu As Range

eingetragen habe.

Alle vier auskommentiert und schon läuft die Maschine.

Sorry für deine Mühen und mein Unwissen. Hoffe du bleibst im Forum weiter so freundlich für uns ansprechbar.

LG STeve


  

Betrifft: Geht doch nicht :-(((( von: STeve
Geschrieben am: 22.06.2017 16:47:58

Hallo Mullit.

Das Ding läuft mal und mal nicht??????

Kann ich dir den Code hier doch mal einstellen??

LG STeve


  

Betrifft: AW: Geht doch nicht :-(((( von: Mullit
Geschrieben am: 22.06.2017 18:58:06

Hallo Steve,

null Problemo, immer her damit...

Gruß, Mullit


  

Betrifft: AW: Geht doch nicht :-(((( von: STeve
Geschrieben am: 22.06.2017 19:18:37

Hi Mullit......... Super dass du da mal reinschaust.

Option Explicit ganz oben - habe ich rausgenommen weil der dann stehen bleibt bei:

For Each wks In Worksheets - weil er wks nicht kennt?? - Public wks As Range --- geht mal nicht!!

LG STeve


Hier der Code:


Public multibereich1_neu As Range
Public multibereich2_neu As Range
Public Rechenzeile_neu As Range
Public JD_Zeile_neu As Range

Public Sub ZeilenermittelnundinUnionzusammenfassen_neu()


Dim intAuszaehlung As Integer
    intAuszaehlung = Sheets("Mitarbeiterverwaltung").Cells(Rows.Count, 1).End(xlUp).Offset(, 1). _
Value 'zählt die Anz.d.Bea. aus
Dim denletztenBeamtenNamen As Integer
    denletztenBeamtenNamen = Sheets("Zeilenpositionen").Cells(intAuszaehlung, 3).Offset(, -1). _
Value 'zählt die Zeilenpos.d.letzt. Bea. aus

For Each wks In Worksheets
  If Left(wks.Name, 9) = "DPL PI BH" Then

           For intAuszaehlung = 21 To denletztenBeamtenNamen Step 8
                            Cells(intAuszaehlung, 1).Offset(-3, 2).Resize(, 32).Select   ' dann  _
werden offset die PlandienstStartzeilen selektiert

                            With Selection                                               ' es  _
wird ein indiv. BereichName vergeben
                               .Name = "PlanStartZeile_von_" & Cells(intAuszaehlung, 1)
                            
                            End With
            Next intAuszaehlung
            
            For intAuszaehlung = 21 To denletztenBeamtenNamen Step 8
                            Cells(intAuszaehlung, 1).Offset(-1, 2).Resize(, 32).Select   ' dann  _
werden offset die PlandienstEndezeilen selektiert
                            With Selection                                               ' es  _
wird ein indiv. BereichName vergeben
                               .Name = "PlanEndeZeile_von_" & Cells(intAuszaehlung, 1)
                            
                            End With
            Next intAuszaehlung
            
            For intAuszaehlung = 21 To denletztenBeamtenNamen Step 8
                            Cells(intAuszaehlung, 1).Offset(4, 2).Resize(, 32).Select   ' dann  _
werden offset die Rechenzeilen selektiert
                            With Selection                                               ' es  _
wird ein indiv. BereichName vergeben
                               .Name = "Rechenzeile_von_" & Cells(intAuszaehlung, 1)
                            
                            End With
            Next intAuszaehlung
            
            For intAuszaehlung = 21 To denletztenBeamtenNamen Step 8
                            Cells(intAuszaehlung, 1).Offset(-2, 2).Resize(, 32).Select   ' dann  _
werden offset die JD_Zeile selektiert
                            With Selection                                               ' es  _
wird ein indiv. BereichName vergeben
                               .Name = "JD_Zeile_von_" & Cells(intAuszaehlung, 1)
                            
                            End With
            Next intAuszaehlung
                     


Dim namName As Name
    ' Schleife über alle definierten Namen der aktiven Mappe
    For Each namName In ActiveWorkbook.Names
    
       ' wenn der Bezug den Namen des aktiven Tabellenblattes enthält
        If InStr(namName.RefersTo, ActiveSheet.Name) > 0 And Left(namName.Name, 14) = " _
PlanStartZeile" Then
            ' Variable ist noch leer
            If multibereich1_neu Is Nothing Then
                ' der Variablen den Bezugsbereich des laufenden Namen zuweisen
                Set multibereich1_neu = namName.RefersToRange
            ' Variable ist schon gefüllt
            Else
                ' die Variable um den Bezugsbereich des laufenden Namen erweitern
                Set multibereich1_neu = Union(multibereich1_neu, namName.RefersToRange)
            End If
         End If

        
       ' wenn der Bezug den Namen des aktiven Tabellenblattes enthält
        If InStr(namName.RefersTo, ActiveSheet.Name) > 0 And Left(namName.Name, 13) = " _
PlanEndeZeile" Then
            ' Variable ist noch leer
            If multibereich2_neu Is Nothing Then
                ' der Variablen den Bezugsbereich des laufenden Namen zuweisen
                Set multibereich2_neu = namName.RefersToRange
            ' Variable ist schon gefüllt
            Else
                ' die Variable um den Bezugsbereich des laufenden Namen erweitern
                Set multibereich2_neu = Union(multibereich2_neu, namName.RefersToRange)
            End If
                
        End If
                
        
       ' wenn der Bezug den Namen des aktiven Tabellenblattes enthält
        If InStr(namName.RefersTo, ActiveSheet.Name) > 0 And Left(namName.Name, 11) = " _
Rechenzeile" Then
            ' Variable ist noch leer
            If Rechenzeile_neu Is Nothing Then
                ' der Variablen den Bezugsbereich des laufenden Namen zuweisen
                Set Rechenzeile_neu = namName.RefersToRange
            ' Variable ist schon gefüllt
            Else
                ' die Variable um den Bezugsbereich des laufenden Namen erweitern
                Set Rechenzeile_neu = Union(Rechenzeile_neu, namName.RefersToRange)
            End If
                
        End If
        
        
       ' wenn der Bezug den Namen des aktiven Tabellenblattes enthält
        If InStr(namName.RefersTo, ActiveSheet.Name) > 0 And Left(namName.Name, 8) = "JD_Zeile"  _
Then
            ' Variable ist noch leer
            If JD_Zeile_neu Is Nothing Then
                ' der Variablen den Bezugsbereich des laufenden Namen zuweisen
                Set JD_Zeile_neu = namName.RefersToRange
            ' Variable ist schon gefüllt
            Else
                ' die Variable um den Bezugsbereich des laufenden Namen erweitern
                Set JD_Zeile_neu = Union(JD_Zeile_neu, namName.RefersToRange)
            End If
        End If
        

Next namName
End If

Next wks

End Sub



  

Betrifft: AW: Geht doch nicht :-(((( von: Mullit
Geschrieben am: 22.06.2017 19:41:54

Hallo,

Option Explicit bleibt schön stehen, stattdessen deklarierst Du die Variable besser richtig in Deiner Proc, Variablendeklarationen gehören dabei immer an den Anfang einer Prozedur:

Public Sub ZeilenermittelnundinUnionzusammenfassen_neu()
Dim wksSheet As Worksheet
Dim namName As Name
'...
End Sub

Gruß, Mullit


  

Betrifft: ....noch was zur Info. von: STeve
Geschrieben am: 22.06.2017 20:51:48

Hallo Mullit.
Ok Danke........ habe ich so eingearbeitet.

Was mir jetzt aufgefallen ist :
wenn ich das Blatt "DPL PI BH" neu erstelle (über die Userform)
und die Ranges zugeordnet sind, dann funktioniert das Sheet_Change Ereignis und er kennt die RangeVariablen.

Aber wenn ich die Datei schließe und wieder öffne geht es nicht mehr. Vielleicht hilft dir das weiter.

In Erwartung dass du den/die Fehler findest verbleibe ich mfg und glg
STeve


  

Betrifft: AW: ....noch was zur Info. von: Mullit
Geschrieben am: 22.06.2017 23:51:10

Hallo Steve,

Aber wenn ich die Datei schließe und wieder öffne geht es nicht mehr. Vielleicht hilft dir das weiter.

allerdings, das hilft weiter, Variablen aller Art auch statische und globale, verlieren ihre Werte, wenn die Datei geschlossen wird, Du mußt sie nach dem Neuöffnen erneut einlesen...

Gruß, Mullit


  

Betrifft: DANKE an Mullit.....thats it von: Steve
Geschrieben am: 23.06.2017 08:56:36

Guten Morgen Mullit...........DANKE für deine nächtlichen Mühen. Dann ist mir einiges klarer.

Fazit:
Wenn die Rangebereiche also nicht direkt im Change oder Sheet_Change - Ereignis definiert sind (sondern in einem anderen Modul - weil sie eben ca. 45 Sekunden brauchen bis sie initialisiert sind)............dann muss man das beim Öffnen der Datei jedesmal neu einlesen.:-((((

Das wird die Benutzer der Datei nicht freuen.

Wünsche dir noch einen tollen Freitag und schönes WE.
mfg STeve