Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1084to1088
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA-Makro zum Datenübertrag zwischen Excel-Sheets

VBA-Makro zum Datenübertrag zwischen Excel-Sheets
mctapt
Liebe VBA-Freunde,
ich muss auf der Arbeit ein Marko programmieren, mit dem sich Inhalte eines Sheets automatische beim öffnen der Datei in ein anderes übertragen lassen.
Die Idee íst dahinter:
Mein Chef will als Kontrolle der Berater sehen, mit wem sie so innerhalb der Woche telefoniert haben. Deswegen müssen dann die Teamassistenen am anfang der woche immer copy+past aus den excelsheets (sheets sind alle gleich formatiert) machen, was für sie eine riesen arbeit ist. ich soll jetzt ein makro programmieren mit dem man sich dieses copy und paste gehabe sparen kann. ziel soll es sein, dass das makro die daten aus dem beratersheet für die kalenderwoche automatisch an das zentrale excelsheet schickt. das beratersheet ist nach kalenderwochen aufgeteilt, wobei jede kalenderwoche eine neues tabellenblatt darstellt.
ich nehme mal an, dass man da eine verlinkung zwischen den sheets machen muss oder so ähnlich.
habt ihr vielleicht eine idee wie man das am besten umsetzen kann?
für ein feedback wäre ich euch dankbar.
Gruss Thomas

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: VBA-Makro zum Datenübertrag zwischen Excel-Sheets
29.06.2009 21:19:08
Josef
Hallo Thomas,
Gottlob arbeitest du nicht in einem Kernkraftwerk;-))
Stell Dir vor: Excel-gut - Nuclearphysik bescheiden
Ich muss auf der Arbeit das Reaktorkühlsystem umbauen....
Spass beiseite, wie soll das ganze ablaufen?
Wie sollen die Dateien ausgewält werden?
Wie soll die KW ausgewählt werden?
Wie lauten die Blattnamen? (KW07, 07 oder Kalenderwoche 07?)
Welche Daten sollen kopiert werden und wohin sollen diese geschrieben werden?
Gruß Sepp

AW: VBA-Makro zum Datenübertrag zwischen Excel-Sheets
30.06.2009 09:58:00
mctapt
Hallo Sepp,
tja das kann man ungefähr mit dem AKW so vergleichen. Herauskommen würde ungefähr das gleiche. Deswegen bin ich über jede Hilfe extrem dankbar.
hatte mir das so vorgestellt, dass man den tabelleninhalt des beratersheets aus der vorigen Kalanderwoche jeden Montag in das gesamte Excelsheet kopiert. Dachte das macht man am besten über eine über eine „heute funktion“ – 1 kalenderwoche. diese inhalte sollen dann entweder beim öffnen des beratersheets (sprich durch ein Makro, das im Hintergrund läuft) oder durch klicken eines commandbuttons automatisch in das zentrale excel-sheet übertragen werden, wobei man den commandbutton meiner ansicht nach auf ein unabhäniges (neues) tabellenblatt im berater sheet tun sollte (sonst müsste man in jeder kalenderwoche einen button machen).
Die tabellenblätter heißen 27. KW, 28. KW usw.
Die Daten, die aus dem Beratersheet geholt werden, gehen von A2:J . wobei nicht feststeht, wie in welcher zeile der datenbereich endet, da man je unterschiedliche viele Kundentelefonate in der woche hatte.
Im Gesamtensheet sollen sie dann auch in den Datenbereich A:J auf den tabellenblatt „Frequenz fortlaufend“ kommen, wobei die daten immer unten in die Auflistung (hat schon ca. 3000 Einträge) kommen soll. Ich denke, dass man das Ende des Sheets am besten über eine eine do-until „ “ funktion. Soll meinen, falls die letzten Zeilen leer, dann sollen die Daten in das zentralesheet eingefügt werden.
War das halbwegs verständlich?
Schon mal vielen Dank im Voraus.
Gruß
Thomas
Anzeige
AW: VBA-Makro zum Datenübertrag zwischen Excel-Sheets
30.06.2009 22:08:33
Josef
Hallo Thomas,
erstelle in der Datei zwei Module mit den Namen "basData" und "basAuxiliary" und kopiere den Code in die entsprechenden Module, auch in das Modul "DieseArbeitsmappe" den richtigen Codeteil kopieren.
Im Modul "basData" musst du den Pfad zur Gesamtdatei anpassen.
Datei speichern, schliessen und wieder öffnen, dann findest du im Zellkontextmenü einen neuen Menüpunkt "Daten übertragen ...".
' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Private Sub Workbook_Activate()
  addButton
End Sub

Private Sub Workbook_Deactivate()
  deleteButton
End Sub

' **********************************************************************
' Modul: basData Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

'### ### Pfad und Name der "Gesamtdatei" - Anpassen! ### ###
Private Const cstrTargetFileName As String = "E:\Temp\Gesamtdatei.xls"
'### ### ### ### ### ### ### ### ### ### ### ### ### ### ###


'Daten auslesen und übertragen
Private Sub sendData()
  Dim objWS As Worksheet
  Dim objTargetWB As Workbook
  Dim rngTarget As Range
  Dim lngRow As Long
  
  On Error GoTo ErrExit
  GMS
  
  If FileStatus(cstrTargetFileName) = XL_CLOSED Then
    Set objTargetWB = Workbooks.Open(cstrTargetFileName)
    If SheetExist("Frequenz fortlaufend", objTargetWB.Name) Then
      If SheetExist(CStr(DINKwoche(Date) - 1) & ". KW") Then
        lngRow = Application.Max(objTargetWB.Sheets("Frequenz fortlaufend").Cells(Rows.Count, 1).End(xlUp).Row + 1, 2)
        Set rngTarget = objTargetWB.Sheets("Frequenz fortlaufend").Cells(lngRow, 1)
        Set objWS = ThisWorkbook.Sheets(CStr(DINKwoche(Date) - 1) & ". KW")
        With objWS
          .Range("A2:J" & .Cells(Rows.Count, 1).End(xlUp).Row).Copy rngTarget
        End With
        objTargetWB.Close True
      Else
        MsgBox "Kein Tabellenblatt [" & CStr(DINKwoche(Date) - 1) & ". KW] gefunden!", _
          vbInformation, "Hinweis"
      End If
    Else
      MsgBox "In der Datei [" & objTargetWB.Name & "] wurde kein Tabellenblatt" & vbLf & vbLf & _
        "[Frequenz fortlaufend] gefunden!", vbInformation, "Hinweis"
    End If
  Else
    MsgBox "Die Datei [" & cstrTargetFileName & "] ist zur Zeit geöffnet!" & vbLf & vbLf & _
      "Bitte versuchen Sie es später!", vbInformation, "Hinweis"
  End If
  
  ErrExit:
  With Err
    If .Number <> 0 Then MsgBox "Fehler " & .Number & vbLf & vbLf & _
      .Description & vbLf & vbLf & "In Prozedur (sendData) in Modul basData", _
      vbExclamation, "Fehler in basData / sendData"
  End With
  
  On Error Resume Next
  objTargetWB.Close False
  On Error GoTo 0
  
  GMS True
  
  Set objWS = Nothing
  Set rngTarget = Nothing
  Set objTargetWB = Nothing
End Sub

' **********************************************************************
' Modul: basAuxiliary Typ: Allgemeines Modul
' **********************************************************************

Option Explicit
Option Private Module

Public Enum XL_FILESTATUS
  XL_UNDEFINED = -1
  XL_CLOSED
  XL_OPEN
  XL_DONTEXIST
End Enum

'Hilfsfunktionen
Public Function FileStatus(xlFile As String) As XL_FILESTATUS
  
  On Error Resume Next
  
  Dim File%: File = FreeFile
  
  Err.Clear
  
  Open xlFile For Input Access Read Lock Read As #File
  Close #File
  
  Select Case Err.Number
    Case 0: FileStatus = XL_CLOSED
    Case 70: FileStatus = XL_OPEN
    Case 76: FileStatus = XL_DONTEXIST
    Case Else: FileStatus = XL_UNDEFINED
  End Select
  Err.Clear
End Function

Public Function DINKwoche(ByVal Datum As Date) As Integer
  Dim tmp As Date
  tmp = DateSerial(Year(Datum + (8 - Weekday(Datum)) Mod 7 - 3), 1, 1)
  DINKwoche = ((Datum - tmp - 3 + (Weekday(tmp) + 1) Mod 7)) \ 7 + 1
End Function

Public Function SheetExist(ByVal sheetName As String, Optional WbName As String) As Boolean
  Dim wks As Worksheet
  On Error GoTo ERRORHANDLER
  If WbName = "" Then WbName = ThisWorkbook.Name
  For Each wks In Workbooks(WbName).Worksheets
    If wks.Name = sheetName Then SheetExist = True: Exit Function
  Next
  ERRORHANDLER:
  SheetExist = False
End Function

Public Sub GMS(Optional ByVal Modus As Boolean = False)
  
  Static lngCalc As Long
  
  With Application
    .ScreenUpdating = Modus
    .EnableEvents = Modus
    .DisplayAlerts = Modus
    .EnableCancelKey = IIf(Modus, 1, 0)
    If Not Modus Then lngCalc = .Calculation
    If Modus And lngCalc = 0 Then lngCalc = -4105
    .Calculation = IIf(Modus, lngCalc, -4135)
    .Cursor = IIf(Modus, -4143, 2)
    
  End With
  
End Sub

'Zellkontextmenü
Public Sub addButton()
  Dim objBtn As CommandBarButton
  
  deleteButton
  
  Set objBtn = Application.CommandBars("Cell").Controls.Add(msoControlButton)
  
  With objBtn
    .Style = msoButtonAutomatic
    .Caption = "Daten Übertragen - KW " & Format(DINKwoche(Date) - 1, "00")
    .BeginGroup = True
    .OnAction = "SendData"
  End With
  
  Set objBtn = Nothing
End Sub

Public Sub deleteButton()
  On Error Resume Next
  Application.CommandBars("Cell").Controls("Daten Übertragen - KW " & Format(DINKwoche(Date) - 1, "00")).Delete
  On Error GoTo 0
End Sub

Gruß Sepp

Anzeige
Nachtrag
30.06.2009 22:30:39
Josef
Hallo Thomas,
ersetze diesen Codeteil.
With objWS
  If .Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row) Like "Daten übertragen*" Then
    MsgBox "Die Daten für [" & CStr(DINKwoche(Date) - 1) & ". KW] wurden bereits übertragen!", _
      vbInformation, "Hinweis"
  Else
    .Range("A2:J" & .Cells(Rows.Count, 1).End(xlUp).Row).Copy rngTarget
    .Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row + 1) = "Daten übertragen am " & Format(Now, "dd.MM.yy hh:mm")
    objTargetWB.Close True
    MsgBox "Die Daten für [" & CStr(DINKwoche(Date) - 1) & ". KW] wurden erfolgreich übertragen!", _
      vbInformation, "Hinweis"
  End If
End With

Dann wird erstens das mehrfache Übertragen der selben Daten verhindert und es wird eine Erfolgsmeldung ausgegeben.
Gruß Sepp

Anzeige
AW: Nachtrag
01.07.2009 10:59:32
mctapt
Hallo Sepp,
erstmals vielen Dank für den Code. Da hast Du Dir echt Mühe gemacht und einen Kasten Bier mehr als verdient :).
Ich hätte noch 2 kurze Fragen.
1.) Ich nehme mal an, dass ich den Code nur ins Beratersheet reinkopieren muss und nicht ins gesamt oder?
2.) Du meintest, dass im 'Zellkontextmenü' ein Menüpunkt mit Daten übertragen ist. Wo ist das Zellkontextmenü? Oben in der Menüleiste mit Daten, Bearbeiten und Ansicht?
3.) Ich habe nicht ganz verstanden, welchen Teil ich mit
With objWS
If .Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row) Like "Daten übertragen*" Then
MsgBox "Die Daten für [" & CStr(DINKwoche(Date) - 1) & ". KW] wurden bereits übertragen!", _
vbInformation, "Hinweis"
Else
.Range("A2:J" & .Cells(Rows.Count, 1).End(xlUp).Row).Copy rngTarget
.Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row + 1) = "Daten übertragen am " & Format(Now, "dd.MM.yy hh:mm")
objTargetWB.Close True
MsgBox "Die Daten für [" & CStr(DINKwoche(Date) - 1) & ". KW] wurden erfolgreich übertragen!", _
vbInformation, "Hinweis"
End If
End With
ersetzen soll. Soll ich ihn einfach ins das Modul basData einfügen?
nachmals besten Dank für Die Hilfe.
Thomas
Anzeige
AW: Nachtrag
01.07.2009 21:31:56
Josef
Hallo Thomas,
zu 1;
ja, der Code kommt in die Beraterdatei.
Zu 2;
das Zellkontextmenü ist das Menü das aufklappt, wenn du einen Rechtsklick in eine Zelle machst.
Zu 3;
hier noch mal der gesamte Code für "basData".
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

'### ### Pfad und Name der "Gesamtdatei" - Anpassen! ### ###
Private Const cstrTargetFileName As String = "E:\Temp\Gesamtdatei.xls"
'### ### ### ### ### ### ### ### ### ### ### ### ### ### ###


'Daten auslesen und übertragen
Private Sub sendData()
  Dim objWS As Worksheet
  Dim objTargetWB As Workbook
  Dim rngTarget As Range
  Dim lngRow As Long
  
  On Error GoTo ErrExit
  GMS
  
  If FileStatus(cstrTargetFileName) = XL_CLOSED Then
    Set objTargetWB = Workbooks.Open(cstrTargetFileName)
    If SheetExist("Frequenz fortlaufend", objTargetWB.Name) Then
      If SheetExist(CStr(DINKwoche(Date) - 1) & ". KW") Then
        lngRow = Application.Max(objTargetWB.Sheets("Frequenz fortlaufend").Cells(Rows.Count, 1).End(xlUp).Row + 1, 2)
        Set rngTarget = objTargetWB.Sheets("Frequenz fortlaufend").Cells(lngRow, 1)
        Set objWS = ThisWorkbook.Sheets(CStr(DINKwoche(Date) - 1) & ". KW")
        With objWS
          If .Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row) Like "Daten übertragen*" Then
            MsgBox "Die Daten für [" & CStr(DINKwoche(Date) - 1) & ". KW] wurden bereits übertragen!", _
              vbInformation, "Hinweis"
          Else
            .Range("A2:J" & .Cells(Rows.Count, 1).End(xlUp).Row).Copy rngTarget
            .Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row + 1) = "Daten übertragen am " & Format(Now, "dd.MM.yy hh:mm")
            objTargetWB.Close True
            MsgBox "Die Daten für [" & CStr(DINKwoche(Date) - 1) & ". KW] wurden erfolgreich übertragen!", _
              vbInformation, "Hinweis"
          End If
        End With
        objTargetWB.Close True
      Else
        MsgBox "Kein Tabellenblatt [" & CStr(DINKwoche(Date) - 1) & ". KW] gefunden!", _
          vbInformation, "Hinweis"
      End If
    Else
      MsgBox "In der Datei [" & objTargetWB.Name & "] wurde kein Tabellenblatt" & vbLf & vbLf & _
        "[Frequenz fortlaufend] gefunden!", vbInformation, "Hinweis"
    End If
  Else
    MsgBox "Die Datei [" & cstrTargetFileName & "] ist zur Zeit geöffnet!" & vbLf & vbLf & _
      "Bitte versuchen Sie es später!", vbInformation, "Hinweis"
  End If
  
  ErrExit:
  With Err
    If .Number <> 0 Then MsgBox "Fehler " & .Number & vbLf & vbLf & _
      .Description & vbLf & vbLf & "In Prozedur (sendData) in Modul basData", _
      vbExclamation, "Fehler in basData / sendData"
  End With
  
  On Error Resume Next
  objTargetWB.Close False
  On Error GoTo 0
  
  GMS True
  
  Set objWS = Nothing
  Set rngTarget = Nothing
  Set objTargetWB = Nothing
End Sub

Gruß Sepp

Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige