Microsoft Excel

Herbers Excel/VBA-Archiv

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

Beim Speichern Daten übertragen | Herbers Excel-Forum


Betrifft: Beim Speichern Daten übertragen von: Markus
Geschrieben am: 24.11.2009 11:39:53

Hallo zusammen,

würde gerne Eure Meinung zu folgendem Vorhaben hören/lesen. Ich hatte in folgendem Beitrag https://www.herber.de/forum/archiv/1076to1080/t1077439.htm bereits Eure Hilfe erhalten und das funktioniert auch sehr gut. Es geht vom Prinzip um`s gleiche Thema nur anders gelöst. Im alten Beitrag wurden Daten ausgelesen und importiert. Nun möchte ich gerne beim Speichern die Daten übertragen. Ich erhoffe mir dadurch einen kleinen Zeitvorteil (für mich).
In einer Excel-Anwendung werden auf dem Tabellenblatt "Schlüsselnummern" in Zeile 2 von Spalte A bis EA Daten gespeichert. Diese Daten möchte ich nun beim Speichern der Anwendung in eine Datenbank / Excelblatt "November" auf dem Laufwerk H übertragen. Diese Datenbank ist normalerweise geschlossen. Also müsste diese dann beim Speichern der Anwendung erst geöffnet und dann wieder geschlossen werden. Jetzt könnten allerdings im schlimmsten Fall mehrere Anwender beim Speichern zeitgleich auf diese Datenbank zu greifen. Kann oder wird es hierbei zu Konflikten kommen? Dann würde ich auch gerne beim Speichern der Anwendung eine Abfrage über die Datenbank laufen lassen, ob der Datensatz vorhanden ist und wenn ja, dann diesen Überschreiben. Ansonsten die Daten in der nächsten freien Zeile schreiben. Die Datensätze sind über eine Vertragsnummer in Spalte A eindeutig identifizierbar.

Schon mal Danke fürs Lesen :-) und Meinungen bzw. Lösungsansätze sind erwünscht.

Markus

  

Betrifft: AW: Beim Speichern Daten übertragen von: fcs
Geschrieben am: 24.11.2009 22:15:29

Hallo Markus,

das Problem, dass evtl. 2 Personen gleichzeitig die Speichernaktion versuchen kann man nur bedingt umschiffen. Wenn es nicht zu viele Daten sind, dann dauert der Speichervorgang ja nur 1 bis 2 paar Sekunden.

Ansonsten ist es relativ einfach, die Daten zu speichern. Man kann das Ereignismakro Workbook_BeforeSave nutzen um den Datentransfer zu realiseren.

Nachfolgend ein Beispielmakro.

Gruß
Franz

'###                   Prozedur in DieseArbeitsmappe            ###
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  Dim wbAktiv As Workbook, wbZentral As Workbook, strZentral As String
  Dim wksDaten As Worksheet, wksZiel As Worksheet
  Dim Spalte As Long, Zeile As Long
  Dim varSchluessel, ZelleSchluessel As Range, ZeileZiel As Long
  'Name der Datenbank-Datei
  strZentral = "H:\Verzeichnis\ZentralDatei.XLS"
  'strZentral = "C:\Users\Public\Test\ZentralDatei.XLS"
  'Aktive Datei merken
  Set wbAktiv = ActiveWorkbook
  'Tabellenblatt mit Daten in aktiver Datei setzen
  Set wksDaten = wbAktiv.Worksheets("Schlüsselnamen")
  'Zentrale Datenbank - öffnen
  Application.ScreenUpdating = False
  Set wbZentral = Application.Workbooks.Open(Filename:=strZentral)
  If wbZentral.ReadOnly = True Then
    Cancel = True
    wbZentral.Close savechanges:=False
    Application.ScreenUpdating = True
    MsgBox "Die Datei """ & strZentral & """ ist momentan in Benutzung." & vbLf _
      & "Bitte später versuchen zu speichern."
  Else
    'Zielblatt setzen
    Set wksZiel = wbZentral.Worksheets("November")
    'Vertragsnummer in Spalte 1 in der Daten-Datei abarbeiten
    With wksDaten
'      For Zeile = 2 To .Cells(.Rows.Count, 1).End(xlUp).Column
        Zeile = 2 'Zeile mit den zu übertragenden Daten
        varSchluessel = .Cells(Zeile, 1).Value
        'In Zielblatt Spalte 1 (A) die Vertragsnummer suchen
        With wksZiel
          Set ZelleSchluessel = .Columns(1).Find(What:=varSchluessel, LookIn:=xlValues, _
            lookat:=xlWhole)
          If ZelleSchluessel Is Nothing Then
            'Schlüssel noch nicht vorhanden, nächste freie Zeile in Spalte 1 mit Schlüsseln
            ZeileZiel = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
          Else
            ZeileZiel = ZelleSchluessel.Row
          End If
        End With
        'Daten nach Ziel übertragen
        .Range(.Cells(Zeile, 1), .Cells(Zeile, 131)).Copy _
              Destination:=wksZiel.Cells(ZeileZiel, 1)
'      Next
    End With
    'Zentrale Datei speichern und  wieder schließen
    wbZentral.Save
    wbZentral.Close
    Application.ScreenUpdating = False
  End If
End Sub



  

Betrifft: Laufzeitfehler 9 von: Markus
Geschrieben am: 25.11.2009 10:12:03

Hallo Franz,

erst mal vielen Dank für dieses tolle Makro. Funktioniert fast perfekt. Hierfür schon mal ein dickes FREU! Ich habe aber leider noch folgendes Problem. In der Anwendung habe ich einen CommandButton eingebaut, mit dem der Nutzer die Anwendung automatisch druckt, speichert und schließt. Hier der Code dafür:

Private Sub CommandButton1_Click()

Application.ScreenUpdating = False

If Range("I27") = "2" Then
    ActiveSheet.PrintOut
Else
    MsgBox "Bitte Scorebogen vervollständigen! Scorebogen wurde NICHT gespeichert und  _
ausgedruckt!"
    Exit Sub
End If
ActiveWorkbook.SaveAs Filename:="H:\Scoring - Privatkunden\Privatkundenscoring\" & Range("K2") & _
 "\" _
& Range("B4") & Range("D4") & ".XLS"

Application.ScreenUpdating = True

End Sub
Ich vermute das diese Anweisung mit Deinem Code sich nicht verträgt, denn beim Debuggen wird mir diese Zeile aus deinem Makro angezeigt:

Set wksZiel = wbZentral.Worksheets("November")

Wenn ich den eingebauten CommandButton drücke, kommt der Laufzeitfehler. Wenn ich nur das Speichersymbol drücke, werden die Daten aus dem Blatt "Schlüsselnummern" korrekt in die Datenbank geschrieben.

Kannst Du mir hier noch mal helfen?

Zum Thema "mehrere Anwender" speichern gleichzeitig. Kann man das eventuell mit einer Schleife versehen und so lange versuchen bis die Daten gespeichert sind?

Danke und Grüße

Markus


  

Betrifft: AW: Laufzeitfehler 9 von: Björn B.
Geschrieben am: 25.11.2009 11:17:58

Hallo,

hab jetzt nicht alles durchgelesen und verstanden, was das Makro macht.
Aber Laufzeitfehler 9 bedeutet: "Index außerhalb des gültigen Bereichs".
Das passiert, wenn du eine Mappe oder ein Blatt versuchst zu aktivieren, dass es gar nicht gibt.

Da der Fehler bei "Set wksZiel = wbZentral.Worksheets("November")" kommt, ist meine Vermutung, dass Du entweder kein Blatt "November hast, oder was mit wbZentral nicht stimmt. Schau auch mal auf Rechtschreibfehler, vielleicht heißt Dein Blatt ja "Novenber". Soll keine Blödmache sein, ist mir auch schon so gegangen...

Gruß
Björn B.


  

Betrifft: ...leider nein....... von: Markus
Geschrieben am: 25.11.2009 11:57:50

Hi Björn,

leider liegt`s nicht daran, obwohl so ein Fehler Original von mir kommen könnte...... Denn wenn ich in meiner Symbolleiste auf das Speichern-Symbol klicke, dann werden mir die Daten in die Datenbank geschrieben. Ich bekomme diesen Fehler nur dann, wenn ich den CommandButton benutze. Irgendwie hängt es wohl mit den unterschiedlichen Speicherorten zusammen. Denn ich möchte die Excelmappe in dem Zielort H:\Scoring - Privatkunden\Privatkundenscoring (dies geschieht über den Button) und nur die Daten der Exceltabelle "Schlüsselnummern" in dem Zielort H:\November speichern.

Grüße

Markus


  

Betrifft: AW: ...leider nein....... von: fcs
Geschrieben am: 25.11.2009 14:52:44

Hallo Markus,

irgendwie geht die Kombination aus Workbook-Ereignis-Makro und Button-Makro in der Form nicht.

Ich hab noch ein wenig rumexperimentiert und die Prozeduren weitestgend in allgemeine Module ausgelagert. Jetzt funktioniert es bei mir.

Das Modul "ModulSpeichern" kannst du so deine Datei kopieren und Dateinamen/Verzeichnisse entsprechend anpassen. Die Prozeduren für den Button und DieseArbeitsmappe muss du auch entsprechend übernehmen.

Gruß
Franz
https://www.herber.de/bbs/user/66160.xls


  

Betrifft: werde testen....leider erst Morgen...... von: Markus
Geschrieben am: 25.11.2009 15:26:48

Hallo Franz,

sorry, werd es heute leider nicht mehr testen können. Werde mich aber Morgen dann melden. Erstmal Danke für die tolle Hilfe und Sorry für die ganze Arbeit.

Bis Morgen

Markus


  

Betrifft: ..bin noch am testen...... von: Markus
Geschrieben am: 26.11.2009 10:08:19

Hallo Franz,

bin noch am testen....kämpfe mit meiner eigenen Unfähigkeit.....

melde mich

Markus


  

Betrifft: klappt super....Danke Franz! von: Markus
Geschrieben am: 26.11.2009 14:29:38

So, habe es gem. den Beschreibungen von Franz umgesetzt und es funktioniert super.
Schicke ein fettes Danke an das Forum und besonders an Franz. Hat mir schon zum zweiten Mal geholfen :-)!
Danke und Grüße
Markus


Beiträge aus den Excel-Beispielen zum Thema "Beim Speichern Daten übertragen"