Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1060to1064
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

Mappe kopieren und nach Listeneinträge benennen

Mappe kopieren und nach Listeneinträge benennen
16.03.2009 19:38:28
Fritz_W
Hallo Forumsbesucher,
ich benötige die Hilfe der VBA-Experten.
Ich möchte von einer Arbeitsmappe soviel Kopien erstellen, wie in dieser Mappe in der Tabelle1 im Bereich A1:A20 Einträge vorhanden sind und die Kopien jeweils nach diesen Einträgen benennen.
Allerdings sollte in den Kopien die Einträge des Zellbereich A1:A20 in der Tabelle1 gelöscht werden und stattdessen der Zelleintrag, der in jeder Kopie für die Dateibezeichnung verantwortlich ist, in die Zelle A1 in Tabelle1 der Kopie geschrieben werden. Außerdem sollte jede Kopie "makrofrei" sein.
Im Voraus besten Dank für Eure Hilfen.
mfg
Fritz

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mappe kopieren und nach Listeneinträge benennen
16.03.2009 22:31:04
Josef
Hallo Fritz,
probier mal.
' **********************************************************************
' Modul: Modul3 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub copyMe()
  Dim objWB As Workbook
  Dim vbComp As Object
  Dim rng As Range
  Dim strSave As String, intCnt As Integer
  
  On Error GoTo ErrExit
  GMS
  
  For Each rng In ThisWorkbook.Sheets("Tabelle1").Range("A1:A20")
    If rng <> "" Then
      intCnt = intCnt + 1
      Application.StatusBar = "Speichern von Datei " & CStr(intCnt) & " / " & rng.Text & ".xls"
      strSave = ThisWorkbook.Path & "\" & rng.Text & ".xls"
      ThisWorkbook.SaveCopyAs strSave
      Set objWB = Workbooks.Open(strSave)
      With objWB
        With .Sheets("Tabelle1")
          .Range("A1:A20").ClearContents
          .Range("A1") = rng
        End With
        For Each vbComp In .VBProject.vbcomponents
          If vbComp.Type = 100 Then
            With .VBProject.vbcomponents(vbComp.Name).CodeModule
              .DeleteLines 1, .CountOfLines
            End With
          Else
            .VBProject.vbcomponents.Remove vbComp
          End If
        Next
        .Close True
      End With
    End If
  Next
  
  ErrExit:
  With Err
    If .Number <> 0 Then MsgBox "Fehler " & .Number & vbLf & vbLf & _
      .Description & vbLf & vbLf & "In Prozedur (copyMe) in Modul Modul1", _
      vbExclamation, "Fehler in Modul1 / copyMe"
  End With
  
  GMS True
  
End Sub

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)
    .StatusBar = False
  End With
  
End Sub

Gruß Sepp

Anzeige
AW: Mappe kopieren und nach Listeneinträge benennen
17.03.2009 05:03:39
Fritz_W
Hallo Sepp,
das funktioniert wie gewünscht.
Wieder einmal ganz große Klasse!!
Ganz herzlichen Dank
Schöne Grüße
Fritz
@Sepp
17.03.2009 17:23:39
Fritz_W
Hallo Sepp,
ich habe noch einige Fragen, die ich hier gerne an Dich richten möchte:
1. Wie könnte man erreichen, dass in den Kopien die Zeile1 der Tabelle1 (mit dem Eintrag in Zelle A1)
jeweils ausgeblendet wird?
2. In meiner Firma ist EXCEL 2007 installiert.
Ich gehe davon aus, dass der Code so unter Excel 2007 nicht läuft?
Im Voraus vielen Dank für Deine Unterstützung.
Gruß
Fritz
AW: @Sepp
17.03.2009 17:39:11
Josef
Hallo Fritz,
so läufts Versions unabhängig und Zeie 1 in Tabelle1 wird ausgeblendet.
' **********************************************************************
' Modul: Modul3 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub copyMe()
  Dim objWB As Workbook
  Dim vbComp As Object
  Dim rng As Range
  Dim strSave As String, intCnt As Integer
  
  On Error GoTo ErrExit
  GMS
  
  For Each rng In ThisWorkbook.Sheets("Tabelle1").Range("A1:A20")
    If rng <> "" Then
      intCnt = intCnt + 1
      Application.StatusBar = "Speichern von Datei " & CStr(intCnt) & " / " & rng.Text & ".xls"
      strSave = ThisWorkbook.Path & "\" & rng.Text & Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, "."))
      ThisWorkbook.SaveCopyAs strSave
      Set objWB = Workbooks.Open(strSave)
      With objWB
        With .Sheets("Tabelle1")
          .Range("A1:A20").ClearContents
          .Range("A1") = rng
          .Rows(1).Hidden = True
        End With
        For Each vbComp In .VBProject.vbcomponents
          If vbComp.Type = 100 Then
            With .VBProject.vbcomponents(vbComp.Name).CodeModule
              .DeleteLines 1, .CountOfLines
            End With
          Else
            .VBProject.vbcomponents.Remove vbComp
          End If
        Next
        .Close True
      End With
    End If
  Next
  
  ErrExit:
  With Err
    If .Number <> 0 Then MsgBox "Fehler " & .Number & vbLf & vbLf & _
      .Description & vbLf & vbLf & "In Prozedur (copyMe) in Modul Modul1", _
      vbExclamation, "Fehler in Modul1 / copyMe"
  End With
  
  GMS True
  
End Sub

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)
    .StatusBar = False
  End With
  
End Sub

Gruß Sepp

Anzeige
AW: @Sepp
17.03.2009 18:22:28
Fritz_W
Hallo Sepp,
einfach toll, was Du hier anbietest. Hilfe vom Allerfeinsten ist das.
Unter EXCEL 2007 werd ich das morgen gleich probieren!
Ganz großen Dank!!
Gruß
Fritz
AW: @Sepp
18.03.2009 17:24:06
Fritz_W
Hallo Sepp,
mein Test unter EXCEL 2007 produzierte folgende Fehlermeldung:
Fehler 1004
Der programmatische Zugriff auf das Visual Basic-Projekt ist nicht sicher.
In Prozedur (CopyMe) in Modul Modul1
Trotz dieser Fehlermeldung wurde eine Kopie der Arbeitsmappe erstellt (jedoch nur eine) erstellt. In dieser Kopie wurde zwar der Zellbereich A1:A20 gelöscht und der Eintrag in A1 vorgenommen und auch Zeile 1 ausgeblendet. Die Arbeitsmappe wurde jedoch als Mappe im 2007-Makro-Format gespeichert.
Mach ich was falsch?
Gruß
Fritz
Anzeige
AW: @Sepp
18.03.2009 20:11:13
Josef
Hallo Fritz,
du must unter Excel-Optionen > Vertrtauenststellungscenter > Einstellungen für das Vertrauenstellungscenter > Einstellungen für Makros > den Zugriff auf ads VBA-Projekt genehmigen.
Der angepasste Code sieht so aus.
' **********************************************************************
' Modul: Modul3 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub copyMe()
  Dim objWB As Workbook
  Dim vbComp As Object
  Dim rng As Range
  Dim strSave As String, strExt As String, strSaveXLSM As String, intCnt As Integer
  
  On Error GoTo ErrExit
  GMS
  
  For Each rng In ThisWorkbook.Sheets("Tabelle1").Range("A1:A20")
    If rng <> "" Then
      intCnt = intCnt + 1
      Application.StatusBar = "Speichern von Datei " & CStr(intCnt) & " / " & rng.Text & Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, "."))
      strSave = ThisWorkbook.Path & "\" & rng.Text & Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, "."))
      ThisWorkbook.SaveCopyAs strSave
      Set objWB = Workbooks.Open(strSave)
      With objWB
        With .Sheets("Tabelle1")
          .Range("A1:A20").ClearContents
          .Range("A1") = rng
          .Rows(1).Hidden = True
        End With
        For Each vbComp In .VBProject.vbcomponents
          If vbComp.Type = 100 Then
            With .VBProject.vbcomponents(vbComp.Name).CodeModule
              .DeleteLines 1, .CountOfLines
            End With
          Else
            .VBProject.vbcomponents.Remove vbComp
          End If
        Next
        strExt = Mid(strSave, InStrRev(strSave, "."))
        If Len(strExt) > 4 Then strExt = Left(strExt, 4) & "x"
        strSaveXLSM = Left(strSave, InStrRev(strSave, ".") - 1)
        strSaveXLSM = strSaveXLSM & strExt
        objWB.SaveAs strSaveXLSM, FileFormat:=IIf(Len(strExt) = 5, 51, -4143)
        objWB.Close
        Kill strSave
      End With
    End If
  Next
  
  ErrExit:
  With Err
    If .Number <> 0 Then MsgBox "Fehler " & .Number & vbLf & vbLf & _
      .Description & vbLf & vbLf & "In Prozedur (copyMe) in Modul Modul1", _
      vbExclamation, "Fehler in Modul1 / copyMe"
  End With
  
  GMS True
  
End Sub

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)
    .StatusBar = False
  End With
  
End Sub

Gruß Sepp

Anzeige
AW: @Sepp
18.03.2009 20:27:42
Fritz_W
Hallo Sepp,
nochmals ganz herzlichen Dank für deine Unterstützung.
Viele Grüße
Fritz
AW: @Sepp
18.03.2009 20:37:10
Fritz_W
Hallo Sepp,
nochmals ganz herzlichen Dank für deine Unterstützung.
Viele Grüße
Fritz

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige