можно ли сделать чтобы при закрытии книги лист1 копировался в другую книгу, где создавался бы лист с именем равным текущей даты? а если лист уже существует то данные обновляются или заменяются. и если такое возможно, то можно ли копировать лист не при каждом закрытии книги, а с условием что на Листе1 делались изменения?
можно ли сделать чтобы при закрытии книги лист1 копировался в другую книгу, где создавался бы лист с именем равным текущей даты? а если лист уже существует то данные обновляются или заменяются. и если такое возможно, то можно ли копировать лист не при каждом закрытии книги, а с условием что на Листе1 делались изменения?AKSENOV048
Добрый день! вот макрос который делает резервную копию всей книги при выходе из нее. Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim x As String strPath = "C:\Users\Александр\Desktop\архив\магазин" On Error Resume Next x = GetAttr(strPath) And 0 If Err = 0 Then ' если путь существует - сохраняем копию книги strDate = Format(Date, "dd/mm/yy") FileNameXls = strPath & "\" & Left(Sheets(1).Name, _ Len(ActiveWorkbook.Name) - 4) & " " & strDate & ".xlsm" ActiveWorkbook.SaveCopyAs Filename:=FileNameXls Else 'если путь не существует - выводим сообщение MsgBox "Папка " & strPath & " недоступна или не существует!", vbCritical End If End Sub
я что то не правильно делаю. перестает работать когда я заменяю ActiveWorkbook.SaveCopyAs Filename:=FileNameXls на ActiveWorkbook.Sheets(1).SaveCopyAs Filename:=FileNameXls1 или Sheets(1).SaveCopyAs Filename:=FileNameXls1
Добрый день! вот макрос который делает резервную копию всей книги при выходе из нее. Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim x As String strPath = "C:\Users\Александр\Desktop\архив\магазин" On Error Resume Next x = GetAttr(strPath) And 0 If Err = 0 Then ' если путь существует - сохраняем копию книги strDate = Format(Date, "dd/mm/yy") FileNameXls = strPath & "\" & Left(Sheets(1).Name, _ Len(ActiveWorkbook.Name) - 4) & " " & strDate & ".xlsm" ActiveWorkbook.SaveCopyAs Filename:=FileNameXls Else 'если путь не существует - выводим сообщение MsgBox "Папка " & strPath & " недоступна или не существует!", vbCritical End If End Sub
я что то не правильно делаю. перестает работать когда я заменяю ActiveWorkbook.SaveCopyAs Filename:=FileNameXls на ActiveWorkbook.Sheets(1).SaveCopyAs Filename:=FileNameXls1 или Sheets(1).SaveCopyAs Filename:=FileNameXls1AKSENOV048
1. А с чего вы взяли, что у ЛИСТА ActiveWorkbook.Sheets(1) есть метод SaveCopyAs? Это метод КНИГИ. Поэтому и не работает. 2. И что значит Left(Sheets(1).Name, Len(ActiveWorkbook.Name) - 4)? Что-то я не пойму? Какая связь ДЛИНЫ имени активной книги без расширения (к стати, 4 - это рассчитано на .xls-файлы, а если всё-таки .xlsm, то должно быть 5) и именем сохраняемой книги? А что, если имя активной книги длиннее имени листа, то имя листа обрезать не надо что ли?(см. справку по функции Left)?
Что вам нужно-то? Разбить книгу на отдельные файлы по листам? Ну так запишите действия макрорекордером: - выберите нужный лист - сделайте ему по ПКМ на ярлыке листа "Переместить/скопировать" - "Создавать копию" - "В новую книгу" - эту новую книгу "Сохранить как..." Я не пойму, вы хотите сами научиться или чтобы за вас кто-то сделал? Ну попробуйте же сами разобрать макрос, который вы привели...
1. А с чего вы взяли, что у ЛИСТА ActiveWorkbook.Sheets(1) есть метод SaveCopyAs? Это метод КНИГИ. Поэтому и не работает. 2. И что значит Left(Sheets(1).Name, Len(ActiveWorkbook.Name) - 4)? Что-то я не пойму? Какая связь ДЛИНЫ имени активной книги без расширения (к стати, 4 - это рассчитано на .xls-файлы, а если всё-таки .xlsm, то должно быть 5) и именем сохраняемой книги? А что, если имя активной книги длиннее имени листа, то имя листа обрезать не надо что ли?(см. справку по функции Left)?
Что вам нужно-то? Разбить книгу на отдельные файлы по листам? Ну так запишите действия макрорекордером: - выберите нужный лист - сделайте ему по ПКМ на ярлыке листа "Переместить/скопировать" - "Создавать копию" - "В новую книгу" - эту новую книгу "Сохранить как..." Я не пойму, вы хотите сами научиться или чтобы за вас кто-то сделал? Ну попробуйте же сами разобрать макрос, который вы привели...Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Суббота, 03.09.2011, 21:56
Sub Макрос2() Sheets("МАГАЗИН").Select Sheets("МАГАЗИН").Copy ChDir "C:\Users\Александр\Desktop\архив\магазин" ActiveWorkbook.SaveAs Filename:= _ "C:\Users\Александр\Desktop\архив\магазин\03.09.11.xlsm", FileFormat:= _ xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False ActiveWindow.Close End Sub
вот так получается копировать отдельный листы, в разные книги, но они не сохраняются автоматически! Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim x1 As String Dim x4 As String Dim x7 As String strPath1 = "C:\Users\Александр\Desktop\архив\магазин\" strPath4 = "C:\Users\Александр\Desktop\архив\реализация корея\" strPath7 = "C:\Users\Александр\Desktop\архив\реализация бишкек\"
On Error Resume Next x1 = GetAttr(strPath1) And 0 x4 = GetAttr(strPath4) And 0 x7 = GetAttr(strPath7) And 0 If Err = 0 Then ' если путь существует - сохраняем копию книги strDate = Format(Date, "dd/mm/yy") FileNameXls1 = strPath1 & strDate & ".xlsm" FileNameXls4 = strPath4 & strDate & ".xlsm" FileNameXls7 = strPath7 & strDate & ".xlsm" Sheets(1).Copy ActiveWorkbook.SaveCopyAs Filename:=FileNameXls1 Sheets(4).Copy ActiveWorkbook.SaveCopyAs Filename:=FileNameXls4 Sheets(7).Copy ActiveWorkbook.SaveCopyAs Filename:=FileNameXls7 Else 'если путь не существует - выводим сообщение MsgBox "Папка " & strPath & " недоступна или не существует!", vbCritical End If End Sub
вот то что записал макрорекордером:
Sub Макрос2() Sheets("МАГАЗИН").Select Sheets("МАГАЗИН").Copy ChDir "C:\Users\Александр\Desktop\архив\магазин" ActiveWorkbook.SaveAs Filename:= _ "C:\Users\Александр\Desktop\архив\магазин\03.09.11.xlsm", FileFormat:= _ xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False ActiveWindow.Close End Sub
вот так получается копировать отдельный листы, в разные книги, но они не сохраняются автоматически! Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim x1 As String Dim x4 As String Dim x7 As String strPath1 = "C:\Users\Александр\Desktop\архив\магазин\" strPath4 = "C:\Users\Александр\Desktop\архив\реализация корея\" strPath7 = "C:\Users\Александр\Desktop\архив\реализация бишкек\"
On Error Resume Next x1 = GetAttr(strPath1) And 0 x4 = GetAttr(strPath4) And 0 x7 = GetAttr(strPath7) And 0 If Err = 0 Then ' если путь существует - сохраняем копию книги strDate = Format(Date, "dd/mm/yy") FileNameXls1 = strPath1 & strDate & ".xlsm" FileNameXls4 = strPath4 & strDate & ".xlsm" FileNameXls7 = strPath7 & strDate & ".xlsm" Sheets(1).Copy ActiveWorkbook.SaveCopyAs Filename:=FileNameXls1 Sheets(4).Copy ActiveWorkbook.SaveCopyAs Filename:=FileNameXls4 Sheets(7).Copy ActiveWorkbook.SaveCopyAs Filename:=FileNameXls7 Else 'если путь не существует - выводим сообщение MsgBox "Папка " & strPath & " недоступна или не существует!", vbCritical End If End SubAKSENOV048
strPath = "C:\Users\Александр\Desktop\архив\магазин" On Error Resume Next x = GetAttr(strPath) And 0 If Err = 0 Then
определяется, будет ли ошибка при выполнении GetAttr(). Поэтому в куске
Code
On Error Resume Next x1 = GetAttr(strPath1) And 0 x4 = GetAttr(strPath4) And 0 x7 = GetAttr(strPath7) And 0 If Err = 0
тактически неправильный подход - нужно это дело разбить на 3 отдельных подхода к каждому листу индивидуально. Ведь здесь будет ошибка, если любой из этих путей будет недоступен, и к тому же вот тут
Code
MsgBox "Папка " & strPath & " недоступна или не существует!", vbCritical
будет бестолковое сообщение, т.к. переменная strPath не имеет значения.
Я думаю, что вот тут
Code
strPath = "C:\Users\Александр\Desktop\архив\магазин" On Error Resume Next x = GetAttr(strPath) And 0 If Err = 0 Then
определяется, будет ли ошибка при выполнении GetAttr(). Поэтому в куске
Code
On Error Resume Next x1 = GetAttr(strPath1) And 0 x4 = GetAttr(strPath4) And 0 x7 = GetAttr(strPath7) And 0 If Err = 0
тактически неправильный подход - нужно это дело разбить на 3 отдельных подхода к каждому листу индивидуально. Ведь здесь будет ошибка, если любой из этих путей будет недоступен, и к тому же вот тут
Code
MsgBox "Папка " & strPath & " недоступна или не существует!", vbCritical
будет бестолковое сообщение, т.к. переменная strPath не имеет значения.Hugo
On Error Resume Next x1 = GetAttr(strPath1) And 0 x4 = GetAttr(strPath4) And 0 x7 = GetAttr(strPath7) And 0 If Err = 0 я думаю его вообще можно убрать.?
MsgBox "Папка " & strPath & " недоступна или не существует!", vbCritical не углядел! да и тоже принципе не обязательно.
а все же почему не сохраняются автоматом. я когда нажимаю закрыть, появляется три новых книги, с заголовками Книга 1 , 2 и 3, смотрю в папки там создаются файлы каждый в своей! Книги надо закрывать в ручную и присваивать им имена!
On Error Resume Next x1 = GetAttr(strPath1) And 0 x4 = GetAttr(strPath4) And 0 x7 = GetAttr(strPath7) And 0 If Err = 0 я думаю его вообще можно убрать.?
MsgBox "Папка " & strPath & " недоступна или не существует!", vbCritical не углядел! да и тоже принципе не обязательно.
а все же почему не сохраняются автоматом. я когда нажимаю закрыть, появляется три новых книги, с заголовками Книга 1 , 2 и 3, смотрю в папки там создаются файлы каждый в своей! Книги надо закрывать в ручную и присваивать им имена!AKSENOV048
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim x1 As String Dim x4 As String Dim x7 As String strPath1 = "C:\Users\Александр\Desktop\архив\магазин\" strPath4 = "C:\Users\Александр\Desktop\архив\реализация корея\" strPath7 = "C:\Users\Александр\Desktop\архив\реализация бишкек\"
Только есть вопрос - зачем как xlsm сохранять? Там в каждом листе макросы прописаны разве?
Вроде так (не проверял):
Code
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim x1 As String Dim x4 As String Dim x7 As String strPath1 = "C:\Users\Александр\Desktop\архив\магазин\" strPath4 = "C:\Users\Александр\Desktop\архив\реализация корея\" strPath7 = "C:\Users\Александр\Desktop\архив\реализация бишкек\"
еще вопрос. со временем файлов получится много, нашел код удаления файлов созданных 30 дней назад: Sub УдалениеФайл_Минус_30_Дн() TargetFolder = "h:\tmp" ControlDate = Date - 30 Set objFSO = CreateObject("Scripting.FileSystemObject") For Each objFile In objFSO.GetFolder(TargetFolder).Files If objFile.DateCreated < ControlDate Then objFSO.DeleteFile objFile.Path End If Next End Sub
можно ввести сразу три папки? TargetFolder = "C:\Users\Александр\Desktop\архив\магазин\" TargetFolder = "C:\Users\Александр\Desktop\архив\реализация корея\" TargetFolder = "C:\Users\Александр\Desktop\архив\реализация бишкек\"
еще вопрос. со временем файлов получится много, нашел код удаления файлов созданных 30 дней назад: Sub УдалениеФайл_Минус_30_Дн() TargetFolder = "h:\tmp" ControlDate = Date - 30 Set objFSO = CreateObject("Scripting.FileSystemObject") For Each objFile In objFSO.GetFolder(TargetFolder).Files If objFile.DateCreated < ControlDate Then objFSO.DeleteFile objFile.Path End If Next End Sub
можно ввести сразу три папки? TargetFolder = "C:\Users\Александр\Desktop\архив\магазин\" TargetFolder = "C:\Users\Александр\Desktop\архив\реализация корея\" TargetFolder = "C:\Users\Александр\Desktop\архив\реализация бишкек\"AKSENOV048
Можно конечно создать массив текстовых значений и перебирать в цикле его, но на 3 значения можно тупо так:
Code
Sub УдалениеФайл_Минус_30_Дн() ControlDate = Date - 30 Set objFSO = CreateObject("Scripting.FileSystemObject")
TargetFolder = "C:\Users\Александр\Desktop\архив\магазин\" For Each objFile In objFSO.GetFolder(TargetFolder).Files If objFile.DateCreated < ControlDate Then objFSO.DeleteFile objFile.Path End If Next
TargetFolder = "C:\Users\Александр\Desktop\архив\реализация корея\" For Each objFile In objFSO.GetFolder(TargetFolder).Files If objFile.DateCreated < ControlDate Then objFSO.DeleteFile objFile.Path End If Next
TargetFolder = "C:\Users\Александр\Desktop\архив\реализация бишкек\" For Each objFile In objFSO.GetFolder(TargetFolder).Files If objFile.DateCreated < ControlDate Then objFSO.DeleteFile objFile.Path End If Next
End Sub
С массивом вероятно так:
Code
Sub УдалениеФайл_Минус_30_Дн() ControlDate = Date - 30 Set objFSO = CreateObject("Scripting.FileSystemObject") arr = Array("C:\Users\Александр\Desktop\архив\магазин\", "C:\Users\Александр\Desktop\архив\реализация корея\", "C:\Users\Александр\Desktop\архив\реализация бишкек\")
For Each TargetFolder In arr For Each objFile In objFSO.GetFolder(TargetFolder).Files If objFile.DateCreated < ControlDate Then objFSO.DeleteFile objFile.Path End If Next Next
End Sub
Можно конечно создать массив текстовых значений и перебирать в цикле его, но на 3 значения можно тупо так:
Code
Sub УдалениеФайл_Минус_30_Дн() ControlDate = Date - 30 Set objFSO = CreateObject("Scripting.FileSystemObject")
TargetFolder = "C:\Users\Александр\Desktop\архив\магазин\" For Each objFile In objFSO.GetFolder(TargetFolder).Files If objFile.DateCreated < ControlDate Then objFSO.DeleteFile objFile.Path End If Next
TargetFolder = "C:\Users\Александр\Desktop\архив\реализация корея\" For Each objFile In objFSO.GetFolder(TargetFolder).Files If objFile.DateCreated < ControlDate Then objFSO.DeleteFile objFile.Path End If Next
TargetFolder = "C:\Users\Александр\Desktop\архив\реализация бишкек\" For Each objFile In objFSO.GetFolder(TargetFolder).Files If objFile.DateCreated < ControlDate Then objFSO.DeleteFile objFile.Path End If Next
End Sub
С массивом вероятно так:
Code
Sub УдалениеФайл_Минус_30_Дн() ControlDate = Date - 30 Set objFSO = CreateObject("Scripting.FileSystemObject") arr = Array("C:\Users\Александр\Desktop\архив\магазин\", "C:\Users\Александр\Desktop\архив\реализация корея\", "C:\Users\Александр\Desktop\архив\реализация бишкек\")
For Each TargetFolder In arr For Each objFile In objFSO.GetFolder(TargetFolder).Files If objFile.DateCreated < ControlDate Then objFSO.DeleteFile objFile.Path End If Next Next