ich habe eine Ausgangsdatei mit verschiedenen Tabellenblättern. Im Ersten werden Daten gesammelt die Tabelle heißt Schichtenprotokoll.
In der Tabelle Auswertung werden einige wichtige Daten als Datensatz zusammengefasst.
Mittels Button übertrage ich die Daten in eine andere Datei. Das klappt und beschreibt den Istzustand!
Nun möchte ich noch weiter Daten übertragen und tue mich damit schwer, weil der Bereich Leerzeilen hat.
Die Vorgehensweise habe ich mir so vorgestellt, dass ich aus dem Tabellenblatt Auswertung heraus einen Button betätige, der mir wiederum den Bereich A41:Y51 aus der Tabelle Schichtenprotokoll kopiert und in eine Datei STO ab Zeile 4 entweder ohne Leerzeilen einfügt oder mir in der Ziel Datei STO im Tabellenblatt STO1 die Tabelle ab Zeile4 komplett nach Spalte X ohne Leerzeilen sortiert.
Ich füge die Dateien mal mit an, sollte ein Passwort verlangt werden, es gibt keins, also einfach bestätigen.
VBA ist nicht meine Stärke, auch bei diesem Code habe ich Hilfe erhalten, das Forum Excel-Werkstatt, die mir in Sachen VBA immer sehr geholfen haben, ist leider nicht mehr erreichbar. Da ich hier neu bin, bin ich auf Eure Antworten sehr gespannt.
Vielen Dank im Voraus!
Code:
Private Sub CommandButton21_Click()
Dim nwb, awb As Object
Dim lzelle As Object
Application.EnableEvents = True 'Ereigniss wieder einschalten wichtig!!!!
'Pfad und Dateinamen anpassen
'Tabelle1 gegen den Namen der Ziel/Ursprungstabelle austauschen
Set awb = ActiveWorkbook 'Exceldaten, die momentan im zugriff ist "merken"
Set nwb = Workbooks.Open(Filename:="H:\Auswertung\STO.xlsx") 'Exceldaten, die das Ziel sein _
soll mit Pfad!!!!
With nwb.Sheets("STO1")
If .Range("a1") = "" Then
Set lzelle = Range("a1") 'wenn a1 leer ist bei A2 beginnen
Else
Set lzelle = .Range("A:Y").Find(What:="*", after:=.Range("A1"), LookIn:=xlValues, _
LookAt:=xlWhole, searchdirection:=xlPrevious) 'letzte beschriebene _
Zelle im bereich "A:Y" ermitteln
End If
End With
Mit der Antwort von Peter bzw. dem Hinweis auf den Code für die Leerzeilen, habe ich versucht diesen in meinen Code einzubauen nur leider ohne Erfolg. Er hat mir dann die Leerzeilen aus meiner Übertragungstabelle gelöscht und nicht die in meiner Zieltabelle.
Da ich in VBA nicht der fitteste bin, bräuchte ich etwas mehr Hinweise wie und wo ich dann solche Code integrieren kann.
Das hier sollte kein Crossposten sein, da ich das Thema im anderen Forum als abgehandelt beendet hatte, sondern nur der Versuch jemanden zu finden, der mir etwas detaillierter unter die Arme greifen kann.
Danke für Eure Unterstützung.
Gruß
Dietmar
Gruß
Dietmar
Damit das Mögliche entsteht, muß immer wieder das Unmögliche versucht werden.
With awb.Sheets("Schichtenprotokoll").Range("A42:y51")
Application.Intersect(.EntireColumn, .SpecialCells(xlCellTypeConstants).EntireRow).Copy 'Kopieren
End With
Hallo Uwe,
sorry, wer lesen kann ist klar im Vorteil
Es lag daran, das auf dem Tabellenblatt ein Schutz ist,
das habe ich wie folgt gelöst.
Code:
awb.Sheets("Schichtenprotokoll").Unprotect
With awb.Sheets("Schichtenprotokoll").Range("A42:y51")
Application.Intersect(.EntireColumn, .SpecialCells(xlCellTypeConstants).EntireRow).Copy 'Kopieren
End With
Kann ich das so machen?
Gruß
Dietmar
Damit das Mögliche entsteht, muß immer wieder das Unmögliche versucht werden.
With Sheets("Schichtenprotokoll")
.Unprotect
With .Range("A42:Y51")
Application.Intersect(.EntireColumn, .SpecialCells(xlCellTypeConstants).EntireRow).Copy
End With
.Protect
End With
Gruß Uwe
Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:1 Nutzer sagt Danke an Kuwer für diesen Beitrag 28 • DietmarD
Hallo Uwe,
das ist jetzt super und funktioniert. :18:
Vielen lieben Dank für Deine Geduld mit mir!
Jetzt habe ich eine neue Frage um meine Datei letztendlich perfekt zu machen.
Ich möchte meine beiden Schaltflächen die mir nun die Daten in unterschiedliche Dateien schießen zusammenlegen, sodass ich nur ein Button habe.
Meine Idee ist den mit Deiner Hilfe erstellten Code in ein Modul zu legen und diesen dann mit Call abzurufen.
Wäre der Lösungsansatz vertretbar oder ehr schlecht?
Soll ich dafür einen neuen Thread aufmachen?
Schaltfläche1
Code:
Private Sub CommandButton1_Click()
Dim nwb, awb As Object
Dim lzelle As Object
Dim strPasswort As String
Dim strPassalt As String
strPassalt = "xyz" 'Passwort zum ergleich hier anpassen
'strPasswort = InputBox("Zum Übertragen bitte Passwort eingeben", "Passwortabfrage")
Application.EnableEvents = False 'Ausschalten eines Ereignisses z.Bsp. Worksheet_Change
If Range("A1") = "0" Then
strPasswort = InputBox("Zum Übertragen bitte Passwort eingeben", "Passwortabfrage")
If strPasswort = strPassalt Then
If MsgBox("Sollen die Daten übertragen werden?", vbYesNo, "Achtung") = vbYes Then
Application.EnableEvents = True 'Ereigniss wieder einschalten wichtig!!!!
'Pfad und Dateinamen anpassen
'Tabelle1 gegen den Namen der Ziel/Ursprungstabelle austauschen
Set awb = ActiveWorkbook 'Exceldaten, die momentan im zugriff ist "merken"
Set nwb = Workbooks.Open(Filename:="H:\Auswertung\MasterAuswertung.xlsm") 'Exceldaten, die das Ziel sein _
soll mit Pfad!!!!
With nwb.Sheets("AuswertungSM4")
If .Range("a2") = "" Then
Set lzelle = Range("a1") 'wenn a2 leer ist bei A2 beginnen
Else
Set lzelle = .Range("A:AO").Find(What:="*", after:=.Range("A1"), LookIn:=xlValues, _
LookAt:=xlWhole, searchdirection:=xlPrevious) 'letzte beschriebene Zelle im bereich "A:V" ermitteln
End If
End With
Application.CutCopyMode = False
Set lzelle = Nothing
Set nwb = Nothing
Set awb = Nothing
Range("A1").Value = "1"
Workbooks("MasterAuswertung.xlsm").Close Savechanges:=True
End If
Else
MsgBox "Du hast ein falsches Passwort eingegeben!"
Exit Sub
End If
Else
MsgBox "Die Daten wurden bereits übertragen!"
End If
End Sub
Schaltfläche 2
Code:
Private Sub CommandButton21_Click()
Dim nwb, awb As Object
Dim lzelle As Object
Dim i As Long ' Zeilenzähler
Application.EnableEvents = True 'Ereigniss wieder einschalten wichtig!!!!
'Pfad und Dateinamen anpassen
'Tabelle1 gegen den Namen der Ziel/Ursprungstabelle austauschen
Set awb = ActiveWorkbook 'Exceldaten, die momentan im zugriff ist "merken"
Set nwb = Workbooks.Open(Filename:="H:\Auswertung\STO.xlsx") 'Exceldaten, die das Ziel sein _
soll mit Pfad!!!!
With nwb.Sheets("STO1")
If .Range("a1") = "" Then
Set lzelle = Range("a1") 'wenn a1 leer ist bei A2 beginnen
Else
Set lzelle = .Range("A:Y").Find(What:="*", after:=.Range("A1"), LookIn:=xlValues, _
LookAt:=xlWhole, searchdirection:=xlPrevious) 'letzte beschriebene _
Zelle im bereich "A:Y" ermitteln
End If
End With
With Sheets("Schichtenprotokoll")
.Unprotect 'Blatschutz aufheben
With .Range("A42:Y51")
Application.Intersect(.EntireColumn, .SpecialCells(xlCellTypeConstants).EntireRow).Copy 'ohne Leerzeilen kopieren
End With
.Protect 'Blatt wieder schützen
End With
hier hab ich einfach den CB21-Code an CB1-Code angehäng und ein wenig angepasst:
Private Sub CommandButton1_Click()
Dim awb As Workbook, nwb As Workbook
Dim rngZelle As Range
Dim strPasswort As String
Dim strPassalt As String
strPassalt = "xyz" 'Passwort zum Vergleich hier anpassen
'strPasswort = InputBox("Zum Übertragen bitte Passwort eingeben", "Passwortabfrage")
Application.EnableEvents = False 'Ausschalten eines Ereignisses z.Bsp. Worksheet_Change
Set awb = ActiveWorkbook 'Exceldaten, die momentan im zugriff ist "merken"
If Range("A1") = "0" Then
strPasswort = InputBox("Zum Übertragen bitte Passwort eingeben", "Passwortabfrage")
If strPasswort = strPassalt Then
If MsgBox("Sollen die Daten übertragen werden?", vbYesNo, "Achtung") = vbYes Then
Application.EnableEvents = True 'Ereigniss wieder einschalten wichtig!!!!
'Pfad und Dateinamen anpassen
'Tabelle1 gegen den Namen der Ziel/Ursprungstabelle austauschen
Set nwb = Workbooks.Open(Filename:="H:\Auswertung\MasterAuswertung.xlsm") 'Exceldaten, die das Ziel sein _
soll mit Pfad!!!!
With nwb.Sheets("AuswertungSM4")
If .Range("a2") = "" Then
Set rngZelle = .Range("a1") 'wenn a2 leer ist bei A2 beginnen
Else
Set rngZelle = .Range("A:AO").Find(What:="*", after:=.Range("A1"), LookIn:=xlValues, _
LookAt:=xlWhole, searchdirection:=xlPrevious) 'letzte beschriebene Zelle im bereich "A:V" ermitteln
End If
End With
Application.CutCopyMode = False
Range("A1").Value = "1"
Workbooks("MasterAuswertung.xlsm").Close Savechanges:=True
End If
Else
MsgBox "Du hast ein falsches Passwort eingegeben!"
Exit Sub
End If
Else
MsgBox "Die Daten wurden bereits übertragen!"
End If
'---------------------------------------------------------------------------------------------------------------------
Set nwb = Workbooks.Open(Filename:="H:\Auswertung\STO.xlsx") 'Exceldaten, die das Ziel sein _
soll mit Pfad!!!!
With nwb.Sheets("STO1")
If .Range("a1") = "" Then
Set rngZelle = Range("a1") 'wenn a1 leer ist bei A2 beginnen
Else
Set rngZelle = .Range("A:Y").Find(What:="*", after:=.Range("A1"), LookIn:=xlValues, _
LookAt:=xlWhole, searchdirection:=xlPrevious) 'letzte beschriebene Zelle im bereich "A:Y" ermitteln
End If
End With
With awb.Sheets("Schichtenprotokoll")
.Unprotect
With .Range("A42:Y51")
Application.Intersect(.EntireColumn, .SpecialCells(xlCellTypeConstants).EntireRow).Copy
End With
.Protect
End With
nwb.Sheets("STO1").Cells(rngZelle.Row + 1, 1).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False 'Werte einfügen
Application.CutCopyMode = False
Workbooks("STO.xlsx").Close Savechanges:=True
End Sub