Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

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
Antworten 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)
Antworten Top
#3
Hallo Andre!
Bin noch am Tetsten! Melde mich nach dem Tetsten nochmals.
mfg
Michael
:98:

WIN 10  Office 2019
Antworten 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 RangeAs Range
    Dim wksTab 
As Worksheet
    Dim liZeile 
As Integer
    Dim lz 
As LonglngC As LongAs Long
    Dim vntFarben 
As Variant
   
   vntFarben 
= Array(327142, -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).Row65536)
 
  For lngC 0 To UBound(vntFarben)
 
   a 10
      For Each c In Sheets
(i).Range("B10:B" lz).Cells
         
If c.Interior.ColorIndex vntFarben(lngCThen
               
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 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) + strWievielDay(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 iaiActSheetOlFilt As Integer
Dim vZeile  As Variant
Dim letztespalte
rngrngZelle As Range
Dim KurzW
komm1komm2 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 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(KurzWlookat:=xlWholeLookIn:=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 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).RowrngZelle.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(KurzWLookIn:=xlFormulas_
  lookat
:=xlPartSearchOrder:=xlByRowsSearchDirection:=xlNext_
   MatchCase
:=FalseSearchFormat:=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
Antworten 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)
Antworten 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
Antworten Top


Gehe zu:


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