Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1784to1788
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
Werte aus tabelle übernehmen - VBA
01.10.2020 10:51:30
Mike
Hallo Liebe Excel Gemeinde,
ich brauche dringend nochmal eure Hilfe. Ich hatte das Thema schon einmal gepostet, aber leider hat es nicht funktioniert.
Kurz vorweg, ich bin kein VBA-Kenner aber mir fällt im Moment keine andere Lösung ein, außer alles manuell zu machen. Da ich dies aber wöchentlich machen muss wird das kaum gehen....
Daher was möchte ich erreichen: Ich habe in der Testdatei: (https://www.herber.de/bbs/user/140563.xlsm) ein Arbeitsblatt Input Data. Aus diesem sollen jeweils immer die werte aus einer Zeile in das Arbeitsblatt Infrastructure eingetragen werden ,
Als Beispiel (Zeile 2 in Input Data) der Country Code "DE" soll in die Zelle C5 in Infrastructure, County "Germany" soll in Zelle B5 in Infrastructure, die Region "DEN" soll in Zelle B4 in Infrastructure und die Sales Region "D(Nord) & Nordeuropa" soll in Zelle B3 in Infrastructure. Sobald die Werte aus der Zeile übernommen worden sind, soll die Datei mit dem Country Name im gleichen Ordner abgespeichert werden als (20200929_Market Estimations_RegX_v6_inkl_MF_VBA_Germany). Dies soll so lange gemacht werden bis keine Daten mehr in Sheet "Input Data" vorhanden sind. In der Probedatei könnt ihr den aktuellen stand des Makros sehen.
Ich würde mich rießig über Eure hilfe freuen!!!!
LG
Mike

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Werte aus tabelle übernehmen - VBA
01.10.2020 12:10:40
fcs
Hallo Mike ,
im
Prinzip sollte es mit folgenden Anpassungen funktionieren.
Kleines Problem "Germany" kommt in der Liste mit 2 Regionen vor.
Was soll dann passieren?
LG
Franz
Sub Test()
Dim Qw As Worksheet 'Quelle
Dim Zw As Worksheet 'Ziel
Dim Nw As Workbook 'neue
Dim Z
Dim strOrdnerZiel, strDatum As String
strDatum = InputBox("Datum für zu erstellende Dateien", "Vorlagen erstellen", _
Format(Date, "YYYYMMDD"))
If strDatum = "" Then Exit Sub
strOrdnerZiel = "C:\Users\xxx\Desktop\Bottomup Templates\" & strDatum & _
"_Market Estimations_RegX_"
Set Qw = ThisWorkbook.Worksheets("Input data")
Set Zw = ThisWorkbook.Worksheets("Infrastructure")
For Each Z In Qw.Range("A2", Qw.Range("A1").End(xlDown)).Cells
Zw.Range("B3") = Z.Offset(0, 3).Value '[Sales Region], spalte 4
Zw.Range("B4") = Z.Offset(0, 2).Value '[Region], Spalte 3
Zw.Range("B5") = Z.Offset(0, 1).Value '[Country], Spalte 2
Zw.Range("C5") = Z.Value '[Country Code], Spalte 1
Zw.Copy
Set Nw = ActiveWorkbook
Nw.SaveAs _
Filename:=strOrdnerZiel & Z.Offset(0, 1).Value & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Nw.Close savechanges:=False
Next
End Sub

Anzeige
AW: Werte aus tabelle übernehmen - VBA
01.10.2020 12:27:51
Mike
Oh mein gott wie geil!! Hammer Franz Dank Danke Danke!!!
Der Unterschied ist das es einmal Germany gibt mit DEN, daher Norden und DES, daher Süden. Könnte man den Makro so anpassen, dass er nur für Germany das Template einmal als Germany_DES und Germany_DEN abspeichert?
AW: Werte aus tabelle übernehmen - VBA
01.10.2020 12:58:20
Mike
Eine Sache die mir noch aufgefallen ist. Bei dem kopieren wird aktuell nur das Sheet "Infrastructure" übernommen, ich bräuchte aber alle sheets drin da diese wichtig für meinen Import sind. Daher jede Datei soll die Sheets Infrastructure, Superstructure, Summary, Manipulation Faktor, Data_1, Data_2 haben... sorry hätte ich vorher sagen sollen...
Anzeige
AW: Werte aus tabelle übernehmen - VBA
02.10.2020 07:51:40
Mike
Hallo Franz,
Ich habe es versucht anzupassen aber ich bekomme es nicht hin das germany Problem zu lösen und alle sheets zu übertragen. Kannst du mir hier noch helfen pleaseeee :)))
AW: Werte aus tabelle übernehmen - VBA
02.10.2020 17:47:13
fcs
Hallo Mike,
hier das Makro angepasst
a) Dateiname bei "Germany"
b) mehrere Blätter kopieren
LG
Franz
Sub Test()
Dim Qw As Worksheet 'Quelle
Dim Zw As Worksheet 'Ziel
Dim Nw As Workbook 'neue
Dim Z
Dim strOrdnerZiel, strDatum As String
strDatum = InputBox("Datum für zu erstellende Dateien", "Vorlagen erstellen", _
Format(Date, "YYYYMMDD"))
If strDatum = "" Then Exit Sub
strOrdnerZiel = "C:\Users\xxx\Desktop\Bottomup Templates\" & strDatum _
& "_Market Estimations_RegX_"
Set Qw = ThisWorkbook.Worksheets("Input data")
For Each Z In Qw.Range("A2", Qw.Range("A1").End(xlDown)).Cells
ThisWorkbook.Sheets(Array("Infrastructure", "Superstructure", "Summary",  _
"Manipulation Faktor", "Data_1", "Data_2")).Copy
Set Nw = ActiveWorkbook
Set Zw = Nw.Worksheets("Infrastructure")
Zw.Range("B3") = Z.Offset(0, 3).Value '[Sales Region], spalte 4
Zw.Range("B4") = Z.Offset(0, 2).Value '[Region], Spalte 3
Zw.Range("B5") = Z.Offset(0, 1).Value '[Country], Spalte 2
Zw.Range("C5") = Z.Value '[Country Code], Spalte 1
Select Case Z.Offset(0, 1).Value
Case "Germany"
Nw.SaveAs _
Filename:=strOrdnerZiel & Z.Offset(0, 1).Value & "_" & Z.Offset(0, 2).Value  _
& ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Case Else
Nw.SaveAs _
Filename:=strOrdnerZiel & Z.Offset(0, 1).Value & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
End Select
Nw.Close savechanges:=False
Next
End Sub

Anzeige
AW: Werte aus tabelle übernehmen - VBA
02.10.2020 19:12:10
Mike
Franz vielen vielen Dank! Heute war echt ein mieser Tag, ich hab echt alles versucht aber dafür reicht mein wissen einfach nicht aus... Eine frage noch? wie müsste ich deinen Code mit dem Code anbei kombinieren, sodass er die werte aus dem sheet input data zieht und erst nach dem abspeichern aktiviert.
Ich habe es gerade probiert aber wenn ich den Blattschutz aktiviere klappt es nicht mehr...
Sub Workbook_Open()
'für alle Blätter mit Passwortschutz
Dim ws As Worksheet
For Each ws In Worksheets
ws.Protect userinterfaceonly:=True, Password:="VP123" 'Passwort anpassen
ws.EnableAutoFilter = True 'ermöglicht Autofilter
ws.EnableOutlining = True 'ermöglicht Gruppierung/Gliederung
Next ws
End Sub

Sub ColLockCell()
Dim cll As Object
For Each cll In Selection
If cll.Locked = True Then
cll.Interior.ColorIndex = 9
End If
Next cll
If Selection.Locked = False Then
MsgBox "There is no locked cell in range that you choose", vbOKOnly, "Locked Cell Checker"
End If
End Sub

Sub Blattschutz_ein()
Dim Blatt As Worksheet
For Each Blatt In Worksheets
Blatt.Protect ("VP123")
Next Blatt
End Sub

Sub Blattschutz_aus()
Dim Blatt As Worksheet
For Each Blatt In Worksheets
Blatt.Unprotect ("VP123")
Next Blatt
End Sub

Anzeige
AW: Werte aus tabelle übernehmen - VBA
02.10.2020 19:56:24
Mike
Mir ist noch etwas aufgefallen :( Leider sind alle Dropdowns und bedingten Formatierungen weg. Kann man die bei kopieren auch übernehmen. Sorry das dass so zeh ist, aber wir war das so nicht bewusst...
AW: Werte aus tabelle übernehmen - VBA
04.10.2020 15:57:03
fcs
Hallo Mike,
es wundert mich, dass bei dem Kopiervorgang auch die bedingten Formatierungen verschwunden sind - keine Ahnung warum.
Blattschutz und Gliederungsfunktion sind leider nur bedingt in Einklang zu bringen.
Wenn man beim Blattschutz das Formatieren der Zeilen und Spalten erlaubt, dann sind zumindest die +--Schaltflächen der Gliederung funktionsfähig, aber nicht die nummerierten Schaltflächen für die Ebenen der Gliederung. Dies funktioniert nur, wenn man dies per Makro aktiviert.
Die Einstellung ist flüchtig und wird nicht permanent mit der Datei gespeichert.
Damit die Drop-Downs funktionieren muss auch das Blatt "Config" mit kopiert werden.
Damit alles einigermaßen funktioniert bin ich jetzt wie folgt vorgegangen:
  • 1. Eine temporäre Kopie der Datei wird gespeichert

  • 2. die Kopie wird geöffnet und die nicht benötigten Blätter in der Kopie gelöscht

  • 3. Der Schutz aller Blätter wird ausgeschaltet

  • 4. Die Datei wird als Vorlage ohne Makros gespeichert und geschlossen

  • 5. Jetzt wird die Liste im Blatt "Input Data" abgearbeitet
    vor dem Speichern wird der Blattschutz in allen Blättern aktiviert. Dabei wird das Formatieren von Spalten und Zeilen erlaubt.

  • Die temporär erstellte Kopie und die Vorlage werden wieder gelöscht.
    In der Statuszeile wird der Fortschritt der Erstellung der Dateien angezeigt, am Schluss eine kurze Meldung. Bildschirmaktualisierung, Ereignismakros und automatische Berechnung werden vorübergehend deaktiviert, um die Geschwindigkeit des Makros zu erhöhen.
    Ich hab dir zusätzlich ein Makro erstellt, mit dem du die Gliederungsfunktion komplett aktiveren kannst. Dieses müsstest du in deiner persönlichen Makroarbeitsmappe speichern.
    Nach dem Öffnen einer der erstellten Dateien musst du dann jeweils dieses Makro starten.
    LG
    Franz
    Sub Test()
    Dim Qw As Worksheet 'Quelle
    Dim Zw As Worksheet 'Ziel
    Dim Nw As Workbook 'neue
    Dim Z
    Dim strOrdnerZiel, strDatum As String, strDateiZiel As String
    Dim strTemp As String
    Dim StatusCalc As Long, DatNr As Long
    strDatum = InputBox("Datum für zu erstellende Dateien", "Vorlagen erstellen", _
    Format(Date, "YYYYMMDD"))
    If strDatum = "" Then Exit Sub
    'Zielordner
    strOrdnerZiel = "C:\Users\xxx\Desktop\Bottomup Templates\"
    '    strOrdnerZiel = "C:\Users\Public\Test\Neuer Ordner\"           'testzeile
    'Makrobremsen lösen
    With Application
    .ScreenUpdating = False
    StatusCalc = .Calculation
    .Calculation = xlCalculationManual
    .EnableEvents = False
    End With
    Application.StatusBar = "Temporäre Kopie erstellen"
    'temporäre Kopie der Datei speichenr
    strTemp = "XXtempKopieXX"
    Application.DisplayAlerts = False
    ThisWorkbook.SaveCopyAs Filename:=strOrdnerZiel & strTemp & ".xlsm"
    'temp. Kopie öffnen
    Set Nw = Application.Workbooks.Open(Filename:=strOrdnerZiel & strTemp & ".xlsm")
    'nicht benötigte Blätter in Kopie löschen
    With Nw
    '      .Worksheets("config").Delete
    .Worksheets("Input data").Delete
    'Blattschutz in allen Blättern der aufheben
    For Each Zw In Nw.Worksheets
    Zw.Unprotect ("VP123")
    Next
    'Datei ohne Makros speichern
    .SaveAs Filename:=strOrdnerZiel & strTemp & ".xlsx", FileFormat:=51
    .Close False
    End With
    'temp. Kopie mit Makros wieder löschen
    VBA.Kill strOrdnerZiel & strTemp & ".xlsm"
    Application.DisplayAlerts = True
    'Basisdateiname
    strDateiZiel = strOrdnerZiel & strDatum & "_Market Estimations_RegX_"
    Set Qw = ThisWorkbook.Worksheets("Input data")
    DatNr = 0
    For Each Z In Qw.Range("A2", Qw.Range("A1").End(xlDown)).Cells
    DatNr = DatNr + 1
    Application.StatusBar = "Datei " & DatNr & " für """ & Z.Offset(0, 1).Value _
    & """ wird erstellt"
    'temp. Kopie schreibgeschützt öffnen
    Set Nw = Application.Workbooks.Open(Filename:=strOrdnerZiel & strTemp & ".xlsx", _
    ReadOnly:=True)
    Set Zw = Nw.Worksheets("Infrastructure")
    Zw.Range("B3") = Z.Offset(0, 3).Value '[Sales Region], spalte 4
    Zw.Range("B4") = Z.Offset(0, 2).Value '[Region], Spalte 3
    Zw.Range("B5") = Z.Offset(0, 1).Value '[Country], Spalte 2
    Zw.Range("C5") = Z.Value '[Country Code], Spalte 1
    'Blattschutz aktivieren, dabei Formatierung von Spaltung und Zeilen zulassen, so _
    ist die Gliederungsfunktion mit Einschränkungen nutzbar.
    For Each Zw In Nw.Worksheets
    With Zw
    .Protect AllowFormattingColumns:=True, AllowFormattingRows:=True, _
    userinterfaceonly:=True, AllowFiltering:=True, Password:="VP123" 'Passwort  _
    anpassen
    .EnableAutoFilter = True 'ermöglicht Autofilter
    .EnableOutlining = True 'ermöglicht Gruppierung/Gliederung
    End With
    Next
    Select Case Z.Offset(0, 1).Value
    Case "Germany"
    Nw.SaveAs _
    Filename:=strDateiZiel & Z.Offset(0, 1).Value & "_" & Z.Offset(0, 2).Value _
    & ".xlsx", _
    FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    Case Else
    Nw.SaveAs _
    Filename:=strDateiZiel & Z.Offset(0, 1).Value & ".xlsx", _
    FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    End Select
    Nw.Close savechanges:=False
    'Exit For - nur zum Testen
    Next
    'temp. Kopie ohne Makros wieder löschen
    VBA.Kill strOrdnerZiel & strTemp & ".xlsx"
    'Makrobremsen lösen
    With Application
    .StatusBar = False
    .ScreenUpdating = True
    .Calculation = StatusCalc
    .EnableEvents = True
    End With
    MsgBox "Fertig"
    End Sub
    
    'Dieses Makro in der persönlichen Arbeitsmappe speichern und bei Bedarf starten, _
    ggf. einer Schaltfläche in der Menüleiste für den Schnellzugriff zuweisen.
    Sub Aktivieren_Gliederung()
    Dim wks As Worksheet
    For Each wks In ActiveWorkbook.Worksheets
    wks.Unprotect Password:="VP123"
    wks.EnableAutoFilter = True
    wks.EnableOutlining = True
    wks.Protect Password:="VP123", AllowFormattingColumns:=True, AllowFormattingRows:=True, _
    userinterfaceonly:=True, AllowFiltering:=True        'Passwort anpassen
    Next
    End Sub
    

    Anzeige

    307 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige