Страницы: 1
RSS
Отобразить скрытые ячейки, исходя из заполненности предыдущей части таблицы
 
Добрый день.  
В общем, имеется таблица, ну, это естественно, это же Excel :)  
Так вот. Каждые, например, 10 строк она повторяется.  
Ну, допустим, 11 столбцов на 10 строк.  
И далее просто я её копирую... вниз, чтобы повторялась, там производятся вычисления, исходя из некоторых заполненных значений...  
Каким образом сделать, чтобы следующая повторяющая часть... была скрытой до тех пор, пока в определенной ячейке не появится значение... Точнее, в нескольких ячейках. То есть введет пользователь данные необходимые - и... у него произвелись вычисления нужные... и только тогда (когда пару ячеек стали непустыми) у него появляются следующие ячейки...  
Щас попробую склепать быстренько файлик для примера...  
Так, файлик прикладываю.  
То есть, например: скрыть все строки, начиная с 7-ой, пока все ячейки B5 - J5 пустые. Как только в одной из них появилось значение - отобразить с 7-ой по 11-ую строки. И так далее...  
Либо сделать, может, по-другому, если возможно, не копировать этот один экземпляр табличной повторяющейся части сразу, а при его заполнении чтобы он автоматически как-то копировался через одну ячейку ниже, например... ну, естественно, без заполненных данных, но с формулами...
 
Скорее всего проще будет макрос котрый будет копировать верхнюю табличку при заполнении определенных ячеек , иначе Вы памяти море сожрете на пустоту.  
Но это к Прайсту или Слэну или Юрию М или еще к кому ассам ВБА им это раз плюнуть , я море времени угроблю
 
Как вариант все покарсить в серый цвет, а табличку - в белый. Условным форматированием сделать условие - когда появляются данные в последних стобцах автоматом изменять штриховку )
 
нужно автоматически ксрыть группу строк при появлении "0" в ячейке этих сток, как это сделать ПОМОГИТЕ
 
Ну, у меня вообще-то, она будет не белым цветом, а некоторые строки будут цветные... так что - надо думать.  
Ладно, а как найти этих пользователей?  
>> "Но это к Прайсту или Слэну или Юрию М или еще к кому ассам ВБА им это раз плюнуть..."  
И насчет  - покрасить все в серый цвет - то есть это вручную скопировать, а при заполнении просто цвет менять?
 
{quote}{login=The_Prist}{date=31.08.2009 08:31}{thema=}{post}Как-то так. В ячейке H2 находится адрес диапазона, в котором необходимо отслеживать полноту заполнения. Как только все ячейки этого диапазона будут заполнены произойдет копирование таблицы.{/post}{/quote}  
Скачал файл - макросы не отключал, но там вижу просто диапазон... и ничего...  
Каким образом сделать так, чтобы...    
1) копировалась пустая табличка...  
2) копировалась она или отображалась при появлении хотя бы одного значения в указанном диапазоне?
 
Сейчас сделал запись макросом определенных моих действий...  
Но здесь он, конечно... выполняет это именно с указанными ячейками, то есть копирует первую таблицу на место второй, очищает значения и устанавливает курсор на определенную ячейку. Каким образом сделать это от ... последней непустой ячейки в столбце А ("Сумма" там написано). То есть от неё (А11) отступить одну строку и вставлять с А13, а копировать А7:L11. И так далее, чтоб все ниже и ниже...  
 
Sub Проба()  
'  
' Проба Макрос  
' Макрос записан 01.09.2009 ( )  
'  
   Range("A1:L5").Select  
   Selection.Copy  
   Range("A7").Select  
   ActiveSheet.Paste  
   Range("B8:J9").Select  
   Application.CutCopyMode = False  
   Selection.ClearContents  
   Range("B8").Select  
End Sub
 
На листе вот написано у The_Prist:  
 
Option Explicit  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Count > 1 Then Exit Sub  
'    Dim lLastRow As Long  
'    lLastRow = Cells(Rows.Count, 1).End(xlUp).Row  
'    Application.EnableEvents = False  
'    [N2] = Range(Cells(lLastRow - 3, 2), Cells(lLastRow - 3, 10)).Address(0, 0)
   If Intersect(Target, Range([N2])) Is Nothing Then Application.EnableEvents = True: Exit Sub
   Dim rCell As Range, bCopy As Boolean  
   bCopy = True  
   Application.EnableEvents = False  
   For Each rCell In Range([N2])
       If rCell = "" Then bCopy = False  
   Next rCell  
   If bCopy = True Then Range([N2]).Offset(-1, -1).Resize(6, 12).Copy Cells(Range([N2]).Row + 5, 1)
   [N2] = Range([N2]).Offset(6).Address(0, 0)
   Range([N2]).ClearContents
   Application.EnableEvents = True  
End Sub  
 
А что это значит? Я особо не сталкивался. И как это реализовать-то? Как само копирование сделать?  
Прикладываю файлик, в N и O диапазоны копирования и проверки соответственно.  
Собственно, нужно скопировать указанный диапазон, если диапазон проверки содержит хотя бы одно значение...  
Скопировать нужно ниже последней ячейки... и скопировать последнюю ячейку ниже себя через строчку, так получается... и удалить значения, в данном случае... B2:J3.
 
Прошу прощения, не тот файл прицепил...  
Да, а про ячейку J2 я не подумал, там же у меня стоит цифра 0...  
То есть нужно, чтоб проверка выполнялась на пустоту ячейки, а не на значение, наверно. 0 - это тоже цифра. Пользователь может и ее внести.  
Так, и чтоб копировалась уже табличка, если вбито хотя бы одно значение, а не все. То есть не обязательно все значения вбивать надо будет. Пользователь может внести 2 или 3 значения, или только одно.  
Ну, решил скопировать таблицу... по файлу The Prist...  
Ввел в ячейку J2 - скопировалась, в ячейке N2 диапазон изменился на B8:J8. Начинаю вводить значения в B8 - и сразу же в ячейке N2 диапазон становится B14:J14, таблица не копируется.  
Если ввожу все значения, кроме одного, и затем вручную меняю диапазон с B14:J14 обратно на B8:J8, и ввожу последнее значение - копируется табличка, но дальше снова после ввода первого значения диапазон меняется - и не копируется...  
 
Вообще, я хочу понять сам - что всё это значит - весь код...  
Или книжку по VBA маленькую, или конкретно про это объяснить, может быть?  
Ссылку на книжку в эл.виде, может, посмотреть?  
Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Count > 1 Then Exit Sub  
'    Dim lLastRow As Long  
'    lLastRow = Cells(Rows.Count, 1).End(xlUp).Row  
'    Application.EnableEvents = False  
'    [N2] = Range(Cells(lLastRow - 3, 2), Cells(lLastRow - 3, 10)).Address(0, 0)
   If Intersect(Target, Range([N2])) Is Nothing Then Application.EnableEvents = True: Exit Sub
   Dim rCell As Range, bCopy As Boolean  
   bCopy = True  
   Application.EnableEvents = False  
   For Each rCell In Range([N2])
       If rCell = "" Then bCopy = False  
   Next rCell  
   If bCopy = True Then Range([N2]).Offset(-1, -1).Resize(6, 12).Copy Cells(Range([N2]).Row + 5, 1)
   [N2] = Range([N2]).Offset(6).Address(0, 0)
   Range([N2]).ClearContents
   Application.EnableEvents = True  
End Sub
 
Что ж, все работает. Хорошо. Спасибо. Но эта таблица была примером... :) Спасибо, пытаюсь разобраться. Поставил свою таблицу, и пытаюсь под неё переделать... Приложу файл.  
За что отвечает "Address(0, 0)" в строке  
"[V2] = Range([V2]).Offset(20).Address(0, 0)" ?
Ошибки - которые возникают... Это ругается на объединенную ячейку чего-то...  
Ну, и чтобы с копированием точно попасть... Получается, смещение идет до начала таблицы...  
"Range([V2]).Offset(-2, -2).Resize(20, 15).Copy Cells(Range([V2]).Row + 13, 1)"
Всё ли правильно делаю?
 
Сделал файл как мне нужно. Прикладываю. Вопросы следующие...  
1. Хочу поставить защиту листа, чтобы только в определённые ячейки данные вводил пользователь - тогда ругается - ошибка... при выполнении скрипта на защиту ячеек...  
2. Хочу также объединить ячейки некоторые - тоже ругается... Гхм, сейчас проверил - не ругается. Вначале ругался. Пока не знаю. Ладно. Вопрос остается.  
3. После выполнения скрипта нет возможности отменить последние действия. Как это можно обойти?  
Ну, вроде, нужный файл приложил.
Страницы: 1
Читают тему
Наверх