Оптимизация кода - VBA (48931)

Узнай цену своей работы

Формулировка задачи:

Есть код для копирования листа в созданную книгу, листы копируются с системной датой. Можно ли как то уменьшить код?
Листинг программы
  1. Sub копиялиста()
  2. Application.ScreenUpdating = False
  3. Dim NameBook, NameBookKop, ActiveDir, FoldDir, NameList, D As String
  4. Dim LastName
  5. Dim L
  6. D = Format(Date, "dd.mm.yyyy") ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Дата сохранения
  7. NameList = "Дневная сводка" '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Имя листа для копии
  8. NameBookKop = "Копия листов тест.xlsm" ''''''''''''''''''''''''''''''''''''''''''''''''''''''''Имя файла в который будет копироваться
  9. NameBook = ActiveWorkbook.Name ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Имя активной книги
  10. ActiveDir = ActiveWorkbook.Path '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''дирректория активного файла или указать свой путь "C:"
  11. FoldDir = ActiveDir & "\" & NameBookKop ''''''''''''''''''''''''''''''''''''''''''''''полный путь к файлу для открытия
  12. If MsgBox("Сохранить дневную сводку в архив?", vbOKCancel, "Внимание!") = vbOK Then
  13. On Error Resume Next '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''если файл не открыт то идем дальше, если открыт то закрываем
  14. Windows(NameBookKop).Close
  15. Workbooks.Open Filename:=FoldDir ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''открываем файл для копирования
  16. Windows(NameBookKop).Activate 'выделяем открытую книгу для определения последнего листа
  17. LastName = Application.Workbooks.Item(ActiveWorkbook.Name).Sheets.Count 'поиск номера последнего листа
  18. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Проверка наличия листа, если лист не найден - делаем копию листа
  19. L = 0
  20. For Each Sheet In Worksheets
  21. If Sheet.Name = NameList & " " & D Then
  22. L = 1
  23. If MsgBox("Лист уже сохранен! Удалить его? После удаления, данные вернуть не возможно!!!", vbOKCancel, "Внимание!") = vbOK Then
  24. Application.DisplayAlerts = False ' выключаем все предупреждения
  25. Sheets(NameList & " " & D).Delete
  26. ActiveWorkbook.Save
  27. ActiveWorkbook.Close
  28. Application.DisplayAlerts = True 'обратно включаем предупреждения.
  29. Workbooks(NameBook).Sheets("Главная").CommandButton1.Caption = "Лист " & NameList & " " & D & " был удален! " 'пишем в кнопке
  30. Workbooks(NameBook).Sheets("Главная").CommandButton1.BackColor = RGB(255, 0, 0) 'расскрашиваем кнопку красным
  31. MsgBox "Лист " & NameList & " " & D & " был удален! Сделайте копию листа!", , "Внимание!"
  32. End If
  33. End If
  34. Next
  35. If L = 0 Then
  36. Windows(NameBook).Activate
  37. Sheets(NameList).Select
  38. Sheets(NameList).Copy After:=Workbooks(NameBookKop).Sheets(LastName) 'копия листа
  39. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  40. Windows(NameBookKop).Activate
  41. LastName = Str(Application.Workbooks.Item(ActiveWorkbook.Name).Sheets.Count) 'поиск номера последнего листа
  42. Sheets(LastName).Activate
  43. ActiveSheet.Name = NameList & " " & D 'переименование последнего сохраненного листа
  44. ActiveWorkbook.Save
  45. MsgBox "Данные успешно сохранены!", , "Внимание!"
  46. Workbooks(NameBook).Sheets("Главная").CommandButton1.Caption = "Лист сохранен!" 'пишем в кнопке
  47. Workbooks(NameBook).Sheets("Главная").CommandButton1.BackColor = RGB(0, 255, 0) 'расскрашиваем кнопку зеленым
  48. End If
  49. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  50. Windows(NameBookKop).Close
  51. Windows(NameBook).Activate
  52. Sheets("Главная").Select
  53. Application.ScreenUpdating = True
  54. End If
  55. End Sub

Решение задачи: «Оптимизация кода»

textual
Листинг программы
  1. Sub копиялиста()
  2.   Dim NameBookKop$, NameList$, newName$
  3.   Dim Sh As Worksheet, ActBook As Workbook
  4.    
  5.     Set ActBook = ActiveWorkbook
  6.     NameList = "Дневная сводка"                         ' Имя листа для копии
  7.    newName = NameList & Format(Date, " dd.mm.yyyy")    ' новое наименование листа
  8.    NameBookKop = "Копия листов тест.xlsm"              ' Имя файла в который будет копироваться
  9.  
  10.     If MsgBox("Сохранить дневную сводку в архив?", vbOKCancel, "Внимание!") <> vbOK Then Exit Sub
  11.     Application.ScreenUpdating = False
  12.     On Error Resume Next
  13.     Workbooks(NameBookKop).Close ' если файл не открыт то идем дальше, если открыт то закрываем
  14.    With Workbooks.Open(Filename:=ActBook.Path & "\" & NameBookKop) 'открываем файл для копирования
  15.        Set Sh = .Sheets(newName)
  16.         On Error GoTo 0
  17.         If Not Sh Is Nothing Then
  18.             If MsgBox("Лист уже сохранен! Удалить его? После удаления, данные вернуть не возможно!!!", _
  19.                     vbOKCancel + vbExclamation, "Внимание!") = vbOK Then
  20.                 Application.DisplayAlerts = False ' выключаем все предупреждения
  21.                Sh.Delete
  22.                 Application.DisplayAlerts = True 'обратно включаем предупреждения.
  23.                .Close True
  24.                 With ActBook.Sheets("Главная").CommandButton1
  25.                     .Caption = "Лист " & newName & " был удален! " 'пишем в кнопке
  26.                    .BackColor = RGB(255, 0, 0) 'расскрашиваем кнопку красным
  27.                    MsgBox "Лист " & newName & " был удален! Сделайте копию листа!", vbInformation, "Внимание!"
  28.                 End With
  29.             End If
  30.         Else
  31.             ActBook.Sheets(NameList).Copy After:=.Sheets(.Sheets.Count) 'копия листа
  32.            .Sheets(.Sheets.Count).Name = newName
  33.             .Close True
  34.             MsgBox "Данные успешно сохранены!", vbInformation, "Внимание!"
  35.             With Sheets("Главная").CommandButton1
  36.                 .Caption = "Лист сохранен!"     'пишем в кнопке
  37.                .BackColor = RGB(0, 255, 0) 'расскрашиваем кнопку зеленым
  38.            End With
  39.         End If
  40.     End With
  41.     Application.ScreenUpdating = True
  42. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы