Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Formatierung automatisch übertragen

Betrifft: Formatierung automatisch übertragen von: Schmitty
Geschrieben am: 21.08.2014 09:14:56

Guten Morgen zusammen,

ich arbeite immer noch an meiner Kundendatei und versuche jetzt einen anderen Weg.

Grundvorraussetzung: Eine Excel-Datei liegt auf dem Server.
Eine weitere Datei befindet sich bei jedem User lokal auf dem Desktop und deren Inhalt wird von der Server-Datei gespiegelt (Durch eine Formel für z. B. Zelle A1: "='[Adressen.xlsm]Kundendatei'!A!)).
Der Vorteil ist der, dass ich die Server-Datei sicher ist und ich nur öffnen muss, wenn ich etwas ändern möchte, zum Nachschlagen der Kundenparameter reicht die Lokale Datei immer aus!

Wichtig für mich ist aber, das die Formatierung (Schriftart, Hintergrundfarbe und Zellenhöhe) automatisch aus der Server-Datei in die Lokale-Datei jeweils übernommen wird! Nur so macht die Spiegelung der Daten für mich Sinn. Ich denke, dass wird nur über VBA gehen, oder irre ich mich da?

Wie kann ich dass dann in VBA umsetzen?

Danke im Voraus & Gruß
Christian

  

Betrifft: AW: Formatierung automatisch übertragen von: Hajo_Zi
Geschrieben am: 21.08.2014 09:37:49

Hallo Christian,

schicke doch jedem die Datei, bei Änderung ist wohl einfacher.

GrußformelHomepage


  

Betrifft: AW: Formatierung automatisch übertragen von: Schmitty
Geschrieben am: 21.08.2014 10:05:11

Hallo Hajo,

die Datei zu verschicken ist nicht soweit möglich.

E sollen viele Leute (Mitarbeiter) auf die Sever-Datei zugreifen. Da freigegebene Arbeitsmappen zu viele Nachteile haben und alle Mitarbeiter auf dem gleichen Stand seinen sollen, habe ich mir das wie beschrieben überlegt. Simit hätte dann jeder immer den aktuellen Datensatz und nur bei Änderungen müsste ich die Server-Datei bearbeiten.
Ein einfaches Kopieren und verteilen der Datei ist somit sehr aufwendig.

Gruß
Christian


  

Betrifft: AW: Formatierung automatisch übertragen von: fcs
Geschrieben am: 21.08.2014 11:17:48

Hallo Christian,

wenn deine Kundenadressdatenbank pro Kunde/Kontakt eine Tabellenzeile enthält inkl. eines eindeutigen ID-Feldes, dann könntest du die Daten in den lokalen Kopien auch via Datenimport aktualisieren, z.B. beim Öffnen der Datei, aber ohne Aktualisierung im Hintergrund. Die einzelnen Spalten der importierten Liste kannst du individuell Formatieren, die Formatierung bleibt bei der Aktualisierun erhalten.

In einem 2. Blatt der lokalen Datei könnte man ggf. auch die Anzeige eines einzelnen Datensatzes hübsch aufbereiten, der z.B. über eine Kombobox aus der Gesamtliste ausgewählt wird.


Wenn du bei deiner Formel-Lösung bleiben willst/musst, dann kannst du die Spalten/Zeilen ja komplett vorformatieren. ein Problem sind hier die Zeilenhöhe und ggf. verbundeen Zellen, die hoffentlich nicht verwendet werden.

Die Zeilenhöhe müsste irgendwie per Makro nach dem Öffnen und neuberechnen der Mappe angepasst werden. Im einfachsten Fall mit einem Autofit für die Zeilenhöhe über alle Zeilen. Wenns es kompliziert wird dann pro Kundendatensatz nach einem bestimmten Schema.

Gruß
Franz


  

Betrifft: Zellbereich mittels VBA kopieren? von: Schmitty
Geschrieben am: 21.08.2014 11:46:37

Hallo Franz, danke für deine Antwort.

Es wäre schön, wenn die Daten unmittelbar bzw. in regelmäßigen Abständen von der Server Datei aktualisiert werden würden.

Ich bin jetzt schon einen Schritt weiter. Anstatt die Formatierung einer Zelle zu kopieren, möchte ich einen ganzen Zellen-Bereich der Serverdatei zur lokalen Datei mittels VBA kopieren. Somit habe ich immer den Inhalt einer Zelle aktuell, als auch die Formatierung.

Ich weiß im Moment nur nicht, wie die Geschwindigkeit bei einem solchen Makro ist (es würde sich jedes Mal um 2.500 Zellen handeln) und ob das bei einer geschlossenen Server-Datei funktioniert...

Gruß
Christian


  

Betrifft: AW: Zellbereich mittels VBA kopieren? von: fcs
Geschrieben am: 21.08.2014 12:27:45

Hallo Christian,

bei geschlossenenr Serverdatei funktioniert die Formatübernahme nicht.

Es ist aber kein Problem, die Serverdatei von der lokalen Datei aus kurz schreibgeschützt zu öffen und die Formate und Formeln bzw. Werte zu aktualiseren und die Server-Dateidatei wieder zu schliessen.

Bei ca. 2500 Datenzeilen ist das kein großes Zeitproblem - Sekundenbereich bei ordentlicher Programmierung. Man kann die Aktion ohne Bildschirmaktualisierung ausführen dann sieht man max. in der Taskleiste ein kurzes Flackern des Dateisymbols. Mit etwas mehr Aufwand bekommt man es auch hin, die Kopieraktion komplett im Hntergrund ablaufen zu lassen.

Die Kopieraktion muss im Workbook_Open-Ereignismakro der lokelen Datei integriert sein bzw. von dort aus gestartet werden.

Gruß
Franz


  

Betrifft: AW: Zellbereich mittels VBA kopieren? von: Schmitty
Geschrieben am: 21.08.2014 13:22:17

Hallo Franz,

deine Antwort ermutigt mich ;-) Wie müssten denn dann der Code aussehen, wenn folgende Bedingungen vorliegen:

- Beide Dateien (die Master-Kundendatei (Kundendatei.xlms) und die Recherche-Datei (Recherche.xlms) (welche ich später einfach mit den diversen Desktops verknüpfe)) liegen im gleichen Ordner auf dem Server.
- Die Zeilen 6:2500 sollen von der Masterdatei in die Recherche-Datei einz zu einz (also wieder nach 6:2500) kopiert werden.

Gruß
Christian


  

Betrifft: AW: Zellbereich mittels VBA kopieren? von: fcs
Geschrieben am: 21.08.2014 15:08:16

Hallo Christian,

nach folgend die eforderlichen Makros.
Wenn in "Recherche.xlsm" keine Makros enthalten sind, dann kann man die Datei auch ohne Makros speichern mit der Endung "xlsx".

Die Pfade und Namen der Dateien und die Namen der Tabellenblaätter im Code muss du noch anpassen.

Gruß
Franz

'Makro in einem allgemeinne Modul - z.B. in der Masterdatei
'Makro bei geöffneter/aktiver Masterdatei ausführen, z.B. bevor die Masterdatei _
    geschlossen oder gespeichert wird.
Sub Recherche_Update()
  'Recherche-Datei mit Daten aus Masterdatei aktualisieren
  Dim wkbMaster As Workbook, wksMaster As Worksheet, Zeile_LM As Long
  Dim wkbRecherche As Workbook, wksRecherche As Worksheet, Zeile_LR As Long
  Dim StatusCalc As Long
  If MsgBox("Recherche-Datei jetzt aktualisieren", _
      vbQuestion + vbOKCancel, "Recherchedatei aktualisieren") _
      = vbCancel Then Exit Sub
  
  Set wkbMaster = ActiveWorkbook
  Set wksMaster = wkbMaster.Worksheets("Kundenliste")
  
  'Makrobremsen lösen
  With Application
    .EnableEvents = False
    StatusCalc = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
  End With
  
  Set wkbRecherche = Application.Workbooks.Open(Filename:=wkbMaster.Path _
        & Application.PathSeparator & "Recherche.xlsm")
  Set wksRecherche = wkbRecherche.Worksheets("Kundenliste")
  
  With wksRecherche
    With .UsedRange
      Zeile_LR = .Row + .Rows.Count - 1
    End With
    If Zeile_LR > 5 Then
      'Altdaten löschen
      With .Range(.Rows(6), .Rows(Zeile_LR))
        .ClearContents
        .ClearFormats
      End With
    End If
  End With
  
  With wksMaster
    With .UsedRange
      Zeile_LM = .Row + .Rows.Count - 1
    End With
    If Zeile_LR > 5 Then
      'Daten kopieren nach Recherche
      With .Range(.Rows(6), .Rows(Zeile_LM))
        .Copy Destination:=wksRecherche.Cells(6, 1)
      End With
    End If
  End With
  wkbRecherche.Close savechanges:=True
  
  'Makrobremsen zurücksetzen
  With Application
    .EnableEvents = True
    .Calculation = StatusCalc
    .ScreenUpdating = True
  End With
End Sub

'Makros unter "DieseArbeitsmape" der lokalen Datei

Private Sub Workbook_Open()
  Call Lokal_Update
End Sub

Private Sub Lokal_Update()
  'Lokale Datei mit den Formatierungen aus der Recherche-Datei aktualisieren
  Dim wkbLokal As Workbook, wksLokal As Worksheet, Zeile_LL As Long
  Dim wkbRecherche As Workbook, wksRecherche As Worksheet, Zeile_LR As Long
  Dim strRecherche As String
  Dim StatusCalc As Long
  
  'Pfad\Dateiname der Recherchedatei
  strRecherche = "Y:\Test\Recherche.xlsm"
  'Prüfen ob Recherche-Datei vorhanden
  If Dir(strRecherche) = "" Then
    MsgBox "Recherche-Datei """ & strRecherche & """ nicht gefunden!", _
        vbOKOnly, "Recherche-Datei suchen"
  End If
  
  Application.StatusBar = "Formatierung wird mit Recherchedatei abgeglichen"
  Set wkbLokal = ThisWorkbook
  Set wksLokal = wkbLokal.Worksheets("Kundenliste")
  
  'Makrobremsen lösen
  With Application
    .EnableEvents = False
    StatusCalc = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
  End With
  
  'Recherche-Datei schreibgeschützt öffnen
  Set wkbRecherche = Application.Workbooks.Open(strRecherche, ReadOnly:=True, UpdateLinks:= _
False)
  Set wksRecherche = wkbRecherche.Worksheets("Kundenliste")
  
  With wksLokal
    With .UsedRange
      Zeile_LL = .Row + .Rows.Count - 1
    End With
    If Zeile_LL > 5 Then
      'alte Formatierungen löschen
      With .Range(.Rows(6), .Rows(Zeile_LL))
        .ClearFormats
      End With
    End If
  End With
  
  With wksRecherche
    With .UsedRange
      Zeile_LR = .Row + .Rows.Count - 1
    End With
    If Zeile_LR > 5 Then
      With .Range(.Rows(6), .Rows(Zeile_LR))
        .Copy
        wksLokal.Cells(6, 1).PasteSpecial Paste:=xlPasteFormats
        Application.CutCopyMode = False
      End With
    End If
  End With
  wkbRecherche.Close savechanges:=False
  
  Range("A6").Select
  'Makrobremsen zurücksetzen
  With Application
    .EnableEvents = True
    .Calculation = StatusCalc
    .ScreenUpdating = True
  End With
  Application.StatusBar = False
End Sub



  

Betrifft: AW: Zellbereich mittels VBA kopieren? von: Schmitty
Geschrieben am: 21.08.2014 15:40:45

Ui, ui ,ui...

Hallo Franz, danke für die ganze Arbeit. Ich versuche gerade Sie zu verstehen... ;-)

Erst mal vorab, in der Recherche.xlsm sind noch weitere Makros vorhanden, also muss ich diese Dateiendung nutzen...

Ich habe aber noch ein paar Fragen...

zum ersten Code:
Ich glaube, für meinen speziellen Fall läuft das Makro falsch herum. Du hast das zwar richtig "programmiert" aber ich erkenne durch deinen Code einen Fehler in der Planung!
Ich möchte ja einen Master-Kundendatei auf dem Server haben, welche nur im Bedarfsfall geöffnet und geändert werden soll. Ursprünglich habe ich mir dann überlegt, die Recherche-Datei auch auf den Server zu legen (hätte den Vorteil gehabt, dass ich diese Datei auch schnell global hätte ändern können) und einfach eine Desktopverknüfung für jeden User anzulegen. Mir ist jetzt aber aufgefallen, dass das so nicht funktioniert. Ich muss ja damit rechnen, dass mehrere Personen gleichzeitig eine Recherche-Datei geöffnet haben. Aus diesem macht es glaube ich nur Sinn, wenn jeder User jetzt wirklich lokal (z.B. auf dem Desktop anstatt der geplanten Verknüfung) eine Recherche-Datei vorfindet und diese Mittels Makro (ob automatisch oder mit einem Button weiß ich noch nicht) die jeweiligen Aktualisierungen von der Master-Datei auf dem Server "abholt" ...

Reicht es jetzt aus, deinen zweiten Code so umzuändern, dass der Zugriff direkt auf die Master-Datei auf dem Server erfolgt und nicht über den "Umweg" der Recherche-Datei?

Gruß
Christian


  

Betrifft: AW: Zellbereich mittels VBA kopieren? von: fcs
Geschrieben am: 21.08.2014 16:01:48

Hallo Christian,

ich meine schon dass das Konzept so passt.

Die RechercheDatei wird nur bei Bedarf mit aktualisierten Daten gefüttert, z.B. nach Änderungen/Ergänzung von Daten in der Masterdatei.


Die Recherche-Datei wird von den lokalen Rechnern beim Öffnen der Lokalen Dateien immer nur kurzzeitig und schreibgeschützt geöffnet. Das sollte -da schreibgeschützt geöffnet wird- selbst dann funktionieren, wenn zwei oder mehrere User gleichzeitig auf die Recherche-Datei zugreifen.
Das kannst du auch Testen, indem du 2 User bittest die Recherchedatei manuell schreibgeschützt zu öffnen. Da sollte keine Meldung "Datei soundso wird gerade benutzvon ..." kommen.

Gruß
Franz


  

Betrifft: AW: Zellbereich mittels VBA kopieren? von: Schmitty
Geschrieben am: 22.08.2014 08:52:24

Guten Morgen Franz,

ich habe jetzt mal ne Menge herum probiert und getestet.

Mir erschließt sich im Moment noch nicht der Sinn der Recherche-Datei auf dem Server neben der Master-Datei, bzw. ich sehe nicht den Vorteil ggenüber folgendem Beispiel:
- Eine Masterdatei auf dem Server, die geöffnet werden muss, wenn man Änderungen vornimmt.
- Auf jeden Rechner eine lokale Recherche-Datei, welche immer schreibgeschütz ist (da ja das ändern von Daten in dieser Datei sinnlos ist) und entweder bei Knopfdruck oder besser regelmäßig (z. B. alle 5 Minuten) seinen Inhalt neu von der Masterdatei kopiert.

Trotzdem habe ich deinen Code mal ausprobiert, bekomme ihn aber leider nicht zum laufen.
Folgenden Code habe ich in die Masterdatei in einem eigenen Modul geschrieben:

  Sub Recherche_Update()
    'Recherche-Datei mit Daten aus Masterdatei aktualisieren
    Dim wkbMaster As Workbook, wksMaster As Worksheet, Zeile_LM As Long
    Dim wkbRecherche As Workbook, wksRecherche As Worksheet, Zeile_LR As Long
    Dim StatusCalc As Long
    If MsgBox("Recherche-Datei jetzt aktualisieren", _
        vbQuestion + vbOKCancel, "Recherchedatei aktualisieren") _
        = vbCancel Then Exit Sub
    
    Set wkbMaster = ActiveWorkbook
    Set wksMaster = wkbMaster.Worksheets("Adressen")
    
    'Makrobremsen lösen
    With Application
      .EnableEvents = False
      StatusCalc = .Calculation
      .Calculation = xlCalculationManual
      .ScreenUpdating = False
    End With
    
    Set wkbRecherche = Application.Workbooks.Open(Filename:=wkbMaster.Path _
          & Application.PathSeparator & "Recherche.xlsm")
    Set wksRecherche = wkbRecherche.Worksheets("Adressen")
    
    With wksRecherche
      With .UsedRange
        Zeile_LR = .Row + .Rows.Count - 1
      End With
      If Zeile_LR > 5 Then
        'Altdaten löschen
        With .Range(.Rows(6), .Rows(Zeile_LR))
          .ClearContents
          .ClearFormats
        End With
      End If
    End With
    
    With wksMaster
      With .UsedRange
        Zeile_LM = .Row + .Rows.Count - 1
      End With
      If Zeile_LR > 5 Then
        'Daten kopieren nach Recherche
        With .Range(.Rows(6), .Rows(Zeile_LM))
          .Copy Destination:=wksRecherche.Cells(6, 1)
        End With
      End If
    End With
    wkbRecherche.Close savechanges:=True
    
    'Makrobremsen zurücksetzen
    With Application
      .EnableEvents = True
      .Calculation = StatusCalc
      .ScreenUpdating = True
    End With
  End Sub
Die Recherche-Datei befindet sich aktuell im gleichen Ordner auf dem Server wie die Masterdatei.
Leider wird schon die Recherche-Datei nicht aktuallisiert.

Dann habe ich mir auf dem Desktop lokal eine Datei namens "Lokal.xlsm" erstellt und dort im Tabellenblatt folgenden Code eingegeben:
Private Sub Workbook_Open()
    Call Lokal_Update
  End Sub
  
  Private Sub Lokal_Update()
    'Lokale Datei mit den Formatierungen aus der Recherche-Datei aktualisieren
    Dim wkbLokal As Workbook, wksLokal As Worksheet, Zeile_LL As Long
    Dim wkbRecherche As Workbook, wksRecherche As Worksheet, Zeile_LR As Long
    Dim strRecherche As String
    Dim StatusCalc As Long
    
    'Pfad\Dateiname der Recherchedatei
    strRecherche = "Z:\Kartei\Recherche.xlsm"
    'Prüfen ob Recherche-Datei vorhanden
    If Dir(strRecherche) = "" Then
      MsgBox "Recherche-Datei """ & strRecherche & """ nicht gefunden!", _
          vbOKOnly, "Recherche-Datei suchen"
    End If
    
    Application.StatusBar = "Formatierung wird mit Recherchedatei abgeglichen"
    Set wkbLokal = ThisWorkbook
    Set wksLokal = wkbLokal.Worksheets("Kundenliste")
    
    'Makrobremsen lösen
    With Application
      .EnableEvents = False
      StatusCalc = .Calculation
      .Calculation = xlCalculationManual
      .ScreenUpdating = False
    End With
    
    'Recherche-Datei schreibgeschützt öffnen
    Set wkbRecherche = Application.Workbooks.Open(strRecherche, ReadOnly:=True, UpdateLinks:= _
  False)
    Set wksRecherche = wkbRecherche.Worksheets("Adressen")
    
    With wksLokal
      With .UsedRange
        Zeile_LL = .Row + .Rows.Count - 1
      End With
      If Zeile_LL > 5 Then
        'alte Formatierungen löschen
        With .Range(.Rows(6), .Rows(Zeile_LL))
          .ClearFormats
        End With
      End If
    End With
    
    With wksRecherche
      With .UsedRange
        Zeile_LR = .Row + .Rows.Count - 1
      End With
      If Zeile_LR > 5 Then
        With .Range(.Rows(6), .Rows(Zeile_LR))
          .Copy
          wksLokal.Cells(6, 1).PasteSpecial Paste:=xlPasteFormats
          Application.CutCopyMode = False
        End With
      End If
    End With
    wkbRecherche.Close savechanges:=False
    
    Range("A6").Select
    'Makrobremsen zurücksetzen
    With Application
      .EnableEvents = True
      .Calculation = StatusCalc
      .ScreenUpdating = True
    End With
    Application.StatusBar = False
  End Sub
Leider wird auch hier nicht die Formatierung der Recherche-Datei übernommen.

Gruß
Christian


  

Betrifft: AW: Zellbereich mittels VBA kopieren? von: fcs
Geschrieben am: 22.08.2014 11:37:11

Hallo Christian,

der Update der Recherche-Datei aus der Masterdatei heraus sollte schon funktionieren, wenn du das Makro manuell startest. Oder werden irgendwelche Fehlermeldungen angezeigt?
Probiere mal das Makro schrittweise auszuführen - nächste Makrozeile dann immer mit F8 ausführen.
Das könnte man noch automatisieren indem man das Makro vom Ereignis-Makro Workbook_BeforeSave starten läßt.


In der lokalen Datei musst du die Makros nicht unter dem Code des Tabellenblatts einfügen sondern unter "DieseArbeitsmappe" oder englisch "ThisWorkbook" - das hatte ich aber schon beim Posten der Codes dazugeschrieben.


Mir erschließt sich im Moment noch nicht der Sinn der Recherche-Datei auf dem Server neben der Master-Datei,
Das war ja wohl deine ursprüngliche Idee, um dann per Formel die Daten aus der Recherche-Datei in die lokale Datei beim jeweiligen Anwender zu übernehmen.
Das von mir erstellte Makro für lokale Datei aktualisiert dann beim Öffnen die Zeilenformatierungen ab Zeile 6

bzw. ich sehe nicht den Vorteil ggenüber folgendem Beispiel:
- Eine Masterdatei auf dem Server, die geöffnet werden muss, wenn man Änderungen vornimmt.
- Auf jeden Rechner eine lokale Recherche-Datei, welche immer schreibgeschütz ist (da ja das ändern von Daten in dieser Datei sinnlos ist) und entweder bei Knopfdruck oder besser regelmäßig (z. B. alle 5 Minuten) seinen Inhalt neu von der Masterdatei kopiert.


Es ist fast egal, ob du auf dem Server nur mit der Masterdatei oder mit Masterdatei+Recherchedatei arbeitest. Ich persönlich würde mich mit einer zweiten Datei, auf die die lokalen Rechner zugreifen, wohler fühlen. Wenn du nur mit einer Masterdatei arbeitest, dann greifen die lokalen Rechner immer auf den zuletzt gespeicherten Stand der Datei zurück - nie auf den Stand der geöffneten/aktuell bearbeitetn Masterdatei. D.h. der Bearbeiter der Masterdatei muss die Datei auch regelmäßig speichern, wenn du die Notwendigkeit siehst, dass die lokalen Dateien alle 5 Minuten aktualisiert werden sollten.
Solch eine zeitgesteuerte Aktualisierung kann man innerhalb der Datei realiiseren, man muss dann aber auch dafür sorgen, dass die Aktualisierung vor dem Schliessen der Datei gestoppt wird.
Ich persönlich bevorzuge hier die Aktualisierung per Schaltfläche durch den Menschen vor dem Bildschirm.

An dem Makro zur Aktualisierung der lokalen Datei sind da nur geringe Anpassungen erforderlich.

  With wksLokal
    With .UsedRange
      Zeile_LL = .Row + .Rows.Count - 1
    End With
    If Zeile_LL > 5 Then
      'alte Daten löschen                                   'geändert
      With .Range(.Rows(6), .Rows(Zeile_LL))
        .Clear                                              'geändert
      End With
    End If
  End With
  
  With wksRecherche
    With .UsedRange
      Zeile_LR = .Row + .Rows.Count - 1
    End With
    If Zeile_LR > 5 Then
      With .Range(.Rows(6), .Rows(Zeile_LR))
        .Copy wksLokal.Cells(6, 1)                         'geändert
        Application.CutCopyMode = False
      End With
    End If
  End With
  wkbRecherche.Close savechanges:=False
Auf den Schreibschutz der lokalen Datei würde ich verzichten. Das führt dann beim Öffnen und oder Schließen zu auf die Dauer lästigen Nachfragen von Excel.
Ich würde einfach vor dem Schliessen der Datei den Datei-Status auf gespeichert setzen.
'Makros unter "DieseArbeitsmape" der lokalen Datei

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Me.Saved = True
End Sub
Dann gibt es keine Nachfrage zum Speichern der geänderten Datei.

Gruß
Franz


  

Betrifft: AW: Zellbereich mittels VBA kopieren? von: Schmitty
Geschrieben am: 26.08.2014 11:05:43

Guten Morgen Franz!

Heute habe ich wieder etwas Zeit zu programmieren (zwischendurch muss ich ja auch noch etwas arbeiten *g*).

So, die Recherche-Datei wird jetzt beim manuellen ausführen des Makros aktualisiert (ich hatte einen Tabellenblattname falsch geschrieben). Ausserdem funktioniert das zweite Makro (mit der Formatierung) auch problemlos.

Somit kann ich mir jetzt überlegen, welcher Weg für meine Bedürfnisse der richtige ist.

1.) Die Master-Datei und die Recherche-Datei liegen auf dem Server. Die Daten der Kunden wird in der Recherche-Datei über eine Formel aktualisiert (z.B. Zelle F6 ='Z:\Kartei\[Adressen.xlsm]Schmitz GmbH'!F6). Das hat den Vorteil, dass alle immer den aktuellen Datensatz unmittelbar angezeigt bekommen. Mit Hilfe deines zweiten VBA-Codes kann ich dann auch bei Bedarf die Formatierung der Master-Datei mit der Recherche-Datei abgleichen. Problem: Ich habe da Zellen, die auf Grund Ihrer Größe nicht den kompletten Inhalt anzeigen können und beim Klicken in die jeweilige Zelle bekomme ich ja nur die Formel und nicht den abgeschnittenen Text zu sehen (sie extra Beitrag hier im Forum Formatierung einer Zelle (Advanced))

2.) Die Master-Datei und die Recherche-Datei liegen auf dem Server. Mittels deines ersten VBA-Makros wird kopiere ich bei Bedarf den Inhalt der Master-Datei in die Recherche-Datei. Der Vorteil gegenüber Variante 1.) ist, dass das Problem mit dem abgeschnittene Text aus Variante 1.) nicht habe, da ich den ganzen Zelleninhalt anzeigen lassen kann, indem ich in die Zelle klicke. Der Nachteil dieser Variante zwei liegt aber darin, das mehrere Leute die Recherche-Datei gleichzeitig geöffnet haben könnten und ich dann nicht weiß, wie Excel reagiert, wenn die Recherche-Datei geändert wird. Wahrscheinlich wird Excel bei jedem Anwender die Datei einfach schließen, damit die Änderungen von der Msterdatei vorgenommen werden können... Ich weiß also nicht, wie ich die Datei parallel bei allen Usern aktuell halten kann...

Gruß
Christian


  

Betrifft: AW: Zellbereich mittels VBA kopieren? von: fcs
Geschrieben am: 26.08.2014 13:11:16

Hallo Christian,

zu Variante 1:
Diese Variante aktualisiert sich "nur" beim Öffnen der Rechergedatei automatisch. Weitere Aktualisierungen erfordern vom Anwender die Datei neu zu berechnen oder die Verknüpfungen zu aktualisieren.

zu Variante 2:
Diese hat die von dir beschriebenen Probleme beim Öffnen und Aktualisieren.
Dem könnte man noch etwas entgegenwirken, indem der Status der Recherche-Datei im Dateimanager auf "schreibgeschützt" gesetzt wird. Dann öffnet die Datei bei den Anwendenr in Excel automatisch auch "schreibgeschützt". Eine Aktualisierung lokal erfordert aber immer schließen und erneutes öffnen der Datei. Beim Aktualisieren der Rechergedatei von der Masterdatei aus muss dann der schreibschutz kurzzeitg deaktiviert werden - dies könnte man ins Makro integrieren.

Ich halte immer noch die folgende Variante für die effektivste:
1. Masterdatei und Recherchedatei sind auf dem Server.
Dadurch ist die Masterdatei entkoppelt, die Aktualisierung der Rechchedatei erfolgt bei Bedarf oder automatisch bevor die Masterdatei gespeichert wird.
2. Lokal befindet sich auf den Rechnern eine Kopie der Recherchedatei mit anderen Makros.
Die lokale Datei holt sich beim Öffnen die aktuellsten Daten aus der Rechergedatei auf dem Server.
Zusätzlich besteht bei Bedarf die Möglichkeit per Schaltfläche die daten zu aktualisieren.

Gruß
Franz


  

Betrifft: AW: Zellbereich mittels VBA kopieren? von: Schmitty
Geschrieben am: 26.08.2014 13:31:49

Hallo Franz,

nochmals vielen Dank für deine schnelle Antwort und nochmal vielen Dank für deine Mühen (Das kann ich nicht oft genug wiederholen!!!).

Zu Variante 1.) Zumindets bei Excel 2010 werden diese Verknüpfungen unmittelbar aktualisiert. Ich habe es selbst heute morgen ausprobiert. Ändert sich ein Wert in der Master-Datei und wird diese dann gespeichert, ändert sich automatisch der Wert in der (auch geöffneten!) Recherche-Datei. Das ist ein erheblicher Vorteil den ich gerne nutzen würe, jedoch bleibt immer noch das Problem mit der Anzeige der abgeschnitten Zelleninhalten und ausserdem muss ich eh zum Übertragen des Komplett-Formates der Kundenliste dein Makro nutzen, welches direkt auf die Datei auf dem Server zugreifen muss.

Aus diesem Grund tendiere ich im Moment auch zur zweiten Variante, auch wenn hier die Aktuallisierung nicht unmittelbar erfolgt. Ich denke gerade darüber nach, dass man mittels eines Buttons die Daten aktualisieren kann und nach spätestens einer Stunde oder so eine "Zwangsaktualisierung" durchgeführt wird. Dafür müsste man aber dein Makro anpassen. Im Moment wirkt es ja so: Ändert sich ein Wert in der Master-Datei, wird die Änbderung in die Rechereche-Datei kopiert. Dabaei werden alle offenen Recherche-Dateien (bei den jeweiligen USern) automatisch geschlossen. Das finde ich unschön. Wenn das Makro andersherum funtionieren würde, währe es super. D. h., ich brauche in der Recherche-Datei ein Makro, welches bei Aktivierung (automatisch beim Start der Recherche-Datei und später Mittels eines Buttons) die Kundensätze aus der Master-Datei ausliesßt und die die individuelle Recherche-Datei des jeweiligen Useres aktualiesiert. Je nachdem, wie lange dieses Makro für die Arbeit braucht, setzte ich dann auch eine autoamtische Aktualisierung an, damit alle User möglichst immer über eine aktuelle Version der Kundendaten in der Recherche-Datei verfügen...

Puhh ist das kompliziert, woran man da alles denken muss... ;-)

Gruß
Christian


  

Betrifft: AW: Zellbereich mittels VBA kopieren? von: fcs
Geschrieben am: 26.08.2014 16:39:38

Hallo Christian,

wenn das Netzwerk einigermaßen flott ist, dann dauert eine Datenaktualisierung von der Serverdatei auf die lokale Datei ca. 1 bis 2 Sekunden.

Das Makro zu Aktualisierung der lokalen Daten hast du ja schon fasst fertig. In einer der von mir erstellten Versionen.

Für die regelmäßige Aktualisierung der geöffneten lokalen Datei kannst du mit der OnTime-Methode arbeiten. Dabei muss man dann "nur" dafür sorgen,

'Code in einem allgemeinen Modul  der lokalen Datei - OnTime-Methode
Option Explicit

Public pDateUpdate As Date

Sub prcStartUpdate()
  Call Lokal_Update 'Makro in einem allgemeinen Modul der Datei
  pDateUpdate = Now + TimeSerial(Hour:=0, Minute:=5, Second:=0) 'nächster UpDate-Start
  Application.OnTime earliesttime:=pDateUpdate, Procedure:="prcStartUpdate"
End Sub

Sub prcStopUpdate()
  On Error Resume Next
  'letzten OnTime-Aufruf abbrechen
  Application.OnTime earliesttime:=pDateUpdate, Procedure:="prcStartUpdate", schedule:=False
End Sub
Zugehörige Makros unter DieseArbeitsmappe
Option Explicit
'Makros unter "DieseArbeitsmape" der lokalen Datei

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Call prcStopUpdate
  Me.Saved = True 'verhindert, dass die Datei gespeichert wird, wenn die Dateigeschlossen wird
End Sub

Private Sub Workbook_Open()
  Call prcStartUpdate
End Sub

Gruß
Franz


 

Beiträge aus den Excel-Beispielen zum Thema "Formatierung automatisch übertragen"