Доброе время суток. Столкнулся с проблемой невозможности заполнить пустые ячейки оставшиеся от сводной таблицы, подробно она описана тут. Суть в том, что у 2007 экселя есть ограничение по оперативке, я подозреваю из за этого при попытке выделить больше определенного количества "пустых" ячеек через F5 выдает ошибку. Соответственно код типа такого не работает: [vba]
Код
Sub Zapolnenye_Null() n = Selection.Address On Error GoTo A g = 1 / (Range(n).Cells.Count - 1) Selection.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C" Range(n) = Range(n).Value A: Exit Sub End Sub
[/vba] Прошу помощи, есть ли способ обойти это ограничение или заполнить пустые ячейки как-то иначе? Файл не прикладываю ибо массив необходимый для отражения проблемы просто не вписывается в 100 кб. Для эксперимента: есть 72000 строк, из них заполнено 31000, в данном случае выделить только пустые не получается, выдает ошибку "Выделенная область слишком велика".
Доброе время суток. Столкнулся с проблемой невозможности заполнить пустые ячейки оставшиеся от сводной таблицы, подробно она описана тут. Суть в том, что у 2007 экселя есть ограничение по оперативке, я подозреваю из за этого при попытке выделить больше определенного количества "пустых" ячеек через F5 выдает ошибку. Соответственно код типа такого не работает: [vba]
Код
Sub Zapolnenye_Null() n = Selection.Address On Error GoTo A g = 1 / (Range(n).Cells.Count - 1) Selection.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C" Range(n) = Range(n).Value A: Exit Sub End Sub
[/vba] Прошу помощи, есть ли способ обойти это ограничение или заполнить пустые ячейки как-то иначе? Файл не прикладываю ибо массив необходимый для отражения проблемы просто не вписывается в 100 кб. Для эксперимента: есть 72000 строк, из них заполнено 31000, в данном случае выделить только пустые не получается, выдает ошибку "Выделенная область слишком велика".argetlam
Сообщение отредактировал argetlam - Суббота, 09.04.2016, 17:25
Karataev, Говорю же: VBA не выдает ошибки. Совсем. Он работает, но результат совершенно не тот, который должен быть. Сейчас я пользуюсь кодом типа: [vba]
Код
sub test()
Dim wbKO As Workbook Dim wsWS As Worksheet sFileName = Application.GetOpenFilename("Excel файлы (*.xls; *.xlsx; *.xlsm),*.xls;*.xslx;*.xlsm") Set wbKO = Workbooks.Open(sFileName) Set wsWS = wbKO.Worksheets(1)
[/vba] Но для .SpecialCells(xlCellTypeBlanks) обрабатываемый массив слишком большой.
Karataev, Говорю же: VBA не выдает ошибки. Совсем. Он работает, но результат совершенно не тот, который должен быть. Сейчас я пользуюсь кодом типа: [vba]
Код
sub test()
Dim wbKO As Workbook Dim wsWS As Worksheet sFileName = Application.GetOpenFilename("Excel файлы (*.xls; *.xlsx; *.xlsm),*.xls;*.xslx;*.xlsm") Set wbKO = Workbooks.Open(sFileName) Set wsWS = wbKO.Worksheets(1)
argetlam, то, что эффектно выполняется вручную и на небольшой сводной таблице (точнее, на ее результатах), не всегда срабатывает при буквальном перекладывании алгоритма на большие объемы. Вы сегодня как раз с этим столкнулись. Но раз уж расчехлен макроинструментарий, так ему и поручите массовое выполнение элементарных операций: [vba]
Код
Sub io() Dim rng As Range, c As Range
Set rng = Range("A2:K72000") For Each c In rng.Cells If IsEmpty(c) Then c = c.Offset(-1) Next End Sub
[/vba] Минута времени выполнения - и тема закрыта.
Но для .SpecialCells(xlCellTypeBlanks) обрабатываемый массив слишком большой.
Подозреваю, что тут срабатывает техническое ограничение Excel: "Количество выделенных диапазонов, не более - 2 048" (можно погуглить по фразе "Excel технические характеристики").
argetlam, то, что эффектно выполняется вручную и на небольшой сводной таблице (точнее, на ее результатах), не всегда срабатывает при буквальном перекладывании алгоритма на большие объемы. Вы сегодня как раз с этим столкнулись. Но раз уж расчехлен макроинструментарий, так ему и поручите массовое выполнение элементарных операций: [vba]
Код
Sub io() Dim rng As Range, c As Range
Set rng = Range("A2:K72000") For Each c In rng.Cells If IsEmpty(c) Then c = c.Offset(-1) Next End Sub
[/vba] Минута времени выполнения - и тема закрыта.
Но для .SpecialCells(xlCellTypeBlanks) обрабатываемый массив слишком большой.
Подозреваю, что тут срабатывает техническое ограничение Excel: "Количество выделенных диапазонов, не более - 2 048" (можно погуглить по фразе "Excel технические характеристики").Gustav
Karataev, Вставляет значение из предыдущей ячейки. Gustav, отличное решение, я пытался выдумать что-то такое, но знаний у меня хватает только на макрорекордер Большое спасибо, проблема решена! А код в библиотеку эталонных решений (после добавления динамического диапазона вместо Range).
Подозреваю, что тут срабатывает техническое ограничение Excel: "Количество выделенных диапазонов, не более - 2 048" (можно погуглить по фразе "Excel технические характеристики").
Ну я подозревал что-то такое, спасибо за уточнение.
UPD Вот такой код меня вполне устроил, отличная замена коду в шапке: [vba]
Код
Sub test() Dim wbWB As Worksheet Dim rng As Range, c As Range Set wbWB = Application.ActiveWorkbook.ActiveWorksheet Set rng = wbWB.Range("A2", "C" + Replace(Str(wbWB.Cells(wbWB.Rows.Count, 5).End(xlUp).Row), " ", "")) 'подразумеваютcя область от A2 до последней заполненной ячейки С. Последняя ячейка считается по 5 столбцу
For Each c In rng.Cells If IsEmpty(c) Then c = c.Offset(-1) Next End sub
[/vba]
Портянку с Range в принципе можно заменить на Cells(1,1).CurrentRegion, но тогда пропуски в числовых значениях тоже будут заполнены, что не есть корректно. Однако если различных сумм не было в сводной - такое решение допустимо.
Karataev, Вставляет значение из предыдущей ячейки. Gustav, отличное решение, я пытался выдумать что-то такое, но знаний у меня хватает только на макрорекордер Большое спасибо, проблема решена! А код в библиотеку эталонных решений (после добавления динамического диапазона вместо Range).
Подозреваю, что тут срабатывает техническое ограничение Excel: "Количество выделенных диапазонов, не более - 2 048" (можно погуглить по фразе "Excel технические характеристики").
Ну я подозревал что-то такое, спасибо за уточнение.
UPD Вот такой код меня вполне устроил, отличная замена коду в шапке: [vba]
Код
Sub test() Dim wbWB As Worksheet Dim rng As Range, c As Range Set wbWB = Application.ActiveWorkbook.ActiveWorksheet Set rng = wbWB.Range("A2", "C" + Replace(Str(wbWB.Cells(wbWB.Rows.Count, 5).End(xlUp).Row), " ", "")) 'подразумеваютcя область от A2 до последней заполненной ячейки С. Последняя ячейка считается по 5 столбцу
For Each c In rng.Cells If IsEmpty(c) Then c = c.Offset(-1) Next End sub
[/vba]
Портянку с Range в принципе можно заменить на Cells(1,1).CurrentRegion, но тогда пропуски в числовых значениях тоже будут заполнены, что не есть корректно. Однако если различных сумм не было в сводной - такое решение допустимо.argetlam
Сообщение отредактировал argetlam - Суббота, 09.04.2016, 20:26