Code Optimierung - Mein Projekt
#21
Du muss selber den Code analysieren und anpassen. Nur kopiieren reicht nicht (das war beabsichtet).
Mein Post ist ein Vorschlag in eine gewisse Richtung, keine Komplettlösung.
Top
#22
Langsam wird es, aber irgendwas ist immer Blush

Bisher hatte ich ja Daten und VBA in einer Datei, aber ich denke besser ist, Daten und VBA zu trennen. Was klappt ist, dass ich die UserForm starte und mit dem Start die Datei mit den Daten geöffnet wird. Hierzu verwende ich

Code:
Workbooks.Open("D:\HiDrive\Dokumente\VBARecht\Daten\Wohn_C").Worksheets("Wohn_C").Activate

in UserForm_Initialize().

Nun soll aber bei einem Wechsel von einer UserForm in eine andere die Datei "Wohn_C" geschlossen und gespeichert werden. In der Onlinehilfe steht ja der Code
Code:
Workbooks("BOOK1.XLS").Close SaveChanges:=False
. Angepasst auf meinen Fall sollte der so aussehen
Code:
Workbooks("D:\HiDrive\Dokumente\VBARecht\Daten\Wohn_C").Worksheets("Wohn_C").Close SaveChanges:=False
. Dachte ich. Nun kommt aber immer der Laufzeitfehler 9.

Über Google habe ich den Beitrag http://www.herber.de/forum/archiv/1308to...n_vba.html gefunden und mal den Code ausprobiert
Code:
Sub schliessen2()
   Dim wb As Workbook, blnOK As Boolean

   For Each wb In Workbooks
      If LCase(wb.Name) = "test1.xls" Then
         MsgBox "Arbeitsmappe Test1.xls ist geöffnet, wird jetzt geschlossen"
         wb.Close SaveChanges:=True
         blnOK = True
         Exit For
      End If
   Next wb
   If Not blnOK Then MsgBox "Arbeitsmappe Test1.xls ist nicht geöffnet"
End Sub

"Test1.xls" habe ich natürlich durch meine Datei ersetzt. Sowohl in der Form "D:\HiDrive\Dokumente\VBARecht\Daten\Wohn_C", "D:\HiDrive\Dokumente\VBARecht\Daten\Wohn_C.xlsx", "Wohn_C.xlsx" und "Wohn_C" probiert und immer sagt mir Excel nur, dass die Datei nicht geöffnet ist. Dem Beitrag entnehme ich nun, dass offenbar mein Projekt beim Schließen die Datei nicht mehr erkennt!? Aber ich werde nicht schlau daraus, wie ich das nun beheben kann!?

Grüße und allseits guten Start ins Wochenende!
Top
#23
Hallöchen,
beim Schließen gibst Du nur den Dateinamen ohne Pfad an. Einen Pfad brauchst Du nur, wenn Du die Datei an einem anderen Ort speichern willst.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#24
Hallo schauan!

Aber auch wenn ich

Code:
Workbooks("Wohn_C.xlsx").Worksheets("Wohn_C").Close SaveChanges:=False

verwende kommt halt der Laufzeitfehler. Auch wenn ich ".xlsx" weglasse Huh
Top
#25
Okay... ich habs

Code:
Workbooks("Wohn_C.xlsx").Close SaveChanges:=False

Blush

Danke
Top
#26
Frage, kann es zu Problemen kommen, die ich irgendwie noch abfangen muss, wenn mehrere Personen gleichzeitig mit der UserForm auf eine andere Excel-Datei (Datenbestand) zugreifen. Freigabe für mehrere Zugriffe ist klar und das Neuanlegen von Datensätzen muss ich auch regeln, aber darüberhinaus noch was, was ich bedenken sollte?
Top
#27
Hallöchen,


wenn DU mit VBA auf eine freigegebene Datei zugreifen willst, solltest Du gründlich testen, was da geht und wo es Probleme gibt. Eventuell wäre es besser, wenn Du in dem Fall keine Freigabe erteilst sondern die user einzeln damit arbeiten müssen. Für gleichzeitiges Arbeiten hat man mit einer Datenbank deutlich mehr Möglichkeiten, die Zugriffe zu organisieren.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#28
Schauan,

so werde ich das halten. Es gibt ein Programm (VBA) und 3 Daten-Dateien. Auf die Daten soll jeweils nur ein Mitarbeiter zugreifen können. Jede Datei wird innerhalb VBA mit einer Userform angesprochen. Ich denke das sollte so funktionieren. Besser ich hoffe... Blush

Weitere Frage: Ich habe ja nun VBA und Daten getrennt. Nun gibt es eine Datei, in der Daten gefiltert und sortiert werden müssen, bevor die Daten in der UserForm landen.

Code:
Private Sub UserForm_Initialize()

'Excel in den Hintergrund#####
Application.Visible = False
'#####

    'Aktiviertes Tabellenblatt#####
'       Workbooks.Open("D:\HiDrive\Dokumente\VBARecht\Daten\Wohn_A").Worksheets("Daten_Wohn_A").Activate
        Workbooks.Open ThisWorkbook.Path & "\Daten\Wohn_A.xlsx"
    '#####

Dim zelle As Range, arrTemp(), tmpCounter As Long        'Test1


    '+---------------------------------------------------------------------------------------------+
    '| Filter und sortieren                                         |
    '+---------------------------------------------------------------------------------------------+

    
    Cells.Select
    Range("C5005").Activate
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$AA$5002").AutoFilter Field:=11, Criteria1:="<>"
    ActiveSheet.Range("$A$1:$AA$5002").AutoFilter Field:=19, Criteria1:="="
    ActiveSheet.Range("$A$1:$AA$5002").AutoFilter Field:=13, Criteria1:="="
    Columns("O:O").Select
    ActiveWorkbook.Worksheets("Daten_Wohn_A").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Daten_Wohn_A").Sort.SortFields.Add Key:=Range( _
        "O2:O5002"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Daten_Wohn_A").Sort
        .SetRange Range("A4:S5000")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    '+---------------------------------------------------------------------------------------------+
    '|  Schreibt die gefilterten und sortierten Zeilen in eine ListBox                             |
    '+---------------------------------------------------------------------------------------------+

        For Each zelle In Intersect(Tabelle2.UsedRange.SpecialCells(xlCellTypeVisible), ThisWorkbook.Worksheets("Daten_Wohn_A").Columns(1))
            ReDim Preserve arrTemp(tmpCounter)
            arrTemp(tmpCounter) = zelle.Row
            tmpCounter = tmpCounter + 1
        Next


    For tmpCounter = 1 To UBound(arrTemp)
       With UserForm99.ListBox1

          .AddItem Tabelle2.Cells(arrTemp(tmpCounter), 1)
          .List(.ListCount - 1, 1) = Tabelle2.Cells(arrTemp(tmpCounter), 2)
          .List(.ListCount - 1, 2) = Tabelle2.Cells(arrTemp(tmpCounter), 3)
          .List(.ListCount - 1, 3) = Tabelle2.Cells(arrTemp(tmpCounter), 4)
          .List(.ListCount - 1, 4) = Tabelle2.Cells(arrTemp(tmpCounter), 15)
          .List(.ListCount - 1, 5) = Tabelle2.Cells(arrTemp(tmpCounter), 13)
          .List(.ListCount - 1, 6) = Tabelle2.Cells(arrTemp(tmpCounter), 16)
       End With
    Next


End Sub

Ich bekomme jetzt nen Laufzeitfehler 9. Vorher, als das Tabellenblatt noch in der selben Datei lag, hat es bei Angabe des Sheets funktioniert. Kann das mit der Variante im Code überhaupt noch klappen? Hier oben habe ich versucht schon auf die betreffende Datei zu "verlinken". Oder muss das Filtern und sortieren über einen Code bereits in der Datei selbst beim öffnen oder so erfolgen? Mmmh... doch keine gute Idee Daten und Programm zu trennen?

Grüße und guten Start in die neue Woche!
Top
#29
Hallöchen,
schaue mal nach, ob es Tabelle2 gibt. Durch die Trennung könnte es ja sein, dass dem nicht mehr so ist Sad

Das dürfte auch nicht funktionieren:
... Intersect(Tabelle2.UsedRange.SpecialCells(xlCellTypeVisible), ThisWorkbook.Worksheets("Daten_Wohn_A").Columns(1))
Aus 2 verschiedenen Tabellen oder Mappen gibt es keinen sich überschneidenden Bereich Sad
Ich weiß da auch nicht, wozu Du die Spalte A von irgendwo ins Spiel bringst. Du willst doch einfach nur ein Array der Zeilennummern der sichtbaren Zellen des benutzten Bereichs bilden. Da sollte folgendes reichen:
For Each zelle In Tabelle2.UsedRange.SpecialCells(xlCellTypeVisible
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#30
Hallo André,

hab das heute mal mit der Datenverbindung auf dem Behördenrechner probiert und dort kommen mir die Sicherheitseinstellungen in die Quere. Egal was ich mache, die Datenverbindungen werden immer Deaktiviert. Vermute, dass da was vom Admin gesperrt wurde und wen dem so ist, sicher nicht ohne Grund und da lasse ich dann mal besser die Finger von. Alles zurück in eine Datei gestopft und das funktioniert ja auch. Danke dennoch!!!

Grüße
Top


Gehe zu:


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