Добрый день еще раз! Имеется файл Excel размером 10,5 метров. Внутри длиннющая таблица с границами, переносами слов, разными шрифтами и т.д. Любые операции с таблицей, включая элементарное выделение Ctrl+Shift+вниз заканчиваются зависанием программы на очень продолжительный период времени (час и более), хотя ОЗУ 8Гб. Нужно упростить данную таблицу. Приняли решение снять полностью форматирование таблицы, чтобы облегчить вес файла. Как это можно сделать с помощью макроса? Или у вас есть другие предложения, которые в итоге помогут работать с данными внутри этого файла? Спасибо!
Добрый день еще раз! Имеется файл Excel размером 10,5 метров. Внутри длиннющая таблица с границами, переносами слов, разными шрифтами и т.д. Любые операции с таблицей, включая элементарное выделение Ctrl+Shift+вниз заканчиваются зависанием программы на очень продолжительный период времени (час и более), хотя ОЗУ 8Гб. Нужно упростить данную таблицу. Приняли решение снять полностью форматирование таблицы, чтобы облегчить вес файла. Как это можно сделать с помощью макроса? Или у вас есть другие предложения, которые в итоге помогут работать с данными внутри этого файла? Спасибо!Мурад
Попробуйте открыть файл архиватором (у файла должен быть новый формат - xlsx, xlsm, xlsb) и удалить папку xl\styles.xml. При последующем открытии будет ругаться - не обращайте внимания.
Попробуйте открыть файл архиватором (у файла должен быть новый формат - xlsx, xlsm, xlsb) и удалить папку xl\styles.xml. При последующем открытии будет ругаться - не обращайте внимания._Boroda_
китин, вчера смотрел этот топик перед написанием своего. Там макрос выполняет действия копирования - вставки, что опять загружает процессор на безумное количество времени. _Boroda_, к сожалению, файл выгружается встроенными средствами специализированной программы в формате *.xls Нажал сохранить как *.xlsx, пошел процесс, идет уже 5 минут..
китин, вчера смотрел этот топик перед написанием своего. Там макрос выполняет действия копирования - вставки, что опять загружает процессор на безумное количество времени. _Boroda_, к сожалению, файл выгружается встроенными средствами специализированной программы в формате *.xls Нажал сохранить как *.xlsx, пошел процесс, идет уже 5 минут..Мурад
Мурад, это выгрузка из 1С? Если да (хотя, не так уж и важно, откуда она), то там больше всего тормозят, как это не удивительно, границы ячеек (я про раскраску сетки, которая в Формат ячеек - граница). В 99% случаев после операции {Встать в А1 - Нажать Контрл + Шифт + Енд - Нажать Контрл + 1 - Границы - Нет - ОК (или на вкладке Главная есть стрелка для выбора границ)} тормоза уходят. Другое дело, что часто бывает, что сам процесс снятия границ может быть довольно-таки длительным. И еще - у большинства программ есть возможность выгружать файлы в новом формате Excel, но для этого информатикам нужно немного поработать. А им лень и они говорят, что это невозможно. В 1С я с этим сталкивался довольно часто. Да и в других программах тоже.
Мурад, это выгрузка из 1С? Если да (хотя, не так уж и важно, откуда она), то там больше всего тормозят, как это не удивительно, границы ячеек (я про раскраску сетки, которая в Формат ячеек - граница). В 99% случаев после операции {Встать в А1 - Нажать Контрл + Шифт + Енд - Нажать Контрл + 1 - Границы - Нет - ОК (или на вкладке Главная есть стрелка для выбора границ)} тормоза уходят. Другое дело, что часто бывает, что сам процесс снятия границ может быть довольно-таки длительным. И еще - у большинства программ есть возможность выгружать файлы в новом формате Excel, но для этого информатикам нужно немного поработать. А им лень и они говорят, что это невозможно. В 1С я с этим сталкивался довольно часто. Да и в других программах тоже._Boroda_
_Boroda_, программа называется Электронный Бюджет, облачная хрень. Не пойму, почему многие разработчики продолжают встраивать в свои БД устаревшие шаблоны Экселя. Неужели он проще?!
_Boroda_, программа называется Электронный Бюджет, облачная хрень. Не пойму, почему многие разработчики продолжают встраивать в свои БД устаревшие шаблоны Экселя. Неужели он проще?!Мурад
Любые операции с таблицей, включая элементарное выделение Ctrl+Shift+вниз заканчиваются зависанием программы на очень продолжительный период времени (час и более), хотя ОЗУ 8Гб
Любые операции с таблицей, включая элементарное выделение Ctrl+Shift+вниз заканчиваются зависанием программы на очень продолжительный период времени (час и более), хотя ОЗУ 8Гб
Александр, сохранить как Эксель 2007 я уже пытался. Подождал 10 минут и завершил процесс. Вот пробую теперь просто выделить Ctrl+Shift+End, жду уже 40 минут..
Александр, сохранить как Эксель 2007 я уже пытался. Подождал 10 минут и завершил процесс. Вот пробую теперь просто выделить Ctrl+Shift+End, жду уже 40 минут..Мурад
Если копировать и вставлять кусочками по 5-10 строк, то все нормально. Но стоит попытаться прокрутить бегунок вниз хотя бы на 1см, система зависает. Может макрос какой-нибудь поможет? Копировать A1:U1, Вставить в другой файл A1:U1 без форматирования, потом A2:U2, и т.д. Именно кусочками. Или макросом не копипастить, а кусочками снимать форматирование с таблицы на этом же листе
Если копировать и вставлять кусочками по 5-10 строк, то все нормально. Но стоит попытаться прокрутить бегунок вниз хотя бы на 1см, система зависает. Может макрос какой-нибудь поможет? Копировать A1:U1, Вставить в другой файл A1:U1 без форматирования, потом A2:U2, и т.д. Именно кусочками. Или макросом не копипастить, а кусочками снимать форматирование с таблицы на этом же листеМурад
Сообщение отредактировал Мурад - Пятница, 26.02.2016, 11:40
длиннющая таблица с границами, переносами слов, разными шрифтами и т.д.
китин, Вам правильно написал - нужно двигатся в том направлении. Как показывает моя практика - лучше всего сделать макрос для очистки- копирования. Причем желательно запускать из другой книги. Алгоритм такой: Отключаем все события - я пользуюсь таким макросом [vba]
Код
Sub speedOn() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False Application.DisplayStatusBar = False Application.DisplayAlerts = False End Sub
[/vba] Открываем книгу Удаляем форматы черезCells.ClearFormats - так на порядок быстрее чем отдельно снимать границы, убирать переносы, применять другой шрифт.... Копируем Вставляем через PasteSpecial Paste:=xlPasteValues - так быстрее чем обычный paste (или пересохраняем файл в новом формате.) Включаем все события обратно: [vba]
Код
Sub speedOff() Application.StatusBar = False Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.CalculateBeforeSave = True Application.EnableEvents = True Application.DisplayStatusBar = True Application.DisplayAlerts = True DoEvents End Sub
[/vba]
ЗЫ в макросе нужно исключать любые выделения ячеек.
длиннющая таблица с границами, переносами слов, разными шрифтами и т.д.
китин, Вам правильно написал - нужно двигатся в том направлении. Как показывает моя практика - лучше всего сделать макрос для очистки- копирования. Причем желательно запускать из другой книги. Алгоритм такой: Отключаем все события - я пользуюсь таким макросом [vba]
Код
Sub speedOn() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False Application.DisplayStatusBar = False Application.DisplayAlerts = False End Sub
[/vba] Открываем книгу Удаляем форматы черезCells.ClearFormats - так на порядок быстрее чем отдельно снимать границы, убирать переносы, применять другой шрифт.... Копируем Вставляем через PasteSpecial Paste:=xlPasteValues - так быстрее чем обычный paste (или пересохраняем файл в новом формате.) Включаем все события обратно: [vba]
Код
Sub speedOff() Application.StatusBar = False Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.CalculateBeforeSave = True Application.EnableEvents = True Application.DisplayStatusBar = True Application.DisplayAlerts = True DoEvents End Sub
[/vba]
ЗЫ в макросе нужно исключать любые выделения ячеек.SLAVICK
Попробуйте для начала сразу. В другой книге на пустом листе запустите вот так (названия, понятное дело, свои) [vba]
Код
Sub Макрос1() With Workbooks("База_2016_01_21__8.xlsm").Sheets("База") r1_ = .Range("A" & Rows.Count).End(xlUp).Row'* c1_ = .Cells(1, Columns.Count).End(xlToLeft).Column'** Range("A1").Resize(r1_, c1_) = .Range("A1").Resize(r1_, c1_).Value End With End Sub
[/vba] * - номер последней заполненной ячейки столбца А должен быть равер номеру последней заполненной ячейки всей таблицы ** - аналогично для строки 1
И да, как Славик выше написал, неплохо бы отключить сначала .ScreenUpdating и .Calculation
Попробуйте для начала сразу. В другой книге на пустом листе запустите вот так (названия, понятное дело, свои) [vba]
Код
Sub Макрос1() With Workbooks("База_2016_01_21__8.xlsm").Sheets("База") r1_ = .Range("A" & Rows.Count).End(xlUp).Row'* c1_ = .Cells(1, Columns.Count).End(xlToLeft).Column'** Range("A1").Resize(r1_, c1_) = .Range("A1").Resize(r1_, c1_).Value End With End Sub
[/vba] * - номер последней заполненной ячейки столбца А должен быть равер номеру последней заполненной ячейки всей таблицы ** - аналогично для строки 1
И да, как Славик выше написал, неплохо бы отключить сначала .ScreenUpdating и .Calculation_Boroda_
Ну тогда и мой вариант - немного длинее, чем _Boroda_ написал, но как по мне, удобнее и должен быть по шустрее Если не нужна очистка и сохранение файла в новом формате - можете удалить строки с комментариями. ждем Ваших тестов : [vba]
Код
Sub d() Dim wb As Workbook, sh As Worksheet speedOn Set sh = ActiveSheet fn = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файла") Set wb = Workbooks.Open(fn) With wb With .Sheets(1) .Cells.ClearFormats ' очистка форматов .UsedRange.Copy End With sh.Cells(1, 1).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False fn = Left(fn, InStrRev(fn, ".")) & "xlsx" .SaveAs Filename:=fn, FileFormat:=xlOpenXMLWorkbook 'Сохранение книги в "xlsx" .Close End With speedOff End Sub
[/vba] Зы speedOn и speedOff в прошлом посте писал, поэтому не дублирую.(В файле все есть)
Ну тогда и мой вариант - немного длинее, чем _Boroda_ написал, но как по мне, удобнее и должен быть по шустрее Если не нужна очистка и сохранение файла в новом формате - можете удалить строки с комментариями. ждем Ваших тестов : [vba]
Код
Sub d() Dim wb As Workbook, sh As Worksheet speedOn Set sh = ActiveSheet fn = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файла") Set wb = Workbooks.Open(fn) With wb With .Sheets(1) .Cells.ClearFormats ' очистка форматов .UsedRange.Copy End With sh.Cells(1, 1).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False fn = Left(fn, InStrRev(fn, ".")) & "xlsx" .SaveAs Filename:=fn, FileFormat:=xlOpenXMLWorkbook 'Сохранение книги в "xlsx" .Close End With speedOff End Sub
[/vba] Зы speedOn и speedOff в прошлом посте писал, поэтому не дублирую.(В файле все есть)SLAVICK
With Workbooks("project_25.02.xls").Sheets(1) r1_ = .Range("A" & Rows.Count).End(xlUp).Row '* c1_ = .Cells(1, Columns.Count).End(xlToLeft).Column '** Range("A1").Resize(r1_, c1_) = .Range("A1").Resize(r1_, c1_).Value End With End Sub
[/vba]
Покрутил секунды 3 и завершилось. Но результата нет. Я посмотрел синтаксис кода [vba]
Код
.Range("A" & Rows.Count).End(xlUp).Row
[/vba] в гугле, но там число строк нигде не вставляется..
With Workbooks("project_25.02.xls").Sheets(1) r1_ = .Range("A" & Rows.Count).End(xlUp).Row '* c1_ = .Cells(1, Columns.Count).End(xlToLeft).Column '** Range("A1").Resize(r1_, c1_) = .Range("A1").Resize(r1_, c1_).Value End With End Sub
[/vba]
Покрутил секунды 3 и завершилось. Но результата нет. Я посмотрел синтаксис кода [vba]
Код
.Range("A" & Rows.Count).End(xlUp).Row
[/vba] в гугле, но там число строк нигде не вставляется..Мурад
1. Про последние 3 Апликейшна я вроде ничего не писал? 2. Если уж Вы так запустили, то запускайте теперь макрос Славика speedOn, чтобы все взад вернуть. 3. У Вас в каком столбце исходного файла всё заполнено до конца таблицы? Вот его и ставьте на место Range("А... 4. Со строкой аналогично - я предположил, что шапка таблицы в первой строке, а Вы вставьте здесь Cells(1,... нужный номер
PS. Юзедренж и иже с ним сознательно не использовал. [vba]
Код
Sub Макрос1() Application.ScreenUpdating = False Application.Calculation = xlCalculaltionManua
With Workbooks("project_25.02.xls").Sheets(1) r1_ = .Range("A" & Rows.Count).End(xlUp).Row c1_ = .Cells(1, Columns.Count).End(xlToLeft).Column Range("A1").Resize(r1_, c1_) = .Range("A1").Resize(r1_, c1_).Value End With Application.Calculation = xlCalculationAutomatic End Sub
[/vba]
1. Про последние 3 Апликейшна я вроде ничего не писал? 2. Если уж Вы так запустили, то запускайте теперь макрос Славика speedOn, чтобы все взад вернуть. 3. У Вас в каком столбце исходного файла всё заполнено до конца таблицы? Вот его и ставьте на место Range("А... 4. Со строкой аналогично - я предположил, что шапка таблицы в первой строке, а Вы вставьте здесь Cells(1,... нужный номер
PS. Юзедренж и иже с ним сознательно не использовал. [vba]
Код
Sub Макрос1() Application.ScreenUpdating = False Application.Calculation = xlCalculaltionManua
With Workbooks("project_25.02.xls").Sheets(1) r1_ = .Range("A" & Rows.Count).End(xlUp).Row c1_ = .Cells(1, Columns.Count).End(xlToLeft).Column Range("A1").Resize(r1_, c1_) = .Range("A1").Resize(r1_, c1_).Value End With Application.Calculation = xlCalculationAutomatic End Sub
Посчитал число строк с помощью СЧЁТЗ(). В итоге записал код след обр: [vba]
Код
Sub Макрос1() With Workbooks("project_25.02.xls").Sheets(1) r1_ = .Range("A" & 26773).End(xlUp).Row c1_ = .Cells(1, 21).End(xlToLeft).Column Range("A1").Resize(r1_, c1_) = .Range("A1").Resize(r1_, c1_).Value End With Application.Calculation = xlCalculationAutomatic End Sub
[/vba]
Макрос скопировал и вставил из тяжелого файла 10 первых строк и все.
Посчитал число строк с помощью СЧЁТЗ(). В итоге записал код след обр: [vba]
Код
Sub Макрос1() With Workbooks("project_25.02.xls").Sheets(1) r1_ = .Range("A" & 26773).End(xlUp).Row c1_ = .Cells(1, 21).End(xlToLeft).Column Range("A1").Resize(r1_, c1_) = .Range("A1").Resize(r1_, c1_).Value End With Application.Calculation = xlCalculationAutomatic End Sub
[/vba]
Макрос скопировал и вставил из тяжелого файла 10 первых строк и все.Мурад
Sub Макрос1() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual With Workbooks("project_25.02.xls").Sheets(1) Range("A1").Resize(26773, 21) = .Range("A1").Resize(26773, 21).Value End With Application.Calculation = xlCalculationAutomatic End Sub
[/vba] Добавлено Дописал последнюю букву в xlCalculationManual
Sub Макрос1() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual With Workbooks("project_25.02.xls").Sheets(1) Range("A1").Resize(26773, 21) = .Range("A1").Resize(26773, 21).Value End With Application.Calculation = xlCalculationAutomatic End Sub
[/vba] Добавлено Дописал последнюю букву в xlCalculationManual_Boroda_