AW: ... schreibgeschützt und ohne Aktualisierung
20.01.2014 03:04:57
fcs
Hallo Constantin,
man kann die Ereignismakros vorübergehend deaktivieren. So ist es kein Problem, die Quelldateien zu öffnen. Wenn die Dateien nur zum Ändern kennwortgeschützt sind, dann werden die Passwörter im Makro nicht benötigt.
Nachfolgend ein entsprechendes Makro.
Gruß
Franz
'Makro in einem allgemeinen Modul
Sub DatenHolen()
Dim strQDateien(1 To 5) As String
Dim intI As Integer, StatusCalc As Long
Dim wksZiel As Worksheet
Dim wkbQuelle As Workbook, wksQuelle As Worksheet
Dim ZeileL As Long, ZeileZ As Long, Zelle As Range
On Error GoTo Fehler
strQDateien(1) = "C:\Pfad1\Datei01.xlsm"
strQDateien(2) = "C:\Pfad2\Datei02.xlsm"
strQDateien(3) = "C:\Pfad3\Datei03.xlsm"
strQDateien(4) = "C:\Pfad4\Datei04.xlsm"
strQDateien(5) = "C:\Pfad5\Datei05.xlsm"
'Makrobremsen lösen
With Application
.ScreenUpdating = False
.EnableEvents = False 'Ereignismakros deaktivieren
StatusCalc = .Calculation
.Calculation = xlCalculationManual
End With
Set wksZiel = ActiveSheet 'ggf. Anpassen
ZeileZ = 2 'Startzeile für das Einfügen der Daten in Zieltabelle
For intI = LBound(strQDateien) To UBound(strQDateien)
'Quelldatei schreibgeschützt öffnen
Set wkbQuelle = Application.Workbooks.Open(Filename:=strQDateien(intI), _
UpdateLinks:=False, ReadOnly:=True)
'Quelltabellenblatt setzen
Set wksQuelle = wkbQuelle.Worksheets(1) 'wkbQuelle.Worksheets("Tabelle1"))
With wksQuelle
'Letzte Zelle mit Daten in einer Zeile ermitteln
Set Zelle = .Cells.Find(what:="*", After:=.Cells(1, 1), LookIn:=xlValues, _
lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlPrevious)
If Not Zelle Is Nothing Then
ZeileL = Zelle.Row
If ZeileL >= 10 Then
'zu kopierender Zellbereich, ggf. anpassen
With .Range(.Cells(10, 1), .Cells(ZeileL, 26))
.Copy
'Werte in Zieltabelle kopieren
wksZiel.Cells(ZeileZ, 1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
'nächste Einfügezeile berechnen
ZeileZ = ZeileZ + .Rows.Count
End With
End If
End If
End With
'Quelldatei ohne zu speichern wieder schliessen
wkbQuelle.Close savechanges:=False
Set wkbQuelle = Nothing
Set wksQuelle = Nothing
Next intI
'Fehlerbehandlung
Fehler:
With Err
Select Case .Number
Case 0 'Alles OK
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description, _
vbOKOnly + vbInformation, "Makro: DatenHolen"
If Not wkbQuelle Is Nothing Then wkbQuelle.Close savechanges:=False
End Select
End With
'Makrobremsen wieder zurücksetzen
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = StatusCalc
End With
End Sub