3.8k Aufrufe
Gefragt in Datenbanken von milli24 Einsteiger_in (86 Punkte)
Guten Tag zusammen.

Meine erste Frage: Wo kann ich eine Beispieldatei anbinden um folgendes besser erklären zu können, weil....

Ich möchte das Tabellenblatt "ArbTab" vor Zugriffen schützen, weil mehrere in der Datei arbeiten, und Fehler in Datenfeldern verursachen. Ich hatte mir vorgestellt dies mittels VBA Code zu realisieren, weil dies wird von den Leuten nicht beherrscht. Ich habe im Beispiel einen Versuch gestartet, aber weis nicht, ob ich an den richtigen Positionen meinen Code eingebracht habe. Es muss wohl das Tabellenblatt geöffnet, die geänderten Daten eingespeist, und dann die Tabelle wieder geschlossen/ für den Zugriff andere gesperrt werden.

Es sollte aber ohne Passwort geschehen.
Vielleicht kann mich jemand aktiv unterstützen. Danke und Gruß

11 Antworten

0 Punkte
Beantwortet von halfstone Profi (18.1k Punkte)

Hi milli24,

wie du hier Dateien hochladen kannst wird hier erklärt:

Dateien als Beispiel hochladen

Gruß Fabian

0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo milli24,

um ein geschütztes Blatt zu bearbeiten musst du natürlich zuerst den Blattschutz aufheben. In deinem Code könnte das so aussehen:

With Worksheets("Tabelle1")
  'Blattschutz aufheben
  .Unprotect

  hier steht dein Code

  'Blattschutz wieder setzen
  .Protect
End With

Der Blattschutz kann aber ganz normal über das Menüband "Überprüfen" und "Blattschutz" aufgehoben werden, auch wenn jemand keine Ahnung von VBA hat. Willst du ein Passwort für den Blattschutz vergeben, dann geht das so:

With Worksheets("Tabelle1")
  'Blattschutz aufheben
  .Unprotect "Passwort"

  'hier steht dein Code

  'Blattschutz wieder setzen
  .Protect "Passwort"
End With

Dein Passwort musst du zwischen den beiden Hochkomma anstatt des Wortes Passwort eintragen.

Gruß

M.O.

0 Punkte
Beantwortet von milli24 Einsteiger_in (86 Punkte)

Hallo und Danke erstmal. Weis grad nicht ob mein Antwortversuch erfolgt ist. Sicherheitshalber jetzt nochmal mit Beispieldatei. Das mit Protect bzw. Unprotect hatte ich schon versucht. Mein Problem ist die richtige Einordnung im VBA Kode. Vielleicht hat hier jemand eine Idee wie und wo der Kode-Satz bei der USERFORM1 eingeordnet werden muss. Es wird ja in einem Prozess verarbeitet. Hier jetzt die Beispieltabelle. Danke für eure Hilfe!

Nun die Beispieldatei

0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Milli,

wenn ich das richtig sehe, müsste das so sein:

Private Sub cmdSave_Click() '  Daten übertragen , Datei – Speichern [aktive Arbeitsmappe]
    Dim lZeile As Long
    Dim rngRow As Range
    If lstData.ListIndex = -1 Then Exit Sub
    If Trim(CStr(txtPosNr.Text)) = "" Then
    MsgBox "Sie müssen mindestens eine Nummer eingeben!", vbCritical + vbOKOnly, "FEHLER!"
        Exit Sub
    End If
    'Zeile suchen und auslesen
    If seekArb(txtPosNr, rngRow) Then    'Werte übernehmen
        Worksheets("ArbTab").Unprotect
         rngRow.Cells(, colAtPosNr).Value = Trim(CStr(txtPosNr.Text))
        rngRow.Cells(, colAtNummer).Value = txtnummer.Text
        rngRow.Cells(, colAtAnrede).Value = txtAnrede.Text
        rngRow.Cells(, colAtNachname).Value = txtNachname.Text
        rngRow.Cells(, colAtVorname).Value = txtVorname.Text
        rngRow.Cells(, colAtStrasse).Value = txtStrasse.Text
        rngRow.Cells(, colAtWohnort).Value = txtWohnort.Text
        rngRow.Cells(, colAtTelefon).Value = txtTelefon.Text
        If IsDate(txtGeburtstag.Text) Then rngRow.Cells(, colAtGeburtstag).Value = CDate(txtGeburtstag.Text)   'Datumsfeld mit Format
        If IsDate(txtEintritt.Text) Then rngRow.Cells(, colAtEintritt).Value = CDate(txtEintritt.Text)   'Datumsfeld mit Format
        If IsDate(txtAustritt.Text) Then rngRow.Cells(, colAtAustritt).Value = CDate(txtAustritt.Text)   'Datumsfeld mit Format
        If IsDate(txtgenBis.Text) Then rngRow.Cells(, colAtgenBis).Value = CDate(txtgenBis.Text)   'Datumsfeld mit Format
        rngRow.Cells(, colAtGruppe).Value = txtgruppe.Text
        rngRow.Cells(, colAtKrankenkasse).Value = txtkrankenkasse.Text
        rngRow.Cells(, colAtKrKNr).Value = txtKrKNr.Text
        rngRow.Cells(, colAtBemerkung).Value = TxTBemerkung.Text
        rngRow.Cells(, colAtZahlung).Value = TxTZahlung.Text
        Worksheets("ArbTab").Protect
        'User Formular neu laden
        Call UserForm_Initialize
    Else
        MsgBox "Nummer " & txtPosNr.Text & " nicht gefunden", vbExclamation + vbOKOnly
    End If
    
    Call cmdNew_Click
              
    End Sub

Du hast hier ja viele Tabellen ausgeblendet und ich weiß nicht, ob die User nur mit der Eingabemaske arbeiten sollen, oder auch auf die Tabellen zugreifen können.

Wenn du Tabellen so ausblenden willst, dass man sie nicht mit Rechtsklick auf den Reiter über "Tabellen einblenden" wieder einblenden kann, dann nutze den folgenden Befehl:

Worksheets("Tabelle1").Visible = xlVeryHidden

Ein so ausgeblendetes Arbeitsblatt kann nur per VBA wieder eingeblendet werden:

Worksheets("Tabelle1").Visible = True

Dann kannst du ggf. auf den Blattschutz verzichten.

Gruß

M.O.

0 Punkte
Beantwortet von
Sorry, kam erst heute dazu, dein Antwort zu lesen. Habe sie eingebaut und getestet. Läuft super. Musste nur in Verlauf der Prozedur ein paar kleine Änderungen vornehmen. Danke nochmals für die Unterstützung. Gruß Milli
0 Punkte
Beantwortet von
Hallo, in die Runde. Habe jetzt mal alle Funktionen in der Prozedur (nenne ich es mal) versucht zu testen, dabei ist mir aufgefallen, dass diese nicht zu Ende gehen, weil die Tabelle "ArbTab" ja noch mit dem Unprotect bzw. Protect gesperrt war. Es bräuchte also den Blattschutz beim Beenden in der Eingabemaske. Konnte den Code

" Worksheets("ArbTab").Protect "
 
trotz Versuchen nicht richtig zuordnen. Ich glaube man muss es jeweils bei der Funktion sortieren, löschen und beenden separat verwenden. Kann mich hier noch jemand mit konkreten Vorschlägen/Beispielen unterstützen.
Danke und Gruß
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Milli,

ich glaube du meinst das:

Private Sub CommandButton5_Click()  ' Tabelle Arb sortieren
    Dim LastRow As Long  '  Tabelle ArbDat sortieren
    With Worksheets("ArbTab")
        .Unprotect
        LastRow = .Range("A65536").End(xlUp).Row
        .Range("A2:z" & LastRow).Sort Key1:=.Range("D2"), Key3:=.Range("E2"), Key3:=.Range("H2")
       .Protect
    End With
End Sub

Gruß

M.O.

0 Punkte
Beantwortet von
Danke, das passt soweit. Kann es aber sein, das Spalten worin sich Zahlen (Geburtstag) befinden hierbei nicht berücksichtigt werden? Wenn ich nämlich nach dem Beenden die Tabelle ArbTab aufrufe kann ich hier Werte verändern, die eigentlich geschützt sein sollten. Das "Blattschutz aufheben" ist aktiviert????, aber man kann trotzdem in die Tabelle schreiben. Gruß

Private Sub CommandButton4_Click() ' Eingabemaske schließen
Dim intTabelle As Integer ' und gleichzeitig alle Tabellenblätter ausblenden

With Worksheets("ArbTab")

For intTabelle = 1 To ActiveWorkbook.Worksheets.Count

If ActiveWorkbook.Worksheets(intTabelle).Name <> "Auswahl Klick" Then

ActiveWorkbook.Worksheets(intTabelle).Visible = False
.Protect
End If

Next intTabelle

Call Tabelle8.CommandButton5_Click ' <-- hier der Aufruf
Unload Me ' Call Sichern

End With
End Sub
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo Milli,

schaue mal nach, ob die betreffenden Zellen gesperrt sind: klicke bei ausgeschaltetem Blattschutz in eine der Zellen mit dem Geburtstag - klicke auf die rchte Maustaste - Zellen formatieren - Reiter "Schutz" und schaue nach, ob ein Haken bei "geschützt" gesetzt ist. Falls nicht, markiere die Spalte und setzte den Haken.

Wenn das Blatt geschützt ist, dann siehst du das Icon "Blattschutz aufheben". Ist das Blatt nicht geschützt, dann siehst du das Icon "Blatt schützen"

Gruß

M.O.
0 Punkte
Beantwortet von

Danke erstmal für die Information, aber so will es nicht klappen. Vielleicht geht ein Blick in die "Für Demonstration". Gruß Milli

Nun die Beispieldatei

...