Tabellenblätter entsperren, ohne Akitivierung

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von SZR2D.

    Tabellenblätter entsperren, ohne Akitivierung

    Hallo Zusammen,
    ich habe ein kleines Problem beim Ausführen von meinem Makro. Wenn ich es über VBA Fenster schrittweise mit (F8) ausführe - verläuft alles normal. Aber soweit ich es im Excel ausführen will, gibt es Schwierigkeiten.
    Im Verlauf lande ich irgendwann in anderem Blatt "OEE" (ist in der Mappe das letzte Blatt), obwohl ich eigentlich mit dem Makro keine anderen Blätter aktiviere. Ich müsste immer im aktiven Tabellenblatt bleiben.

    Ich habe eine Vermutung, dass es am Entsperren von den Tabellenblättern liegt. Gibt es eine Möglichkeit die Tabellenblätter zu entsperren, ohne die auf irgendeine Weise anzusprechen?
    Andere Möglichkeit: gibt es einen Code, dass ich das letzte aktive Tabellenblatt auswähle (wo das Makro gestartet hat)?

    Visual Basic-Quellcode

    1. ​Sub Charge_V()
    2. ' Blattschutz bei benötigten Tabellenblättern deaktivieren
    3. ActiveSheet.Unprotect Password:="Lok"
    4. Worksheets("OEE").Unprotect Password:="Lok"
    5. Worksheets("Pareto").Unprotect Password:="Lok"
    6. ' Aktuelles Tabellenblatt (Charge) kopieren
    7. ActiveSheet.Copy before:=Sheets("pareto")
    8. ' Neues Tabellenblatt umbenennen. Count wird aktualisiert und um eine "1" ergänzt. Neues Blatt wird in "V_*" +1 umbenannt
    9. Range("z1") = Range("z1") + 1
    10. Range("z12") = "V_" & Range("z1")
    11. ActiveSheet.Name = Range("z12").Text
    12. ' Im neuen Tabellenblatt wird in zwei Zellen eine Formel mit Hinweis auf vorherige Charge eingefügt. Beim Beschriften von der Formel wird zur Verknüpfung
    13. ' bestehendes Tabellenblatt genommen "V_1"
    14. '"Start Rüsten" Der Wert wird von vorheriger Charge - Ende Produktion übernommen.
    15. Range("D6:F6") = "=V_1!R[2]C"
    16. '"Reminder" Hinweis, wenn nicht alle Felder in der vorherigen Charge ausgefüllt waren.
    17. Range("R4:R9") = "=IF(OR(V_1!RC[-14]=0,V_1!R[1]C[-14]=0,V_1!R[2]C[-14]=0,V_1!R[3]C[-14]=0,V_1!R[4]C[-14]=0),""Vorherige Charge nicht komplett ausgefüllt!"",0)"
    18. ' Anhand von aktuellem Count wird in der Zelle ermittelt, welche Charge davor lief
    19. Range("z3") = "V_" & Range("z1") - 1
    20. ' "V_1" wird mit der richtigen Bezeichnung ersetzt
    21. Cells.Replace What:="V_1", Replacement:=Cells.Range("z3")
    22. ' "Start Rüsten" Die Zelle wird gesperrt
    23. Range("D6:F6").Locked = True
    24. ' ClearContent. Im neuem Tabellenblatt werden alle alten Werte von der vorherigen Charge gelöscht. Alle Zellen, die nicht gesperrt werden durchsucht und gelöscht
    25. Dim Bereich As Range
    26. Dim Zelle As Range
    27. For Each Zelle In ActiveSheet.UsedRange
    28. If Zelle.Locked = False Then
    29. If Bereich Is Nothing Then
    30. Set Bereich = Zelle
    31. Else
    32. Set Bereich = Union(Bereich, Zelle)
    33. End If
    34. End If
    35. Next
    36. Bereich.ClearContents
    37. ' OEE Daten aktualisieren mit der neuen Charge
    38. With Worksheets("OEE")
    39. ' Im Tabellenblatt "OEE" wird der Filter rausgenommen
    40. .Range("$A$2:$D$1500").AutoFilter Field:=2
    41. End With
    42. ' Werte, die an aktuelle Charge anknüpfen werden kopiert
    43. ActiveSheet.Range("U12:Ae72").Copy _
    44. ' Im Tabellenblatt "OEE" wird nach der nächsten freien Zeile gesucht, um die Werte vom neuem Tabellnblatt zu ergänzen
    45. With Worksheets("OEE")
    46. .Range("A" & Application.Max(5, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)). _
    47. PasteSpecial Paste:=xlPasteAll
    48. End With
    49. 'Pareto Daten aktualisieren mit der neuen Charge
    50. ' Werte, die an aktuelle Charge anknüpfen werden kopiert
    51. ActiveSheet.Range("Af12:Ai191").Copy _
    52. ' Im Tabellenblatt "Pareto" wird nach der nächsten freien Zeile gesucht, um die Werte vom neuem Tabellnblatt zu ergänzen
    53. With Worksheets("Pareto")
    54. .Range("A" & Application.Max(5, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)). _
    55. PasteSpecial Paste:=xlPasteAll
    56. End With
    57. Range("e11").Select
    58. ActiveCell.Offset(1, 0).Select
    59. ' Blattschutz bei allen Tabellenblättern aktivieren
    60. For Each Blatt In ActiveWorkbook.Worksheets
    61. Blatt.Protect ("Lok")
    62. Next Blatt
    63. End Sub
    In den Zeilen 66 bis 68 wechselst du aber mit sicherheit das Arbeitsblatt (Sheet).

    Das gezielte Aktivieren müsste so funktionieren: Worksheets(1).Activate Hier wird das erste Arbeitsblatt aktiviert.

    Wenn du nur den Namen kennst, kannst du das so machen:

    Visual Basic-Quellcode

    1. For x = 1 To Worksheets.Count
    2. If Worksheets(x).Name = "HierderName" Then
    3. Worksheets(x).Activate
    4. Exit For
    5. End If
    6. Next
    Am Ende ist es auch nicht wichtig, aber das Problem ist, dass der Name eben unbekannt ist, da es sich immer ändert.
    Mit dem Code wird eine Eingabemaske kopiert und vervielfältigt. Ich starte mit dem Tabellenblatt V_1 und jedes Mal, wenn ich den Code ausführe, kommt eins dazu. V_2, V_2 usw.
    Der Code soll deswegen universal bleiben, weil am Ende der Woche, weiß ich nicht wie viele solche Chargen gefertigt werden.
    Mit dem Befehl

    Visual Basic-Quellcode

    1. ​ActiveSheet.Copy before:=Sheets("pareto")

    wird ActiveSheet auf die Kopie gesetzt.
    Gib deinen Sheets vernünftige Objektnamen und sprich diese an,
    ActiveSheet ist ein volatiles Objekt.

    Oder speichere wenigstens die Sheets in eine Objektvariable und adressiere deine Befehle entsprechend, damit du immer weißt, in welchem Blatt du arbeitest.

    Visual Basic-Quellcode

    1. Set ws1 = Activesheet
    2. ​ws1.Copy before:=Sheets("pareto")
    3. Set ws2 = ActiveSheet
    4. ws2.Range("z1").Value = ws2.Range("z1").Value + 1
    5. ws2.Range("z12").Value = "V_" & Range("z1").Value
    6. ws2.Name = Range("z12").Text
    7. ...
    8. ws1.Activate
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --