Code ohne select/selection
#1
Hallo!
In meinen Projekt habe ich viele UF's Module und KlassenModule. Am anfang war ich froh über jeden select.
Damit man den Code nachvollziehen kann, jetzt nervt es.
Manche von Euch kenn das Projekt ja schon da ich es öfters schon angehagen habe.
Ich suche jetzt nach einer Lösung wie ich mit den verschiedenen Code's die verschiedenen TabellenBlätter ansprchen kann.
Also eine Variable die mir sagt welches TabellenBlatt.
Um es genauer zu machen beschreibe ich mal eine Situation.
Beim öffenen wird die Uf Start angezeigt, dort wählt man jezt mit Button die Wartung aus.
Wenn Uf Wartung aufgerufen wird startet UserForm_Initialize als nächstes satrtet in der UserForm_Initialize die UF PB1 diese ruft dann die Progressbar1 (mld_Allgemein)auf.Dort wird mittels schleife jedesmal das TabellenBlatt select aufgerufen.
Code:
Sub Progressbar1()
SW = ThisWorkbook.Sheets.Count                                       'Schrittweite festlegen
Länge = 1
Schritt = PB1.Label1.Width / SW                                      'Schrittbreite pro Aktualisierung

For i = 4 To SW                                                      'ab Tabellenblatt 4 Starten

        mb = i  'Variable
        Sheets(i).Select
        Call DatumAk
        Call Zellenfarbe
    Länge = Länge + Schritt
    PB1.Label2.Width = Länge
    PB1.Label3.Caption = Format(i / SW, "0 %")
    DoEvents
Next
Application.Wait (Now + TimeValue("0:00:01"))
Unload PB1
End Sub
und anschließen die Module.
In den Modulen wird immer das angewählte Sheet bearbeitet.
Ich brauche jezt was damit die Module wissen welchesl Sheet grade bearbeitet werden soll und diese dann mit dem Code Bearbeitet werden kann.
Das ganze sollte für mehrere Uf's (Start, WartAus, usw.)möglich sein.
Die Sub's  DatumAk und Zellenfarbe werden aus meheren Uf's aufgefrufen.
Ich hoffe es ist einigermassen verständlich.
Wenn NICHT einfach nachfragen


Angehängte Dateien
.xlsm   TextBox1.xlsm (Größe: 455,95 KB / Downloads: 1)
mfg
Michael
:98:

WIN 10  Office 2019
Top
#2
Hallöchen,

übergib die Nummer als Integer, den Namen des Sheets als String oder das Sheet als Objekt an die aufgerufenen Makros

z.B.

Code:
...
Call DatumAk(i)
...


Sub DatumAK(byval i as integer)
With Sheets(i)
  'tue was, z.B. Name des Sheets ausgeben
  Msgbox .Name
End With
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#3
Hallo Andre!
Bin noch am Tetsten! Melde mich nach dem Tetsten nochmals.
mfg
Michael
:98:

WIN 10  Office 2019
Top
#4
Hallo!
Leider habe ich wenig erfolg mit deinen Tip!
Im Module mld_WartAus (Zellenfarbe) sollen dann noch die Registerfarben geändert werden.
Das macht der Code nicht mehr und With Sheets(i) nimmt er auch nicht immer an.
Was mache ich falsch? Hier erstmal der Code wo ich was geändert habe.

PHP-Code:
Sub Zellenfarbe(ByVal i As Integer)
   Dim AktuellesDatum As Date
   Dim Zelle
As Range, c As Range
   Dim wksTab
As Worksheet
   Dim liZeile
As Integer
   Dim lz
As Long, lngC As Long, a As Long
   Dim vntFarben
As Variant
 
  vntFarben
= Array(3, 27, 14, 2, -4105) 'rot, gelb, grün,weiß,standard
   AktuellesDatum = Date

'
MsgBox Sheets(i).Name


'SpalteDurchlaufen
For Each Zelle In Sheets(i).Range("G10:G50") '
& Cells(Rows.Count, "F").End(xlUp).Row)
'For Each Zelle In Range("G10:G50") '

If Zelle.Offset(0, -1) > 0 Then
 
 If Zelle
<> "" Then
   If Zelle
<= Date Then                                                   'Werte Vergleichen
           Zelle.Offset(0, -5).Interior.ColorIndex = 3                     '
Zelle rot einfärben
           Zelle
.Offset(0, -4).Interior.ColorIndex = 3                     'Zelle rot einfärben
           Zelle.Offset(0, -3).Interior.ColorIndex = 3                     '
Zelle rot einfärben
           
'ActiveSheet.Tab.ColorIndex = 3                                 'Register rot einfärben
       Else
           Tage
= (Zelle - Date)                                           'Tage berechnen
               If Tage <= 7 Then                                           '
Abfrage 7 Tage vorher
                       Zelle
.Offset(0, -5).Interior.ColorIndex = 27        'Zelle gelb einfärben
                       Zelle.Offset(0, -4).Interior.ColorIndex = 27        '
Zelle gelb einfärben
                       Zelle
.Offset(0, -3).Interior.ColorIndex = 27        'Zelle gelb einfärben
                   Else
                       Zelle.Offset(0, -5).Interior.ColorIndex = xlNone    '
-4105 'Zelle keine farbe
                       Zelle.Offset(0, -4).Interior.ColorIndex = xlNone    '
-4105 'Zelle keine farbe
                       Zelle.Offset(0, -3).Interior.ColorIndex = xlNone    '
-4105 'Zelle keine farbe
               End If
   End If
 Else
       If Zelle.Offset(0, -1) <> "" Then                                   '
wenn in Zelle daneben kein Werte dann
           Zelle
.Offset(0, -5).Interior.ColorIndex = 3                     'Zelle rot einfärben
           Zelle.Offset(0, -4).Interior.ColorIndex = 3                     '
Zelle rot einfärben
           Zelle
.Offset(0, -3).Interior.ColorIndex = 3                     'Zelle rot einfärben
       End If
 End If
End If
 '
Zelle.Select                                                              'nur info wo der Code ist, wird nachher wieder gelöscht
Next

With Sheets(i)

'
Registerblatt einfärben
   lz
= IIf(IsEmpty(Range("B65536")), Range("B65536").End(xlUp).Row, 65536)
  For lngC = 0 To UBound(vntFarben)
   a = 10
     For Each c In Sheets
(i).Range("B10:B" & lz).Cells
       
If c.Interior.ColorIndex = vntFarben(lngC) Then
             
If c.Interior.ColorIndex = -4105 Then GoTo weiter
                Sheets
(i).Tab.ColorIndex = vntFarben(lngC)                'Register einfärben
               Exit For
           Else
weiter:
              If Sheets(i).Tab.ColorIndex = 14 Then
                   Else
                     Sheets(i).Tab.ColorIndex = 14                       '
Zelle grün einfärben
               End
If
        End If
       a = a + 1
     Next c
       If a
<= lz Then Exit For                                            'Prüfen ob c-Schleife abgebrochen wurde
  Next lngC

End With

End Sub
Sub DatumAk(ByVal i As Integer)
   Dim AktuellesDatum As Date, datFrist As Date, datsecond As Date
   Dim Zelle As Range
   Dim strWieviel As String
 
'
With Sheets(i)
'MsgBox Sheets(i).Name
 AktuellesDatum = Date
'
SpalteDurchlaufen
For Each Zelle In ThisWorkbook.Sheets(i).Range("H10:H50")          'mb kommt von der Progressbar als Variable
'
For Each Zelle In Range("H10:H50") '
 If Zelle <> "" Then
   datfirst = Zelle.Value                                          '
Schreibe in Zelle
       strWieviel
= Zelle.Offset(0, -2)                            'die Anzahl der Monate
       If strWieviel > 0 Then
           datsecond = DateAdd("m", strWieviel, datfirst)          '
DateAdd(Year(datfirst), Month(datfirst) + strWieviel, Day(datafirst))
             Zelle.Offset(0, -1) = datsecond
       End
If
  End If
Next
'End With
End Sub
Das nächste was ich dann noch hätte ist:
Wenn in der UF WartAus ich im Label was was auswähle sollte der Codeteil das auch mitbekommen welches TabllenBlatt gerade bearbeitet werden soll.
PHP-Code:
Private Sub CommandButton2_Click()

Dim i, a, iActSheet, OlFilt As Integer
Dim vZeile  As Variant
Dim letztespalte
, rng, rngZelle As Range
Dim KurzW
, komm1, komm2 As String                                         'Kürzel für Wartung
Dim AktuellesDatum As Date
Dim Zeile As Long

iActSheet = ActiveSheet.Index                                                                                               '
Merken welches Tabellenblatt aktiv ist
 
 
If MitArbeiter > "" Then
   With WartAus
.ListBox2
     
For i = 0 To .ListCount - 1                                                                                          'Alle markierten ListBox-Einträge sammeln
       If WartAus.ListBox2.Selected(i) = True Then
           With ThisWorkbook.ActiveSheet
             vZeile = Application.Match(ListBox2.List(i, 1), .Columns(2), 0)
Eintragen:
               Cells(vZeile, 8) = CDate(tbDatum)
               Cells(vZeile, 8).Offset(0, 1).Value = MitArbeiter
                 KurzW = Cells(vZeile, 5).Value                                                   '
Kürzel der Wartung ermitteln
                  Set rngZelle
= Range("M2:CP3").Find(KurzW, lookat:=xlWhole, LookIn:=xlValues)   'Nach Kürzel suchen
                   Cells(rngZelle.End(xlDown).Row + 1, rngZelle.End(xlDown).Column).Value = CDate(tbDatum)
                   Cells(rngZelle.End(xlDown).Row, rngZelle.End(xlDown).Column + 1).Value = MitArbeiter
                  If OlFilt = "Oel" Then GoTo Oel
                  If OlFilt = "Filter" Then GoTo Filter
                    If Cells(vZeile, 5).Value = "H_006" Then                                           '
                                                              'Wartung gefunden
                       If MsgBox("Wurde ein Ölwechsel oder Filterwechsel durch gefürt?", vbQuestion + vbYesNo, _
                          "Titeltext, vbExclamation") = vbYes Then
                             Wechsel.Show                                                                                  '
UF aufrufen
                               
If Wechsel.Oelwe = True Then                                                               'Oelwechsel+Filterwechsel
                                   Unload Wechsel                                                                          '
UF Schliesen
                                 
For a = 1 To 2
                                    vZeile
= vZeile + 1                                                                    'Für Name und Datum eine Zeile in der Tabelle weiter schalten
                                     OlFilt = "Oel"
                                     GoTo Eintragen
Oel:
                                    Next a
                                   Else           '
Filterwechsel
                                    vZeile
= vZeile + 2
                                    OlFilt
= "Filter"
                                    GoTo Eintragen
Filter
:
                                End If
                                OlFilt = ""
                          Else
                             'MsgBox "Nein"
                             Oelkontrolle.Show
                       End If
                    End If
'
hier muss dann abgefragt werden ob es einen Kommentar gibt
Set rng
= Range("A:A").Find(KurzW)
If
rng Is Nothing Then
 
'MsgBox "Wert " & KurzW & " nicht gefunden!"
   Else
       komm1 = rng.Offset(0, 1)
       komm2 = rng.Offset(1, 1)
       '
rngZelle.End(xlDown).Select
           With
.Cells(rngZelle.End(xlDown).Row, rngZelle.End(xlDown).Column + 1)
             .ClearComments
             
.AddComment
             
.Comment.Visible = False
             
.Comment.Text Text:=komm1 & Chr(10) & komm2
             
.Comment.Shape.TextFrame.AutoSize = True    ' Größe automatisch festlegen
           End With
           '
Löschen des Wortes
 Zeile
= Columns("A:A").Find(KurzW, LookIn:=xlFormulas, _
 lookat
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
  MatchCase
:=False, SearchFormat:=False).Row
                     
           Range
(Cells(Zeile, "A"), Cells(Zeile, "B")).Select
           Selection
.Delete Shift:=xlUp
End
If

           End With
               WartAus
.ListBox2.Selected(i) = False
       End
If
      Next i
   End With
 
Else
   MsgBox "Kein Name ausgewählt"
   Exit Sub
 End
If
  Call DatumAk(i)
  Call Zellenfarbe(i)
  Call Seitennamen
   AktuellesDatum
= Date
     WartAus
.Frame1.Clear
      Call colorC1
       ThisWorkbook
.Sheets(iActSheet).Activate                     'Tabellenblatt wieder aktivieren
        Call suchenSpA
End Sub
Aber erstmal zum anfang.
Ich wieß ich habe einen riessssen Fehler gemacht das ich dies nicht gleich am anfang abgestellt habe.
Ich hoffe Andre oder noch ein anderer kann helfen.
mfg
Michael
:98:

WIN 10  Office 2019
Top
#5
Hallöchen,

zum ersten codebeispiel
Bei With ... musst Du dann auch aufpassen, dass Du die Bereiche wie in meinem Beispiel mit einem "." referenzierst. Im ersten Makro ist da wohl noch eine Stelle, wo  das fehlt:
Statt
Code:
lz = IIf(IsEmpty(Range("B65536")), Range("B65536").End(xlUp).Row, 65536)
dann
Code:
lz = IIf(IsEmpty(.Range("B65536")), .Range("B65536").End(xlUp).Row, 65536)
wobei die 65536 unflexibel noch aus "alten" Zeiten stammt. Hier kannst Du auch Rows.Count verwenden.

Deine zweite Schleife könnte bei Verwendung von With z.B. ungefähr so aussehen - beachte wiederum den "." vor Range und Tab

Code:
With Sheets(i)
lz = IIf(IsEmpty(.Range("B65536")), .Range("B65536").End(xlUp).Row, 65536)
For Each c In .Range("B10:B" & lz)
    ...
    .Tab.ColorIndex = vntFarben(lngC)                'Register einfärben
    ...
Next
End With
... wobei das With schon weiter oben vor die erste Schleife gestellt und diese dann auch entsprechend angepasst werden kann.


Mit den Variablen c und Zelle kannst Du eventuell auch was vereinheitlichen - falls die Schleifen nicht ineinander geschachtelt sind. Für spätere Änderungen wäre es auch von Vorteil, eine Linie in die Variablenbenennung zu bringen. Wenn Du gerne Zelle verwendest, könntest Du statt c und Zelle z.B. ZelleA und ZelleC verwenden (oder eventuell rngZelleA und rngZelleC)

Im Code hast Du z.B. auch
Code:
For Each c In Sheets(i).Range("B10:B" & lz).Cells
For Each Zelle In ThisWorkbook.Sheets(i).Range("H10:H50")          
Falls Du immer in ThisWorkbook bist, könntest Du das im zweiten Code entfallen lassen. Und wenn Du im zweiten Code die Erfahrung gemacht hast, dass er auch ohne .Cells den Bereich durchgeht, kannst Du es im ersten Fall vielleicht weglassen.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#6
Hallo!
Danke für die Hilfe, hat nich erstmal weiter gebracht.
Funktioniert auch jetzt wieder mit den Register einfärben (nach den ersten Test).
Den Rest muss ich mir erstmal noch richtig anschauen um das zu ändern.
Ich würde jetzt gerne auf das problem mit dem Label weitergehen, wie könnte da dei Lösung aussehen?
mfg
Michael
:98:

WIN 10  Office 2019
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste