Страницы: 1
RSS
Автоматическое распространение формул на следующую строку при добавлении новой записи!
 
Покажите ка примере, как можно сделать чтоб при добавлении новой записи (в ячейку B73) автоматически копировались формулы из этой строки (73), а именно из ячеек A73 и H73, в следующую строку!? плюс к этому автоматически создавались списки в столбцах C и D по этому же принципу. Заранее благодарен!
 
ANYBODY HELP!!!
 
Смотрите в файле. Доработано именно под Ваш вариант.  
Код макроса и описание того, что и где он делает - на листе.  
Правой кнопкой мыши - по ярлычку листа, ИСХОДНЫЙ ТЕКСТ и в редакторе ВБА переходите на Лист30(план(+)).  
Работает с 70 строки.  
ЗЫ А зачем было столько пустых ячеек/строк с форматами и пр..  
Минут 10 не мог понять откуда берется лишнее.
 
{quote}{login=Антон}{date=11.06.2008 08:33}{thema=Автоматическое распространение формул на следующую строку при добавлении новой записи!}{post}Покажите ка примере, как можно сделать чтоб при добавлении новой записи (в ячейку B73) автоматически копировались формулы из этой строки (73), а именно из ячеек A73 и H73, в следующую строку!? плюс к этому автоматически создавались списки в столбцах C и D по этому же принципу. Заранее благодарен!{/post}{/quote}  
 
Создайте список! (работает только в версиях 2003 и 2007)  
для этого надо:  
кликнуть правой по таблице, создать спиок, выделится область синей рамочкой, внизу звёздочка (как в ACCESS)  
вписываем новую строку - формулы сами копируются.  
но это не главное!!!! важно то, что формулы, диаграммы и пр., ссылающиеся на этот список также подберут эти новые строки!!!
 
{quote}{login=Igor67}{date=11.06.2008 11:30}{thema=}{post}Смотрите в файле. Доработано именно под Ваш вариант.  
Код макроса и описание того, что и где он делает - на листе.  
Правой кнопкой мыши - по ярлычку листа, ИСХОДНЫЙ ТЕКСТ и в редакторе ВБА переходите на Лист30(план(+)).  
Работает с 70 строки.  
ЗЫ А зачем было столько пустых ячеек/строк с форматами и пр..  
Минут 10 не мог понять откуда берется лишнее.{/post}{/quote}  
 
Огромное спасибо, есть продвижения! но есть и глюки: бывает когда выделяешь какую-нибудь строчку, данные в ней автосатом удаляются!?((
 
{quote}{login=N}{date=11.06.2008 11:32}{thema=Re: Автоматическое распространение формул на следующую строку при добавлении новой записи!}{post}{quote}{login=Антон}{date=11.06.2008 08:33}{thema=Автоматическое распространение формул на следующую строку при добавлении новой записи!}{post}Покажите ка примере, как можно сделать чтоб при добавлении новой записи (в ячейку B73) автоматически копировались формулы из этой строки (73), а именно из ячеек A73 и H73, в следующую строку!? плюс к этому автоматически создавались списки в столбцах C и D по этому же принципу. Заранее благодарен!{/post}{/quote}  
 
Создайте список! (работает только в версиях 2003 и 2007)  
для этого надо:  
кликнуть правой по таблице, создать спиок, выделится область синей рамочкой, внизу звёздочка (как в ACCESS)  
вписываем новую строку - формулы сами копируются.  
но это не главное!!!! важно то, что формулы, диаграммы и пр., ссылающиеся на этот список также подберут эти новые строки!!!{/post}{/quote}  
 
Вы бы лучше га конкретном примере показали как это сделать, в частности на моем, файл прикреплял в первом сообщении! сам пробовал так сделать, но формулы все равно не переносятся!
 
Добавьте еще проверку на наличие данных в ячейке.  
Если есть - просто выходим.  
If Not IsEmpty(Cells(Target.Row, 2)) Then Exit Sub
 
{quote}{login=Igor67}{date=11.06.2008 12:22}{thema=}{post}Добавьте еще проверку на наличие данных в ячейке.  
Если есть - просто выходим.  
If Not IsEmpty(Cells(Target.Row, 2)) Then Exit Sub{/post}{/quote}  
 
Спасибо, буду пробовать... потом обязательно отпишусь о результатах!!!
 
Вроде все работает... теперь будем проходить crash-test)))
 
crash-test выявил ряд недостатков:  
1. автозаполнение следующей строки происходит только при вводе какого-нибудь значения, например при вставке скопированного значения это не происходит.  
2. если мы случайно пропустим одну строку, то дальше автозаполнение не работает. берет значение с пустой строки и копирует его в следующуюю... по хорошему бы сделать чтоб постоянно копировал первую строку с формулами.  
3. а что если нужно "клонировать" эту функцию. см. сл. сообщение.
 
Прикрепляю файл, надеюсь, будет понятно что я имел ввиду, когда описывал третий пункт в своем предыдущем сообщении!
 
делал в своё время автозаполнение значениями сверху при вводе чего либо в область данных.  
можно скорректировать и для заполнения формулами если  формула допускает представление в FormulaR1C1    
 
В модуле листа  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
'заполняются значениями сверху ячейки в столбцах A,B,C при вводе данных в эту же строку в любой ячейки D:P    
Dim Rng1 As Range  
Application.EnableEvents = False  
If Автозаполнение And Target.Cells.Count = 1 Then  
'1) Если первые поля данных пустые то прежняя заявка  
'внести данные с предыдущий строки  
   If Not Intersect(Target, Range("D5:P249")) Is Nothing Then  
   Set Rng1 = Range("A" & CStr(Target.Row)) 'объект  
       If Rng1.Value = "" Then  
          Rng1.Value = ВзятьСверху(Rng1)  
       End If  
   Set Rng1 = Rng1.Offset(0, 1) 'исполнитель  
       If Rng1.Value = "" Then  
          Rng1.Value = ВзятьСверху(Rng1)  
       End If  
   Set Rng1 = Rng1.Offset(0, 1) 'заявка  
       If Rng1.Value = "" Then  
          Rng1.Value = ВзятьСверху(Rng1)  
       End If  
   End If  
End If  
Application.EnableEvents = True  
End Sub  
Private Function ВзятьСверху(ByVal Rng As Range)  
Dim r As Integer  
r = 1  
ВзятьСверху = ""  
Do While Rng.Offset(-r, 0).Row > 4  
If Not Rng.Offset(-r, 0).Value = "" Then  
   ВзятьСверху = Rng.Offset(-r, 0).Value  
   Exit Do  
Else  
r = r + 1  
End If  
Loop  
End Function
 
автозаполнение переменная объявленная в модуле.  
позволяет включать и отключать автозаполнение сверху  
 
Public Автозаполнение As Boolean  
 
Public Sub АвтозаполнениеВкл()  
Автозаполнение = True  
End Sub  
Public Sub АвтозаполнениеВыкл()  
Автозаполнение = False  
End Sub  
 
ну и обратите внимание на If Автозаполнение And Target.Cells.Count = 1    
автозаполнение работает только при ввводе в одну ячейку
 
Перекроим и... будет жить?
 
{quote}{login=}{date=18.06.2008 02:58}{thema=}{post}Перекроим и... будет жить?{/post}{/quote}  
ещё изменить формулу в столбце A  
=ЕСЛИ(ЕПУСТО(B15);"";СЧЁТЗ(СМЕЩ($B$15;0;0;СТРОКА(B15)-СТРОКА($B$14);1)))  
чтоб корректно добавлялась при вставке строки в список  
 
и вроде никакого VBA не нужно
 
"Перекроенный" вариант однозначно не пойдет!!!  
вид поступлений может быть ОЧЕНЬ разнообразным, и применение в данном случае списка не совсем уместно... Плюс, это не решает основной задачи, "клонирования" данной таблицы на одном листе (см. последний прикрепленный мною файл)
 
Антон, Вы получили то, что просили. На конкретно поставленный вопрос с указанием диапазонов и пр - дан соответствующий ответ.  
"Клонирование" на другие диапазоны при первоначальной постановке вопроса не ставилось. Вам дано направление возможного решения, и если будут проблемы можно подсказать.  
Но, ИМХО, формат форума - не предусматривает реализацию готовых решений пользователю, а только дает возможность создавать свои решения при поддержке участников.  
Удачи Вам в освоении Ехс.
 
Все дело в том, что я не силен в макросах, а здесь если и есть решение этой проблемки, то, по-моему, только с их использованием. И по понятным причинам я не могу выложить для общего доступа весь файл целиком, приходится его серьезно урезать... если у Вас есть желание помочь, оставьте свои координаты, и я Вам подробнее опишу суть проблемы и для наглядности вышлю весь файл!?
 
Я тоже не очень силен в макросах.    
Мне не все понятно в Ваших краш-тестах. Уже при выборе контролируемой ячейки/ее активации/щелчке мышом ниже заполненной строки макрос вставляет формулы. Случайного пропуска - незяяяяяя.. Где потом брать данные по формулам?  
Клонирование:  
В макросе теперь есть строка    
Set myKontrRange = Application.Union(Range("C10:C120"), Range("L10:L120"))  
Впишите в нее диапазоны ячеек при активации которых должен выполняться макрос. Самую верхнюю строчку данных - оставьте для ввода исходных формул.
 
Вроде все получилось!;)) Благодарю! Но, надо снова пройти обкатку на выявление недочетов!
 
1. А как сделать, что формулы копировались не из предыдущей ячейки, а из определенной, в нашем случае из ячейки C9, L9, U9 и т.д. Может это сможет решить проблему со случайным пропуском ячеек?  
2. Как быть, если надо сделать несколько записей не в ручную, а вставить скопированный диапозон в столбец C, V, U и т.д. проблема первая: зачастую не удается этого сделать, т.к. автоматически чистится буфер обмена когда выполняется макрос. Вторая: если и удается вставить диапозон ячеек, то формулы копируются только на первую вставленную строку, а не на весь вставленный диапозон.  
Очень надеюсь, что сможете понять то, что я попытался выразить словами;)))
 
Возможно я не совсем правильно выражусь, но тем не менее.  
Основные проблемы скрипта:  
1. Скрипт начинает свою работу по событию - (де-)выделение ячейки Worksheet_SelectionChange.  
Из-за чего копировать-вставить (в тч через специальную вставку) из другого документа сразу несколько ячеек невозможно :(  
Событием инициализации скрипта должно быть не выделение + редактирование ячейки какое-то другое – например «При редактировании, в том числе копировании ячейка такая-то <>0», простите, не знаю как называть это событие синтаксически правильно.  
Отсюда вопрос – на что нужно заменить строчку:  
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  ???  
 
 
 
2. Копирование всегда происходит из строки сверху (-1). То есть, достаточно пропустить строчку и функция прерывается.  
Тогда как нужно, чтобы первая в списке строчка по умолчанию (не в скрипте, а в самом документе) уже должна быть отформатированной и содержать необходимые формулы. Тогда как другие строки (при событии – редактирование) должны копировать формулы, форматы и проч. из нее (то есть из самой верхней № п/п 1)  
Отсюда вопрос – на что нужно заменить строчки  
1.       If Not IsEmpty(Target.Offset(-1, 0)) Then  
и  
2.        Range(myKontrCell.Offset(-1, -1), myKontrCell.Offset(-1, 6)).Copy _  
       Destination:=Range(Cells(iRow, iCol).Offset(0, -1), Cells(iRow, iCol).Offset(0, 6)) 'myKontrRange  
       Range(Cells(iRow, iCol).Offset(0, -1), Cells(iRow, iCol).Offset(0, 6)).Select  
       Selection.SpecialCells(xlCellTypeConstants, 23).ClearContents  
       Cells(iRow, iCol).Select  
Так, чтобы данные брались из первой строки. В документе Антона  C9, L9, U9 и т.д. постом выше
 
Антон, можно все. Но возникает вопрос????  
Первая постановка со строки 70 и тд..  
Расширяем диапазон и строки совсем другие....  
А вдруг у Вас различные формулы в различных блоках.  
А вообще где находился эталонный диапазон.  
Как вводятся данные?  
Задавать эти вопросы пришлось  
Отвечать......  
Вы можете использовать данный код как есть, или создавайте новую тему, но уже опишите проблему более полно.  
А заданный диапазон попробуйте заменить  
2. Range(myKontrCell.Offset(-1, -1), myKontrCell.Offset(-1, 6)).Copy    
на Range("B9:U9").Copy  
Это Диапазон с формулами.
 
Игорь, а как насчет события?  
Как настроить скрипт таким образом, чтобы в файл можно было копировать-вставлять группы ячеек, а соответствующие формулы копировались бы для всех строк.
 
Войдите в редактор ВБА и посмотрите какие события листа обрабатываются. По первоначальной постановке задачи - наилучшим показалось именно - МОМЕНТ АКТИВАЦИИ ЯЧЕЙКИ.    
Код написан под одну строку.    
Антон/Максим я не пишу завершенные пользовательские процедуры. Общаясь на форуме - учусь их делать.  
Если не понимаю - беру книги, читаю в НЕТЕ http://www.msoffice.nm.ru/  
http://msexcel.ru/  
http://firststeps.ru/  
и Гуглю Вам в помощь...
 
{quote}{login=Igor67}{date=23.06.2008 12:19}{thema=}{post}А заданный диапазон попробуйте заменить  
2. Range(myKontrCell.Offset(-1, -1), myKontrCell.Offset(-1, 6)).Copy    
на Range("B9:U9").Copy  
Это Диапазон с формулами.{/post}{/quote}  
 
Эх :( не получается
 
Хорошо :) общий текст процедуры вроде бы есть.  
Хотелось бы внести туда только уточнения.  
А именно:  
- на что заменить строчку Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
 
пробовал на Private Sub Worksheet_Change(ByVal Target As Range) так как вычитал в факах, что    
Change - это :    
1. Переход в режим редактирования, в т.ч. без внесения изменений    
2. Редактирование данных, в т.ч. изменение формул и текста гиперссылок    
3. Ввод данных с клавиатуры    
4. Удаление данных    
6. Копирование, в т.ч. пустых ячеек    
7. Копирование с использованием Специальной вставки    
8. Использование команд Вырезать и Вставить  
 
но все равно не получается :(
 
{quote}{login=Антон}{date=11.06.2008 12:14}{thema=Re: }{post}{quote}{login=Igor67}{date=11.06.2008 11:30}{thema=}{post}Смотрите в файле. Доработано именно под Ваш вариант.  
Код макроса и описание того, что и где он делает - на листе.  
Правой кнопкой мыши - по ярлычку листа, ИСХОДНЫЙ ТЕКСТ и в редакторе ВБА переходите на Лист30(план(+)).  
Работает с 70 строки.  
ЗЫ А зачем было столько пустых ячеек/строк с форматами и пр..  
Минут 10 не мог понять откуда берется лишнее.{/post}{/quote}  
 
Огромное спасибо, есть продвижения! но есть и глюки: бывает когда выделяешь какую-нибудь строчку, данные в ней автосатом удаляются!?(({/post}{/quote}
Страницы: 1
Читают тему
Наверх