Привет форумчане, поставили задачу, сделать базу данных членов спортивного клуба. Суть в том что в базу вносить будет девочка, для удобства надо сделать на одном листе форму ввода данных, на втором саму базу данных. Не знаю как сделать связь.
Привет форумчане, поставили задачу, сделать базу данных членов спортивного клуба. Суть в том что в базу вносить будет девочка, для удобства надо сделать на одном листе форму ввода данных, на втором саму базу данных. Не знаю как сделать связь.Semidor
Можно сделать простой вариант макросом - после заполнения лист печатается, клиент читает и подписывает, жмём кнопку - все данные переносятся (именно) из формы в базу в первую пустую строку, база сохраняется. Это просто - код несложный, первый лист нужно доработать, чтоб вводить данные можно было только в строго определённые ячейки. Проверок на повтор записей нет, сервиса по изменению неверных данных тоже нет. Но пример сейчас делать не буду, т.к. полей много и прописывать муторно. Если Вас такой вариант заинтересует - могу написать код на пару полей, остальное и доводку первого листа будете делать сами.
Хотя проверку на повтор (ну и заодно сервис по замене данных) в такой код добавить можно. Например так - пишем в окошке слова для поиска, жмём другую кнопку - первый лист заполняется данными из базы (если подходящих записей найдено несколько - диалог выбора нужной). Меняем что нужно, жмём третью кнопку - данные в базе меняются. Но тут уже функционал приближается к той базе, что Вам дали на http://www.programmersforum.ru/showthread.php?t=213716 Кстати, там и кодом поживиться можно. Например модулем поиска. Сразу говорю - этим уже заниматься некогда.
Есть вариант попроще - вручную на втором листе ищем нужную строку, меняем данные, становимся на неё (или может надёжнее запоминаем её номер), жмём кнопку на втором листе (может быть запрос номера) - первый лист заполнен. Можно печатать на подпись клиенту, но главное не заносить в базу (хотя это не беда, лишнее из базы всегда можно вручную стереть). В общем, вполне рабочий вариант прорисовывается.
P.S. Ну вот и начало уже выше есть Очень удачный вариант с именованными нумерованными диапазонами - код сразу упрощается.
Можно сделать простой вариант макросом - после заполнения лист печатается, клиент читает и подписывает, жмём кнопку - все данные переносятся (именно) из формы в базу в первую пустую строку, база сохраняется. Это просто - код несложный, первый лист нужно доработать, чтоб вводить данные можно было только в строго определённые ячейки. Проверок на повтор записей нет, сервиса по изменению неверных данных тоже нет. Но пример сейчас делать не буду, т.к. полей много и прописывать муторно. Если Вас такой вариант заинтересует - могу написать код на пару полей, остальное и доводку первого листа будете делать сами.
Хотя проверку на повтор (ну и заодно сервис по замене данных) в такой код добавить можно. Например так - пишем в окошке слова для поиска, жмём другую кнопку - первый лист заполняется данными из базы (если подходящих записей найдено несколько - диалог выбора нужной). Меняем что нужно, жмём третью кнопку - данные в базе меняются. Но тут уже функционал приближается к той базе, что Вам дали на http://www.programmersforum.ru/showthread.php?t=213716 Кстати, там и кодом поживиться можно. Например модулем поиска. Сразу говорю - этим уже заниматься некогда.
Есть вариант попроще - вручную на втором листе ищем нужную строку, меняем данные, становимся на неё (или может надёжнее запоминаем её номер), жмём кнопку на втором листе (может быть запрос номера) - первый лист заполнен. Можно печатать на подпись клиенту, но главное не заносить в базу (хотя это не беда, лишнее из базы всегда можно вручную стереть). В общем, вполне рабочий вариант прорисовывается.
P.S. Ну вот и начало уже выше есть Очень удачный вариант с именованными нумерованными диапазонами - код сразу упрощается.Hugo
Можно сделать простой вариант макросом - после заполнения лист печатается, клиент читает и подписывает, жмём кнопку - все данные переносятся (именно) из формы в базу в первую пустую строку, база сохраняется. Это просто - код несложный, первый лист нужно доработать, чтоб вводить данные можно было только в строго определённые ячейки. Проверок на повтор записей нет, сервиса по изменению неверных данных тоже нет.
По мне это идеально) Можно хотя бы одно поле для примера, дальше по аналогии сделаю. В программировании слаб, но учусь) http://www.programmersforum.ru/showthread.php?t=213716 тут слишком много всего, без опыта сложно разобраться) научился где искать код, понимаю его синтаксис, а вот смысл понять пока не могу)
Quote (Jhonson)
Как вариант! Доделывайте сами!
Спасибо!
Quote (Hugo)
Можно сделать простой вариант макросом - после заполнения лист печатается, клиент читает и подписывает, жмём кнопку - все данные переносятся (именно) из формы в базу в первую пустую строку, база сохраняется. Это просто - код несложный, первый лист нужно доработать, чтоб вводить данные можно было только в строго определённые ячейки. Проверок на повтор записей нет, сервиса по изменению неверных данных тоже нет.
По мне это идеально) Можно хотя бы одно поле для примера, дальше по аналогии сделаю. В программировании слаб, но учусь) http://www.programmersforum.ru/showthread.php?t=213716 тут слишком много всего, без опыта сложно разобраться) научился где искать код, понимаю его синтаксис, а вот смысл понять пока не могу)Semidor
Сижу разбираюсь) не могу понять как сделать, паспортные данные разбиты на 3 строчки, данные то одни, а вот у каждой ячейки свое имя pole17 pole18 pole19, из-за этого идет сдвиг во втором листе, как это можно побороть?
Quote (Jhonson)
Как вариант! Доделывайте сами!
Сижу разбираюсь) не могу понять как сделать, паспортные данные разбиты на 3 строчки, данные то одни, а вот у каждой ячейки свое имя pole17 pole18 pole19, из-за этого идет сдвиг во втором листе, как это можно побороть?Semidor
Я бы разбил паспортные на два поля - серия+№ и где выдан. Так и в базу писал в 2 столбца - это ведь Ваша база, можете делать как хотите. Ну если очень хочется на три - тогда пусть будет. Тогда и в базу писал в 3 столбца. Или на этом место цикл прервать, обработать эти три (как придумаете), далее новый цикл по оставшимся. Или уже в базе после цикла собрал эти части как угодно в отдельном столбце - тут же макросом, или отдельно позже формулой.
Ячейки листа, не предназаначенные для ввода - защитить от изменений. Или можно макросом сделать перемещение курсора только по этим ячейкам - с остальных "скидывать" на эти, делали что-то похожее уже. Но нужно продумать...
В общем - начало есть, потихоньку дорабатывайте. Сперва разберитесь с нумерацией полей, далее добавьте их очистку - тут же с переносом, или отдельный аналогичный код напишите. Потом защита и "перескок" по нужным. Потом можно подумать, как делать коррекцию и просмотр базы - если нужно. Например, клиент поменял паспорт - нужно сделать новый бланк на подпись и скорректировать базу - сейчас это делается только добавлением новой записи. Хотя можно так и оставить - завели новую запись, нашли на втором листе старую строку и удалили всю, подправили нумерацию. Но думаю лучше в свободных столбцах ставить дату и пометку - эта запись устарела/изменена/выбыл тогда-то. Так всегда можно проанализировать историю/движение отобрать только актуальные простым автофильтром. И ничего не пропадёт - можно будет найти клиента по любым (и устаревшим тоже) данным.
Вот набросал такой вариант выбора только именованных ячеек (но с объединёнными не работает - но там объединение в общем и не нужно, можно обойтись). Код в модуль листа.
[vba]
Code
Dim adr$
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim x& On Error Resume Next x = Len(Target.Name) If Err = 0 Then adr = Target.Address Else Range(adr).Select End If End Sub
[/vba] Нужно добавить начальное занесение первого адреса в переменную при открытии книги. Но так получится только выбирать ячейки мышью - стрелками можно передвигаться только по соседним именованным ячейкам, каких у Вас нет.
Вообще нужно продумать алгоритм, чтоб по табу или стрелками можно было скакать по нужным ячейкам вперёд/назад, а мышью выбрать любую. Прямо сейчас готового кода нет.
Я бы разбил паспортные на два поля - серия+№ и где выдан. Так и в базу писал в 2 столбца - это ведь Ваша база, можете делать как хотите. Ну если очень хочется на три - тогда пусть будет. Тогда и в базу писал в 3 столбца. Или на этом место цикл прервать, обработать эти три (как придумаете), далее новый цикл по оставшимся. Или уже в базе после цикла собрал эти части как угодно в отдельном столбце - тут же макросом, или отдельно позже формулой.
Ячейки листа, не предназаначенные для ввода - защитить от изменений. Или можно макросом сделать перемещение курсора только по этим ячейкам - с остальных "скидывать" на эти, делали что-то похожее уже. Но нужно продумать...
В общем - начало есть, потихоньку дорабатывайте. Сперва разберитесь с нумерацией полей, далее добавьте их очистку - тут же с переносом, или отдельный аналогичный код напишите. Потом защита и "перескок" по нужным. Потом можно подумать, как делать коррекцию и просмотр базы - если нужно. Например, клиент поменял паспорт - нужно сделать новый бланк на подпись и скорректировать базу - сейчас это делается только добавлением новой записи. Хотя можно так и оставить - завели новую запись, нашли на втором листе старую строку и удалили всю, подправили нумерацию. Но думаю лучше в свободных столбцах ставить дату и пометку - эта запись устарела/изменена/выбыл тогда-то. Так всегда можно проанализировать историю/движение отобрать только актуальные простым автофильтром. И ничего не пропадёт - можно будет найти клиента по любым (и устаревшим тоже) данным.
Вот набросал такой вариант выбора только именованных ячеек (но с объединёнными не работает - но там объединение в общем и не нужно, можно обойтись). Код в модуль листа.
[vba]
Code
Dim adr$
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim x& On Error Resume Next x = Len(Target.Name) If Err = 0 Then adr = Target.Address Else Range(adr).Select End If End Sub
[/vba] Нужно добавить начальное занесение первого адреса в переменную при открытии книги. Но так получится только выбирать ячейки мышью - стрелками можно передвигаться только по соседним именованным ячейкам, каких у Вас нет.
Вообще нужно продумать алгоритм, чтоб по табу или стрелками можно было скакать по нужным ячейкам вперёд/назад, а мышью выбрать любую. Прямо сейчас готового кода нет.Hugo
Вот такой код в модуле листа анкеты Jhonson'a не даст выбрать ненужные ячейки:
[vba]
Code
Option Explicit
Dim ind&
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim ra As Range, i& If Target.Cells.Count > 1 Then Target(1).Select If ind = 0 Then ind = 1
With CreateObject("scripting.dictionary")
For i = 1 To 40 If ra Is Nothing Then Set ra = Range("pole" & i) Else Set ra = Union(ra, Range("pole" & i)) .Item(Range("pole" & i).Address) = i Next
If Intersect(Target, ra) Is Nothing Then If Target.Row > ra.Areas.Item(ind).Row Or Target.Column > ra.Areas.Item(ind).Column Then If ind = 40 Then Range(ra.Areas.Item(1).Address).Select Else Range(ra.Areas.Item(ind + 1).Address).Select Else If ind = 1 Then Range(ra.Areas.Item(40).Address).Select Else Range(ra.Areas.Item(ind - 1).Address).Select End If Else ind = .Item(Target(1).Address) End If End With End Sub
[/vba]
Вот такой код в модуле листа анкеты Jhonson'a не даст выбрать ненужные ячейки:
[vba]
Code
Option Explicit
Dim ind&
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim ra As Range, i& If Target.Cells.Count > 1 Then Target(1).Select If ind = 0 Then ind = 1
With CreateObject("scripting.dictionary")
For i = 1 To 40 If ra Is Nothing Then Set ra = Range("pole" & i) Else Set ra = Union(ra, Range("pole" & i)) .Item(Range("pole" & i).Address) = i Next
If Intersect(Target, ra) Is Nothing Then If Target.Row > ra.Areas.Item(ind).Row Or Target.Column > ra.Areas.Item(ind).Column Then If ind = 40 Then Range(ra.Areas.Item(1).Address).Select Else Range(ra.Areas.Item(ind + 1).Address).Select Else If ind = 1 Then Range(ra.Areas.Item(40).Address).Select Else Range(ra.Areas.Item(ind - 1).Address).Select End If Else ind = .Item(Target(1).Address) End If End With End Sub
Почему-то стандартный способ передвижения только по незалоченным ячейкам у меня косячит - при движении стрелкой только вниз не переходит на строки выше 32. Если переходить энтером, табом или стрелкой вверх - тогда нормально скачет. Стрела вправо работает нормально, а влево тоже есть дефект - не идёт по кругу... Мой макрос этими косяками не страдает. Хотя конечно это мелочи.
Почему-то стандартный способ передвижения только по незалоченным ячейкам у меня косячит - при движении стрелкой только вниз не переходит на строки выше 32. Если переходить энтером, табом или стрелкой вверх - тогда нормально скачет. Стрела вправо работает нормально, а влево тоже есть дефект - не идёт по кругу... Мой макрос этими косяками не страдает. Хотя конечно это мелочи.Hugo
думаю ВПР подойдет. Во вложении вариант с редактированием. При редактировании нет разделения склееных данных (паспортные данные например) Дорабатывать пока нет времени. Попробуйте доделать сами, предлагаю добавить разделители при склеивании, а потом разбивать по строчкам с суффиксами. P.S. Надеюсь с ВПРом сами разберетесь.
Semidor, Вы бы писали конкретнее, что хотите. Для
Quote (Semidor)
вывод данных
думаю ВПР подойдет. Во вложении вариант с редактированием. При редактировании нет разделения склееных данных (паспортные данные например) Дорабатывать пока нет времени. Попробуйте доделать сами, предлагаю добавить разделители при склеивании, а потом разбивать по строчкам с суффиксами. P.S. Надеюсь с ВПРом сами разберетесь.Jhonson