Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2013, 09:09   #11
elf80
Пользователь
 
Регистрация: 09.08.2009
Сообщений: 33
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
1. Запрос на перезапись я специально убрал. Если же Вам это надо, то удалите из кода
Код:
Application.DisplayAlerts = False
2. Работу кода проверил. Все ОК. После копирования листа в новую книгу, он становится активным. Далее мы с ним и работаем. Скорее всего, проблема в том, что копируемый лист очень "тяжелый". Поэтому, макрос продолжает работать еще в то время, как активным является копируемый лист.
Если это так, то Вам должна помочь задержка выполнения последующего кода. Для этого, вместо DoEvents вставьте строку:
Код:
For i = 1 To 100000: DoEvents: Next
Счетчик цикла подберите экспериментально.
3. Можно, конечно, прикрепить не оригинальный файл, а подобный. Но, боюсь, что ели причина в вышеупомянутой проблеме, то "легкий" файл не даст истинной картины...

К сожалению всё на своём месте.
elf80 вне форума Ответить с цитированием
Старый 06.05.2013, 09:40   #12
elf80
Пользователь
 
Регистрация: 09.08.2009
Сообщений: 33
По умолчанию

Я уже не знаю в чём может причина. Может как то изменить алгоритм? Есть какие то идеи?
elf80 вне форума Ответить с цитированием
Старый 06.05.2013, 09:49   #13
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата из сообщения #9:
Цитата:
SAS888: Скорее всего, проблема в том, что копируемый лист очень "тяжелый". Поэтому, макрос продолжает работать еще в то время, как активным является копируемый лист.
Если в VBA-Excel-команде нет параметра, который определяет: дожидаться выполнения команды или нет, то следующая команда в VBA-коде продолжится только после того, как отработает команда.

Не могу сейчас привести пример VBA-Excel-команды, в которой есть параметр, определяющий: дожидаться выполнения команды или нет.
Скрипт вне форума Ответить с цитированием
Старый 06.05.2013, 11:00   #14
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

В сообщение внёс изменения. Дальше будет несколько сообщений, связанных с этим сообщением, когда в этом сообщении были старые данные.


Вот код, основанный на том, что здесь обсуждалось, только я дал листу и книге VBA-имена, через которые можно обращаться к конкретному листу и книге.

Нужно помнить, что если в "Excel 2003" в ячейке больше 255 символов, то VBA-команда "Worksheets(1).Copy" обрежет данные без предупреждения (сама программа "Excel 2003" предупреждает об этом).

Вообще, команду "Worksheets(1).Copy" можно заменить на копирование и вставку. При вставке выбрать нужные параметры вставки. На большом документе это будет быстрее, чем копирование листа и преобразование в нём формул в значения.

Код я под себя изменил, переделайте код под себя:
Код:
Sub СохранитьЛистВФайл()

    Dim myFolder$, myFilename$
    Dim myActivesheet As Excel.Worksheet
    Dim myNewBook As Excel.Workbook
    Dim myError As Long
    Dim i As Long

    '1. Я указал свой путь и имя файла, чтобы тестировать код.
        'На конце я указал слеш у пути, чтобы в коде не писать слеш.
    myFolder = "C:\Users\User\Desktop\Новая папка\"
    myFilename = "Книга.xlsx"
    
    
    '2. Даём активному листу VBA-имя, с помощью которого
        'будем обращаться к этому листу. Это нужно потому, что
        'в ходе работы кода сменится активная книга.
    Set myActivesheet = ActiveSheet
    
    
    '3. Создаём новую книгу, в которую скопируем лист из активной книги.
    'Даём новой книге VBA-имя "myNewBook".
    Set myNewBook = Workbooks.Add
    
    
    On Error Resume Next
        '4. копируем лист "доклад".
        'Нужно помнить, что если в ячейке больше 255 символов, то
            'текст будет обрезан в ячейках при копировании.
        myActivesheet.Copy Before:=myNewBook.Worksheets(1)
        myError = Err.Number
    On Error GoTo 0
    
    '5. произошла какая-то ошибка при попытке копирования листа
    If myError <> 0 Then
        Exit Sub
    End If
    
    
    '6. Удаляем пустые листы из новой книги.
    For i = 2 To myNewBook.Worksheets.Count Step 1
        'Отключаем предупреждающее сообщение, которое появится
            'при удалении листа.
        Application.DisplayAlerts = False
            myNewBook.Worksheets(i).Delete
        Application.DisplayAlerts = True
    Next i
    
    
    '7. Удаляем формулы.
    myNewBook.Worksheets(1).UsedRange.Value = myNewBook.Worksheets(1).UsedRange.Value
    
    
    '8. сохраняем файл под заданным именем в формате XLSX (xlOpenXMLWorkbook - Excel 2007)
    myNewBook.SaveAs myFolder & myFilename, xlOpenXMLWorkbook
    
    '9. закрываем файл без сохранения, т.к. у нас уже всё сохранено.
    myNewBook.Close False

End Sub

Последний раз редактировалось Скрипт; 06.05.2013 в 13:58.
Скрипт вне форума Ответить с цитированием
Старый 06.05.2013, 11:28   #15
elf80
Пользователь
 
Регистрация: 09.08.2009
Сообщений: 33
По умолчанию

Спасибо уважаемый Скрипт, при вставке вашего кода у меня появляется ошибка. Скрин прилагаю.
Вложения
Тип файла: rar Скрин.rar (110.8 Кб, 8 просмотров)
elf80 вне форума Ответить с цитированием
Старый 06.05.2013, 11:41   #16
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

elf80, очень часто при возникновении ошибки, строка с ошибкой выделяется жёлтым цветом. Какая строка выделяется жёлтым?
Скрипт вне форума Ответить с цитированием
Старый 06.05.2013, 12:14   #17
elf80
Пользователь
 
Регистрация: 09.08.2009
Сообщений: 33
По умолчанию

О выделении жёлтым я в курсе, но как на скрине, так и по всему коду отметок нет.
elf80 вне форума Ответить с цитированием
Старый 06.05.2013, 12:29   #18
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

elf80, да, в сообщении #14 я сделал ошибку. Замените этот пункт:
Код:
    '6. Удаляем пустые листы из новой книги.
    For i = myNewBook.Worksheets.Count To 2 Step -1
        'Отключаем предупреждающее сообщение, которое появится
            'при удалении листа.
        Application.DisplayAlerts = False
            myNewBook.Worksheets(i).Delete
        Application.DisplayAlerts = True
    Next i
Примечание

Забыл, что, если что-то нужно удалять, то удалять нужно с конца, т.к. порядковые номера меняются.
Скрипт вне форума Ответить с цитированием
Старый 06.05.2013, 13:34   #19
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Насколько я помню - если в 2003 делать не копию листа, а его перенос в новую книгу - то предела в 255 нет. Но сейчас проверить не могу - у меня в 2007 нет предела и при копировании.

По вопросу - проверил. Интересный эффект, я такого не замечал. Вероятно потому, что я всегда коды помещаю в стандартный модуль...
Попробуйте
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 06.05.2013 в 13:38.
Hugo121 вне форума Ответить с цитированием
Старый 06.05.2013, 13:48   #20
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Я думал, что и в "Excel 2007" осталось ограничение на копирование данных из ячейки.
Сейчас потестировал: в ячейку (Excel 2010) можно ввести 32767 символов.
При копировании не обрезаются данные.

Значит данные обрезаются только в "Excel 2003".
Скрипт вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как поправить код? Sanek_81 Microsoft Office Word 2 10.02.2011 17:19
Нужно поправить код SenFeron Помощь студентам 2 04.01.2011 19:54
поправить код! Cruelbob Общие вопросы C/C++ 6 12.05.2010 23:33
Нужно поправить код kimoncar PHP 0 13.04.2010 12:52
Поправить Код... Lucchese Общие вопросы C/C++ 1 25.01.2010 20:00