Страницы: 1
RSS
Автозаполнение бланка на основании сводной
 
Добрый вечер уважаемые форумчане.  
Не уверен что правильно сформулировал название темы, однако постараюсь коротко и понятно изложить суть проблемы.  
Есть накладная, база, сводная. Нужно на основании сводной таблицы заполнить накладную, т.е. как бы поднять старую накладную из базы.  
1. Заходил в приемы и смотрел Заполнение бланков данными из базы - это не подходит, так как имеются множественные данные.  
2. Формулами не получается, так как нужно сохранить структуру накладной, в которой уже есть свои формулы, выпадающие списки, УФ и т.д. и т.п.  
3. Сохранение выписанных накладных для каждого клиента - тоже не вариант, так как исходник размером 7,5 МБ, а в день выписывается до сотни накладных - стает вопрос о нехватке места на диске.  
4. Сохранение копий накладных для клиентов без лишней информации, т.е. только одного листа "Форма" так как у меня в файле, тоже не подходит, так как потом невозможно изменить в накладной данные, которые берутся с нескольких листов.  
5. Не сохранять накладные для клиентов вообще? Тогда это приведет к тому, что нужно заново выписывать накладную, в случае неправильного заполнения в первый раз.  
 
Помогите решить задачу, так как в макросах не силен.
 
Извините, пока писал - разлогинился.
 
я бы сделал одним из этих способов:  
1) Вёл бы все данные в базе, а форму накладной использовал бы только как печатную без всяких там списков и УФ.  
2) Сделал бы копию формы накладной и заполнял бы её макросом из базы.  
3) Сохранял бы только лист с накладной в нужном месте с нужным названием.  
 
если немного модернизировать макрос в вашем файле, то самый простой вариант - это вариант №3...
 
{quote}{login=Ezoptron}{date=24.01.2012 09:04}{thema=}{post}я бы сделал одним из этих способов:  
1) Вёл бы все данные в базе, а форму накладной использовал бы только как печатную без всяких там списков и УФ.  
2) Сделал бы копию формы накладной и заполнял бы её макросом из базы.  
3) Сохранял бы только лист с накладной в нужном месте с нужным названием.  
 
если немного модернизировать макрос в вашем файле, то самый простой вариант - это вариант №3...{/post}{/quote}  
Как раз третий вариант не подходит. Я об этом писал. База находится в исходнике как и сводная. А при этом варианте как вы говорите, в файле-копии базы нет так как вы предлагаете сохранить только лист с накладной.  
В свою очередь база пополняется при выписке накладной в исходнике. Т.е. для того чтобы поднять старую неправильно выписанную накладную, мне нужно открыть предварительно сохраненный файл-копию  и подгрузить в эту накладную базу из исходника? По-моему это вообще черезчур.  
А на счет списков, то они макросам не мешают. Ввод данных в ячейки со списками не ограничен.
 
О чем вы говорите. Списки нужны для выписки новой накладной, так удобнее, чем вносить данные в базу. При ее выписке новой накладной она автоматом попадает в базу. А вы предлагаете заполнять накладную на основании базы. Как же я выпишу новую накладную на основании базы, если в базе только старые, уже выписанные накладные.
 
нужен макрос (на событие изменение ячейки) для ввода действующей цены из прайса.  
все остальное можно формулами, если на каждой строке накладной будет ее номер  
нужно только 3 листа база накладная прайс  
99929
 
не совсем понятна суть задачи...  
опишите, пожалуйста, сам бизнес-процесс, что Вас в нём не устраивает, и какой результат вы хотите получить от его улучшения...в общем для чего всё это нужно?  
 
возможно существует какое-то простое решение данной задачи, о котором ни Вы (из-за отсутствия опыта программирования), ни кто-либо другой (из-за отсутствия информации) не подозревает...
 
что-то я не могу понять. Три листа я уже писал, сохранение копий по 7,5 МБ это не вариант. При 100 накладных это уже 750 МБ в день дискового пространства. Работать нужно с исходником. В нем все данные весь учет, база, статистика и т.д. Формулами я бы сделал, но это не пойдет, структуру бланка менять нельзя не я один пользуюсь. Цены все вбиты формулами, макрос на цены не нужен. Нужен макрос на извлечение данных по уже выписанным накладным. Может быть я не правильно объясняю. Ну например:    
Была выписана накладная №0001 2декабря но в ней была допущена всего лишь одна ошибка. Чтобы не выписывать заново накладную, ее проще выдернуть из базы и заполнить поля Листа "Форма" или заполнить на основании сводной в том виде в котором она была выписана и уже потом испавить в ней ошибку и сохранить исходник при этом в базу внесется уже измененная накладная и в сводная тоже обновиться. На мой взгляд это оптимальный вариант при котором не нарушается ни структура бланка ни сбивается отчетность.  
Другие варианты мне кажется будет геморрно.    
Я просто приблизительно представляю это так, но реализовать не могу ибо не силен в VBA.  
Приблизительно я вижу это так: Я выбираю старую накладную из сводной например №0001 и данные, которые находились в этой накладной, копировались в форму в те поля, которые отмечены красными квадратами.
 
Мне представляется это так - есть база, и есть форма для работы с этой базой.  
Через форму можно занести данные в базу, можно просмотреть занесённые данные. Тут же на форме есть кнопка "создать накладную". Создали, распечатали (можно на основе готового шаблона). Сохранять её нет нужды - всегда можно зайти в базу и сгенерить такую же накладную. Или зайти на эту запись, изменить (сохранить изменения в базе), сгенерить новую накладную.  
Можно в базу ставить метки - кому накладную печатали, кому только занесли данные в базу. Позже можно нераспечатанные отфильтровать и распечатать (к примеру).  
При таком подходе место будет есть только база - а она и так ест.  
Ну и бекапить всё это хозяйство проще.
 
Hugo, абсолютно согласен.
 
Все верно, так и есть. Когда я выписываю новую накладную, она через форму заносится в базу - это так и есть. А вот как сгенерировать уже имеющуюся накладную из базы обратно в форму я не знаю. Вот именно это мне и нужно. Т.е. Вернуть данные например накладной №0001 обратно в форму макросом без нарушения форматирования и структуры формы я не могу. Приблизительно это выглядет так: например при нажатии на кнопку выскакивало окно выбора № накладной для выбора и из базы копировались данные и вставлялись в форму, но только выборочные и соответствующие этому номеру накладной.
 
{quote}{login=antal10}{date=24.01.2012 11:14}{thema=}{post}Когда я выписываю новую накладную, она через форму заносится в базу - это так и есть. А вот как сгенерировать уже имеющуюся накладную из базы обратно в форму я не знаю. {/post}{/quote}При помощи Find (или другим, удобным для Вас способом, находим в базе нужную строку, а затем выполняем действия, которые Вы умеете делать: ведь в базу из формы заносили? А теперь обратная процедура:  
textbox1=cells(номер_строки, номер_столбца)
 
Если форма - это таблица на листе, то и туда можно макросом данные из базы заносить. Ничем принципиально не отличается.
 
{quote}{login=Юрий М}{date=24.01.2012 11:26}{thema=Re: }{/post}{/quote}При помощи Find (или другим, удобным для Вас способом, находим в базе нужную строку, а затем выполняем действия, которые Вы умеете делать: ведь в базу из формы заносили? А теперь обратная процедура:  
textbox1=cells(номер_строки, номер_столбца){/post}{/quote}  
Спасибо Юрий М за наводку, это я понял что если макросом туда можно, то и обратно можно. Только я писал о том что в VBA не силен. Код писал не я. Этот код написал один из уважаемых участников форума, за что я ему очень благодарен.
 
Добрый день уважаемые формумчане.    
Прошу помощи в решении. Ибо вопрос остался нерешенный.
 
Неужели некому помочь? Неверю.
 
{quote}{login=antal10}{date=26.01.2012 10:16}{thema=}{post}Неужели некому помочь? Неверю.{/post}{/quote}  
Станиславский?
 
Добрый вечер уважаемые знатоки VBA.  
Вроде бы и описал полностью проблему, как просили, а вопрос мой так и остался открытым. Сам "языками не владею" в частности VBA поэтому прошу откликнутся гуру. Потому что не знаю то ли задача моя не решаема, то ли тема ушла далеко и ее не просматривают. В любом случае попробую еще одну попытку. Спасибо за понимание.
 
когда так просят  
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
 
Спасибо за отклик. Только я не совсем понял как он работает. Точнее я понял, но не могу приспособить его к своему готовому файлу. Не могли бы вы на моем примере это показать?
 
а зачем нужен ваш файл?  
этот нужно нарастить прайсом и макросом для подстановки цены
 
Наверно я что-то не правильно понимаю. А может сам непонятно объяснил.  
Попробую еще раз.  
Есть файл с формой накладной. Форма заполняется вручную. т.е выписывается накладная для клиента например под №0019. Данные из этой накладной заносятся в базу. Далее выписывается для следующего клиента №0020 и т.д.  
Но иногда встает вопрос о повторной выписке старой накладной например №0019. Это возникает в случае допущеных ошибок при выписке первый раз.  
Для того чтобы не заполнять заново накладную №0019 ее нужно достать из базы и автоматом заполнить нужные поля Формы. Т.е. вернуть данные ранее выписанной накладной №0019 в том виде, в котором они были при первой выписке накладной. Ну как-то так вроде.
 
Есть бесплатная программа, Бизнес Пак называктся (есть и другие, но я их не пробовал) - скачайте и ведите все накладные в ней. Она спецом под это дело заточена.
 
{quote}{login=Михаил С.}{date=29.01.2012 12:01}{thema=}{post}Есть бесплатная программа, Бизнес Пак называктся (есть и другие, но я их не пробовал) - скачайте и ведите все накладные в ней. Она спецом под это дело заточена.{/post}{/quote}  
Спасибо Михаил С. Знаю я про эту программу. И предлагал я ее использовать. Но суть в том что не я один выписываю накладные. Есть у нас вообще полнейшие чайники, которым показали как заполнять в Excel привыкли уже  набирать и больше ничего не знают. Мне перестроиться не сложно в принципе, а вот они восприняли это с ужасом, когда я им предложил эту прогу. Они как увидели интерфейс программы и что куда вбивать надо так это был полный аут. Ну сами представьте: человек, который по большому счету с компьютером не дружит, а заполняет бланк лишь потому, что ему показали как и где какие кнопочки нажимать, перейти в другую программу это для него ужас. Тем более, что накладная в экселе уже подогнанная под нужды, отшлифованная единственное что в ней не хватает так это этой функции.
 
Понятно. Сочувствую, хоть и сам к этой проге еще не привык - неделя, как скачал...
 
Вставьте код ниже своего и повесьте функцию InputThisBook на кнопку "вытащить накладную из базы" на форме.  
 
Sub InputThisBook() 'Вытаскивает старую накладную из базы  
     
   Dim lFRow As Long  
   Dim lLRow As Long  
   Dim lFDBRow As Long  
   Dim lLDBRow As Long  
   Dim rng As Range  
     
       'Проверяем существует ли уже накладная  
   On Error Resume Next  
   Set rng = База.Columns(1).Find(what:=Форма.Cells(1, "G").Value, after:=База.Cells(1, 1), LookIn:=xlValues, lookat:=xlWhole)  
   On Error Resume Next  
   If rng Is Nothing Then  
       MsgBox Prompt:="Номер накладной не существует в базе. Впишите в форму номер нужной накладной.", _  
              Title:="Номер накладной в базе отсутствует"  
Exit Sub  
   End If  
     
   'Замораживаем дисплей  
   Application.ScreenUpdating = False  
         
       'Определяем первую строку списка в Форме (в столбце A ниже "№")  
   lFRow = Форма.Columns(1).Find(what:="№", after:=Форма.Cells(1, 1), LookIn:=xlValues, lookat:=xlWhole).Row + 1  
         
       'Определяем последнюю строку списка в Форме (в столбце A выше "Итого без НДС")  
   lLRow = Форма.Cells.Find(what:="Итого без НДС", after:=Форма.Cells(1, 1), LookIn:=xlValues, lookat:=xlWhole).Row - 1  
         
       'Очищаем ячейки от данных  
   Форма.Range("B" & lFRow & ":G" & lLRow).ClearContents  
         
      ''Определяем первую строку списка в базе с нужным номером накладной  
   lFDBRow = База.Columns(1).Find(what:=rng.Value, after:=База.Cells(1, 1), LookIn:=xlValues, lookat:=xlWhole).Row  
         
      ''Определяем количество строк в базе с нужным номером накладной  
   База.Visible = True  
   База.Select  
   lLDBRow = Application.WorksheetFunction.CountIf(Range(Cells(lFDBRow, "A"), Cells(lFDBRow, "A").End(xlDown)), rng.Value) - 1  
   База.Visible = False  
   Форма.Select  
         
   'Добавляем данные из базы в форму  
       'В столбец B  
   procPasteDB lFRow, lLDBRow, "B", "G"  
       'В столбец F  
   procPasteDB lFRow, lLDBRow, "F", "H"  
       'В столбец I  
   procPasteDB lFRow, lLDBRow, "G", "I"  
       'В "Получено:"  
   Форма.Range("C4") = База.Cells(lFDBRow, "C")  
       'В поле даты  
   Форма.Range("I2") = База.Cells(lFDBRow, "E")  
End Sub  
 
Sub procPasteDB(lFRow As Long, lLDBRow As Long, ColumnForm As String, ColumnDB As String)  
   Dim i As Integer  
   i = 0  
   For i = 0 To lLDBRow - 1  
       Форма.Cells(lFRow + i, ColumnForm) = База.Cells(lLDBRow + i, ColumnDB)  
   Next  
 
End Sub
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Что-то не совсем получается. Макрос вытаскивает из базы не все имеющие позиции накладной. Т.е. скажем из 15 он вытаскивает только 3.
 
Не верю ( :-) ).  
У меня все работает.  
Присылайте мыло, скину Ваш файл с моим макросом (сюда - не могу, СБ не велит)
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
{quote}{login=гость}{date=29.01.2012 04:51}{thema=}{post}Не верю ( :-) ).  
У меня все работает.  
Присылайте мыло, скину Ваш файл с моим макросом (сюда - не могу, СБ не велит){/post}{/quote}  
Он действительно не совсем работает. Я в предыдущем посте post_302430.xlsm выкладывал файл. Там наглядно видно какие данные макрос в форму вытянул. Посмотрите: в базе 14 строк соответствующих этой накладной, а в форме всего 3. Причем при повторном нажатии кнопки еще на одну уменьшается.  
Мыло: antal10@ya.ru
 
А, нет. Верю. Я был неправ. Выслсл вдогонку исправленный.
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
Страницы: 1
Читают тему
Наверх