Das Clever-Excel-Forum.de - Treffen
findet vom 15. - 17. September 2017 in Thüringen / Region Großer Inselsberg statt. Hotelbuchung ab sofort möglich.


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
to 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.
to 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
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!

?mage
to 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! Smile

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! Smile Der neue Artikel wird für den zweiten User sofort nach ThisWorkBook.Save verfügbar sein! Smile

VG
Alexandra
to 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.
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!

?mage
to 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
to top


Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
Question CheckBox in freigegebener Arbeitsmappe vici 3 64 22.11.2016, 20:06
Letzter Beitrag: shift-del
  Durchsuchen einer gesamten Arbeitsmappe schadre 11 213 14.11.2016, 08:33
Letzter Beitrag: Kuwer
  Externer Bezug bei geschlossener Arbeitsmappe DocMarley 14 178 22.10.2016, 12:55
Letzter Beitrag: Peter
  Vernküpfung der Arbeitsmappe Mick-DUS 4 245 22.08.2016, 14:32
Letzter Beitrag: Mick-DUS
  Mit VBA Namen in zwei Arbeitsmappe vergleichen und Zellen kopieren Mario123 2 191 11.08.2016, 18:01
Letzter Beitrag: Mario123
  Arbeitsmappe schützen beim Schließen Hanna 7 420 03.08.2016, 14:27
Letzter Beitrag: Hanna
  Tabellenblatt aus einer Arbeitsmappe speichern Glausius 7 365 14.07.2016, 18:39
Letzter Beitrag: schauan
  Wie zwei unterschiedliche Tabellen aus einer Arbeitsmappe in ein Diegramm bringen? Wurstsalat 2 317 10.06.2016, 08:01
Letzter Beitrag: Rabe
  Signieren einer Arbeitsmappe Sternschuppi 4 440 29.04.2016, 10:21
Letzter Beitrag: Sternschuppi
  Beim Öffnen einer neuen Arbeitsmappe die vorhergehende schließen Glausius 16 1.940 03.10.2015, 10:45
Letzter Beitrag: Glausius

Gehe zu:


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