Arbeitsmappe freigeben!
#1
Hallo zusammen,


habe mal eine Frage bezüglich Freigabe einer Arbeitsmappe! Mit folgendem Codes lege ich über eine Userform in meine Artikeldatenbank neue Artikel an:

Code:
Private Sub cmdNeuerArtikel_Click() 'Button: Neu
OriginalColor
    Image1.Visible = False
   lstArtikel.ListIndex = -1
   ControlsBearbeiten
   TextBox4.Enabled = True
   TextBox3.Enabled = False
   cmdArtikelAnlegen.Visible = True
   lstArtikel.Enabled = False
   cmdNeuerArtikel.Visible = False
   cmdLöschen.Visible = False
   cmdArtikelBearbeiten.Visible = False
   cmdArtikelSuchen.Visible = False
   cmdErweiterteSF.Visible = False
   cmdArtikeldatenKopieren.Visible = True
    frmProdukte.Image1.Picture = LoadPicture("")
With ThisWorkbook.Sheets("produkte")
   For y = 1 To 58
   If Not y = 3 Then
     Select Case y
        Case 11, 12, 16, 19, 20, 22, 23, 24, 25, 26, 27, 28, 35, 36, 38, 41
           frmProdukte.Controls("ComboBox" & y).Value = ""
        Case Else
           frmProdukte.Controls("TextBox" & y).Value = ""
           [color=#FF0000]TextBox3.Value = ThisWorkbook.Sheets("LN").Range("A2") + 1[/color]  'nächste Artikelnummer
End Select
End If
   Next y
End With
Controlsgelb
TextBox3.Enabled = False
TextBox4.SetFocus
Vorbelegen
End Sub


Private Sub cmdArtikelAnlegen_Click()                   'Button: Artikel anlegen
Dim intErsteLeereZeile As Long
TextBox60.Enabled = False
Dim ctrElement As Control
    For Each ctrElement In Me.Controls
       If TypeName(ctrElement) = "TextBox" Or TypeName(ctrElement) = "ComboBox" Then
          Select Case ctrElement.Name
             Case Is = "TextBox60", "TextBox57", "TextBox58", "TextBox59"
             Case Else
                If ctrElement.Value = "" Then
                           Controlsgelb
              MsgBox "Bitte alle Pflichtfelder ausfüllen!"
       ctrElement.SetFocus
    Exit Sub
                Else
                ctrElement.BackColor = &HE0E0E0
                End If
          End Select
       End If
    Next ctrElement
intErsteLeereZeile = ThisWorkbook.Sheets("produkte").Cells(Rows.Count, 3).End(xlUp).Row + 1
        frmProdukte.TextBox57.Text = Environ("Username") & " " & Date & " " & Time
        frmProdukte.TextBox58.Text = Environ("Username") & " " & Date & " " & Time
With ThisWorkbook.Sheets("produkte")
frmProdukte.TextBox57.Text = Environ("Username") & " " & Date & " " & Time
frmProdukte.TextBox58.Text = Environ("Username") & " " & Date & " " & Time
   For y = 1 To 58
     Select Case y
        Case 11, 12, 16, 19, 20, 22, 23, 24, 25, 26, 27, 28, 35, 36, 38, 41
           .Cells(intErsteLeereZeile, y) = frmProdukte.Controls("ComboBox" & y).Value
        Case 30, 31, 32, 33, 52, 53, 54, 55
            .Cells(intErsteLeereZeile, y) = CCur(frmProdukte.Controls("TextBox" & y))
        Case Else
           .Cells(intErsteLeereZeile, y) = frmProdukte.Controls("TextBox" & y).Value
End Select
   Next y
End With
    ThisWorkbook.Sheets("LN").Cells(2, 1).Value = CDbl(TextBox3.Text)
'          Dim Datensatz As Long
   MsgBox ("Artikel" & " " & TextBox3.Value & " " & "wurde erfolgreich angelegt!")
SortierenLieferanten
ThisWorkbook.Save
End Sub

Nun meine Fragen:

1. Wenn ich den Code so lassen würde und zwei User gleichzeitig neue Artikel anlegen würden dann würde u.U. beide die gleiche Artikelnummer bekommen, das heißt ich müsste den rotmarkierten Codeteil am Ende des Codes einsetzen, richtig?

2. Wenn ich den rotmarkierten Code am Ende des Codes tun würde und theoretisch beide User zur gleichen Zeit auf dem "Anlegen" Button drücken würden, was würde da passieren?

3. Was muss ich beachten, bei einer freigegebenen Datei, damit sich die User nicht gegenseitig auf die Füsse treten?


Vielen Dank
VG
Alexandra
Top
#2
Hi Alexandra,

dieses Problem wirst du nie ganz lösen können. Freigegebene Arbeitsmappen haben ihre Probleme.
Ich würde das Problem in Excel anders lösen:

Ich würde eine "Eigene Eingabemappe" machen, dann könnte jeder eingeben, die Artikeldatenbank mit dem "Anlegenbutton" kurz öffnen, den Artikel eintragen lassen und dann die Artikeldatenbank speichern und schließen.
Somit wäre dein Problem auf ein Minimum reduziert.
Es ist nicht genug, zu wissen. Man muss es auch anwenden.
Es ist nicht genug, zu wollen. Man muss es auch tun.
Top
#3
Hallo Heinz,

das ist, finde ich, eine vorzügliche, saubere und einfache Lösung für Dateien mit und ohne VBA gleichermaßen. :18:
Top
#4
Hallo Heinz, Hallo Peter,


danke für eure Antworten, das ist zwar ne gute Idee, aber die Performance leidet sehr drunter, da ja die Artikeldaten in der Userform ja auch aus der "Datenbank-Mappe" abgerufen werden und dann bei jedem Klick in der Listbox der Userform diese "kurz" geöffnet werden müsste und das dauert, so macht es kein Spass mehr! :)

Ich habe es so gelöst, wenn es jemand interessiert:

Code:
Private Sub cmdNeuerArtikel_Click() 'Button: Neu
If ThisWorkbook.Sheets("LNA").ProtectContents = True Then
MsgBox "Ein anderer User bearbeitet bereits die Datenbank, bitte versuchen Sie es später erneut!"
Exit Sub
Else
OriginalColor
    Image1.Visible = False
   lstArtikel.ListIndex = -1
   ControlsBearbeiten
   TextBox4.Enabled = True
   TextBox3.Enabled = False
   cmdArtikelAnlegen.Visible = True
   lstArtikel.Enabled = False
   cmdNeuerArtikel.Visible = False
   cmdLöschen.Visible = False
   cmdArtikelBearbeiten.Visible = False
   cmdArtikelSuchen.Visible = False
   cmdErweiterteSF.Visible = False
   cmdArtikeldatenKopieren.Visible = True
    frmProdukte.Image1.Picture = LoadPicture("")
With ThisWorkbook.Sheets("produkte")
   For y = 1 To 58
   If Not y = 3 Then
     Select Case y
        Case 11, 12, 16, 19, 20, 22, 23, 24, 25, 26, 27, 28, 35, 36, 38, 41
           frmProdukte.Controls("ComboBox" & y).Value = ""
        Case Else
           frmProdukte.Controls("TextBox" & y).Value = ""
           ThisWorkbook.Sheets("LNA").Protect Password:=Environ("Username")
           TextBox3.Value = ThisWorkbook.Sheets("LNA").Range("A2") + 1   'nächste Artikelnummer
End Select
End If
   Next y
End With
Controlsgelb
TextBox3.Enabled = False
TextBox4.SetFocus
Vorbelegen
End If
End Sub


Private Sub cmdArtikelAnlegen_Click()                   'Button: Artikel anlegen
Dim intErsteLeereZeile As Long
TextBox60.Enabled = False
Dim ctrElement As Control
    For Each ctrElement In Me.Controls
       If TypeName(ctrElement) = "TextBox" Or TypeName(ctrElement) = "ComboBox" Then
          Select Case ctrElement.Name
             Case Is = "TextBox60", "TextBox57", "TextBox58", "TextBox59", "TextBox1", "TextBox2", "TextBox3"
             Case Else
                If ctrElement.Value = "" Then
                           Controlsgelb
              MsgBox "Bitte alle Pflichtfelder ausfüllen!"
       ctrElement.SetFocus
    Exit Sub
                Else
                ctrElement.BackColor = &HE0E0E0
                End If
          End Select
       End If
    Next ctrElement
intErsteLeereZeile = ThisWorkbook.Sheets("produkte").Cells(Rows.Count, 3).End(xlUp).Row + 1
frmProdukte.TextBox57.Text = Environ("Username") & " " & Date & " " & Time
frmProdukte.TextBox58.Text = Environ("Username") & " " & Date & " " & Time
With ThisWorkbook.Sheets("produkte")
frmProdukte.TextBox57.Text = Environ("Username") & " " & Date & " " & Time
frmProdukte.TextBox58.Text = Environ("Username") & " " & Date & " " & Time
   For y = 1 To 58
     Select Case y
        Case 11, 12, 16, 19, 20, 22, 23, 24, 25, 26, 27, 28, 35, 36, 38, 41
           .Cells(intErsteLeereZeile, y) = frmProdukte.Controls("ComboBox" & y).Value
        Case 30, 31, 32, 33, 52, 53, 54, 55
            .Cells(intErsteLeereZeile, y) = CCur(frmProdukte.Controls("TextBox" & y))
        Case Else
           .Cells(intErsteLeereZeile, y) = frmProdukte.Controls("TextBox" & y).Value
End Select
   Next y
End With
           ThisWorkbook.Sheets("LNA").Unprotect Password:=Environ("Username")
    ThisWorkbook.Sheets("LNA").Cells(2, 1).Value = CDbl(TextBox3.Text)
   MsgBox ("Artikel" & " " & TextBox3.Value & " " & "wurde erfolgreich angelegt!")
SortierenLieferanten
ThisWorkbook.Save
End Sub

Das heißt ich versehe das betroffene Blatt mit Schreibschutz, solange bis der Artikel angelegt wurde! In dieser Zeit, sollte der andere User "Neuer Artikel" betätigen, so bekommt er die Meldung, dass die Datenbank bereits bearbeitet wird und wird gebeten später es zu versuchen! :) Der neue Artikel wird für den zweiten User sofort nach ThisWorkBook.Save verfügbar sein! :)

VG
Alexandra
Top
#5
Hallo Andrea,

Zitat:und dann bei jedem Klick in der Listbox der Userform diese "kurz" geöffnet werden müsste und das dauert, so macht es kein Spass mehr!

Das war auch so nicht vorgesehen. Ich schätze mal, Du hast was falsch verstanden oder der VBA-Code sollte geändert werden :19:

Es kann aber auch sein, daß ich etwas falsch verstanden habe :05:

Warum sollte es nötig sein, daß der VBA-Code bei jedem Klick in eine Zelle abläuft.
Auch bei Excel ist es doch möglich, die automatische Berechnung vorübergehend abzuschalten.

Du machst Deine Eingaben und am Ende der Eingaben werden mit Klick auf einen Button oder sowas in der Art, Kollektiv alle Eingaben am Stück verschoben / kopiert, was auch immer.
Und dann wird die Zieldatei wieder geschlossen.
Top
#6
Hallo Peter,

Zitat:Du machst Deine Eingaben und am Ende der Eingaben werden mit Klick auf einen Button oder sowas in der Art, Kollektiv alle Eingaben am Stück verschoben / kopiert, was auch immer.
Und dann wird die Zieldatei wieder geschlossen.

Ja, das habe ich verstanden und das würde so auch passen, wenn ich die Artikel nur anlegen würde!
Aber ich möchte meine angelegten Artikel anschauen über die Userform in dem ich Inder Listbox diese auswähle und mir die jeweils dazugehörigen Daten aus der "Datenbank-Mappe" anzeigt, dazu müsste diese bei jedem Artikel den ich anklicke geöffnet werden!

Vielen Dank
VG
Alexandra
Top


Gehe zu:


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