Страницы: 1 2 3 4 5 След.
RSS
форма для удобного отображения данных
 
Здравствуйте. Проблема следующая. Имеется большая база данных, с большим числом столбцов (а именно-36 штук), и неограниченным количеством строк. Просматривать её не удобно именно из-за большого числа столбцов. Нужно сделать форму, которая бы появлялась при щелчке на любую ячейку листа, и в которой бы в отдельных TextBox'ах выводились значения всех активных (или хотябы конкретных заранее выбранных) столбцов для строки, в которой находится выбранная ячейка. С VBA только начинаю знакомиться (ну тоесть пока не понимаю почти ничего). Поиск по форуму конкретного результата не принёс, нашлись лишь похожие темы, решения которых не очень подходят (например был вариант где выводились значения нужной строки, но только в столбцах справа от выделенной. а нужно чтобы можно было в любом месте щёлкнуть, а не по конкретному столбцу)..
 
"или он как лысина под шляпой у одного артиста?" (т/с "Одна за всех").
 
можно и пример. вот кусочек из базы, немного другой (столбцов чуть меньше), но суть одна.
 
{quote}{login=Федор}{date=26.04.2011 04:54}{thema=форма для удобного отображения данных}{post}Поиск по форуму конкретного результата не принёс, нашлись лишь похожие темы, решения которых не очень подходят (например был вариант где выводились значения нужной строки, но только в столбцах справа от выделенной. а нужно чтобы можно было в любом месте щёлкнуть, а не по конкретному столбцу)..{/post}{/quote}  
Здравствуйте! Так проблема только с "щёлкнуть по любому столбцу"? Ещё можно ведь в первой строке разместить кнопку, по которой отображать форму. Форма Вам требуется ТОЛЬКО для просмотра всех записей сразу?
 
кнопка не пойдёт. Форма нужна для отображения конкретно той записи, номер строки которой соответствовал бы номеру строки ячейки, на которую щёлкаешь. Из примера видно, что когда столбцов много, просматривать базу вдоль строки неудобно, потому что приходится двигать полосу прокрутки. А на форме можно было бы разместить все значения из строки в более удобном виде.
 
И почему же не подойдёт кнопка? Она всегда на виду - нажал на неё - и на форме отобразились данные всей строки. Да и управлять перемещением по строкам листа можно осуществлять при помощи формы. Вы объясните - почему вызывать форму нужно именно по клику на ячейку? А примеров подобного вызова формы на Форуме достаточно.
 
Если скрыть 5 ненужных столбцов (или 6? может сбился...), то уже работает стандартная форма из меню Данные (это в XL2000)Может в 2003/07/10 уже с этим лучше?
 
{quote}{login=Федор}{date=26.04.2011 01:50}{thema=}{post}кнопка не пойдёт. Форма нужна для отображения конкретно той записи, номер строки которой соответствовал бы номеру строки ячейки, на которую щёлкаешь.{/post}{/quote}  
См. пример. И по кнопке, и по клику...
 
Добрый день знатоки.  
 
Я столкнулся почти с такой же проблемой, как и Фёдор.  
 
Дело в том, что моей жене нужно заполнять, а иногда и редактировать, данные на сотрудников. Данные на них записаны построчно.  
Закавычка в том, что эти данные нужно вбивать в поля, с определёнными трудно читаемыми кодами-заголовками. Для того чтобы это делалось легче, ей в отделении по социальному страхованию вручили программу для ввода этих данных.    
Но она ужасна, выглядит как первые программы под DOS. А навигация настолько не интуитивна (например, чтобы выйти назад, нужно нажать F5), что работать в ней просто ужас.    
 
Вот я и решил облегчить ей труд. Сделать заполнение полей прямо из Excel (Данные - Форма). Мне вполне подошла бы простая встроенная форма. Но к сожалению, она не может охватить столько столбцов, и нет возможности изменять имена заголовков.  
 
Поэтому решил сделать такую же, пользовательскую.    
Проделал часть работы:  
1. создал саму форму;  
2. сделал возможность ввода данных в пустую строку, кнопкой "Добавить";  
3. сделал возможность закрыть форму без сохранения, кнопкой "Закрыть;  
4. сделал ещё разные мелочи.  
 
Но, не смог сделать (вернее прописать их функции),    
казалось бы банального:  
1. кнопки "Предыдущий" и "Следующий", так чтобы они при клике на одну из них выводили данные из предыдущей или последующей строк, соответственно;  
2. Скролбар, с функциями выше указанных кнопок;  
3. активизировать действие кнопок "PgDn" и "PgUp" с теми же свойствами;  
4. кнопку "Изменить", с тем чтобы после выбора определённой строки (данных сотрудника), и изменив некоторые данные, можно было бы сохранить их в той-же строке, а не в новой. И при этом не очищать форму, как это делает кнопка "Добавить", для того чтобы можно было дальше, используя кнопки "Предыдущий" и "Следующий", просматривать данные сотрудников.  
 
Файл прицепил. Если кто может что-то подсказать, отзовитесь.    
Если пишете код сами, то оставляйте описание действий, пожалуйста.  
  ' Мне и другим будет легче понять.  
 
Заранее благодарен за помощь
v_i_t_e_n_d_o_@_r_a_m_b_l_e_r_._r_u
 
В общем, хотелось бы иметь ту же встроенную форму (вернее её аналог), но:  
1. с более компактным размещением полей ввода;  
2. с собственными заголовками;  
3. с ограничением по количеству вводимых знаков;  
4. с контролем правильности ввода формата даты (кстати, если кто знает как, подскажите).  
И других прелестей настройки и контроля, которые позволяет делать пользовательская форма. Т.е. если уже делать, то хорошо и красиво :)
v_i_t_e_n_d_o_@_r_a_m_b_l_e_r_._r_u
 
1. Это как - сделать "просвет" между ними ещё меньше? :-)  
2. Как понять - "собственный" заголовок?  
3. В каких полях какое допустимое количество.  
4. Контроль ФОРМАТА? Может использовать календарь?
 
Контроль даты сделаю (показывал сегодня переделанную функцию).  
Остальное поглядим.  
Но не враз.  
Сейчас долго пытался понять, как и зачем был отключен переход по форме по Enter.  
Как - понял, зачем - нет???
 
А кто писал Вам существующий код - к нему нельзя обратиться? Ведь Ваша задача на помощь не похожа - много работы.
 
Такая мелочь:  
 
Private Sub UserForm_Initialize()  
ScrollBar1.Max = Cells(Rows.Count, 1).End(xlUp).Row  
End Sub  
 
И при добавлении записей обновлять.
 
Ну и тогда  
 
Private Sub ScrollBar1_Change()  
TIN.Value = Cells(ScrollBar1.Value + 2, 1).Value  
FULLN_U.Value = Cells(ScrollBar1.Value + 2, 2).Value  
End Sub  
 
и т.д.
 
Юрий М  
Огромное спасибо, то что нужно! как всё просто оказалось..
 
{quote}{login=Юрий М}{date=26.04.2011 07:58}{thema=}{post}1. Это как - сделать "просвет" между ними ещё меньше? :-)  
2. Как понять - "собственный" заголовок?  
3. В каких полях какое допустимое количество.  
4. Контроль ФОРМАТА? Может использовать календарь?{/post}{/quote}  
 
1. Можно расположить в две колонки. Так всё таки компактнее будут выглядеть 44 поля ввода - я это уже сделал;  
2. Ну например, во встроенной форме заголовок одного поля ввода будет "FULLN_U", а в пользовательской я смогу написать человеческим языком "Фамилия:" - я это уже сделал;  
3. Допустимое количество я подсматривал на листе "М" в бланке, который нужно выводить на печать(сколько клеток для букв/цифр, столько и ограничивал). Ограничения я уже поставил в свойствах TextBox, в частности в пункте MaxLenght;  
4. Во первых, календарь - это немного сложно, и я его не умею. Во вторых, почти все макросы-календари, которые я находил в сети, не работают если не установлен Acces, не хватает какой то библиотеки. Хотелось бы просто небольшой код проверки, который бы проверял правильность формата, и при неправильном выводил MsgBox с оповещением, какой он должен быть. Таких кодов я встречал несколько, но они проверяют, какой определённое слово, какой ввод только цифр, а как дату я не знаю и знаний не хватает переделать, как только я не изголялся над функцией Format.  
 
Но в этом сообщении (я имею ввиду моё второе, которое в догонку к первому) я написал в чём важные отличия, для меня, применимо к моему вопросу, пользовательской формы от встроенной. И её отличительные особенности у меня уже решены, кроме проверки формата. Наиболее важными для меня являются вопросы, описанные в первом моём сообщении. Ну не получается у меня подтянуть созданные кнопки, чтобы они работали как во встроенной форме.
v_i_t_e_n_d_o_@_r_a_m_b_l_e_r_._r_u
 
{quote}{login=RAN}{date=26.04.2011 08:32}{thema=}{post}Контроль даты сделаю (показывал сегодня переделанную функцию).  
Остальное поглядим.  
Но не враз.  
Сейчас долго пытался понять, как и зачем был отключен переход по форме по Enter.  
Как - понял, зачем - нет???{/post}{/quote}  
 
Дело в том, что файл с макросом, который берёт данные с определённой строки (выделенной фамилии) и заполняет форму, был получен женой в отделе соц.страха, где она и сдаёт эти отчёты (в бланках строгого вида, с отметками для машинного пересчёта).  
Проблема заключалась в отвратительном способе ввода, с помощью какой-то программы (АнкетаПак), возможно написанной второпях на коленке, которую ей тоже там и выдали (что взять с бюджетной организации :(  ). Затем в её недрах нужно было находить определённый .dbf-файл, открывать в Excel, копировать данные и вставлять в этот файл на страницу "база", и при этом не ошибиться. Ещё почему-то даты получались с разными разделителями, а иногда и перевёрнутыми. И длина некоторых строк была больше чем в бланке, что и вызывало процедуру DeBug. Бухгалтеров это ставило в ступор.    
Вот я и решил помочь своей жене (и в дальнейшем многим другим, хочу готовый файл отдать в соц.страх). Для этого хочу создать форму ввода данных. Но в отличие от программы, чтобы она не допускала ввод неверных данных, имела ограничение на длину некоторых строк, имела краткую справку и другие мелочи. Практически всё это реализовано и/или знаю как реализовать. За исключением этих кнопок ("Изменить", "Предыдущий" и "Следующий") и скрола.  
 
То что перемещаться можно только по табу, я тоже заметил. Но подумал что это так заложено в программе. Подскажите пожалуйста, как подключить переход по Enter.  
 
Дело в том, что с разработкой макросов, и пользовательской формы в частности, я познакомился только четыре дня назад. За эти выходные и праздники перечитал несколько книг (Уокенбах Дж, Эйткен Питер., Гарбер Г.З, Миронов), и на их основании, а также мои собственные догадки, написал всё что связано с мною созданной UserForm и того что с ней связано. И я полон решимости довести своё дело до конца (чего не сделаешь ради любимой женщины :) ). Я надеюсь найти помощь и среди вас, много уважаемые гуру.  
 
Заранее благодарен всем за любую помощь.
v_i_t_e_n_d_o_@_r_a_m_b_l_e_r_._r_u
 
Прошу извинить за столь странное форматирование, но это глюк движка сайта. Я имею привычку предварительно, перед отправкой, копировать текст напечатанного мною сообщения (были инциденты когда оно пропадало). Поэтому вставил его в блокнот, для проверки правильности размещения синтаксисов quot и /quot. Всё было поставлено правильно. Жаль что очень мелкий шрифт, плохо будет читать.
v_i_t_e_n_d_o_@_r_a_m_b_l_e_r_._r_u
 
{quote}{login=Hugo}{date=26.04.2011 10:42}{thema=}{post}Такая мелочь:  
 
Private Sub UserForm_Initialize()  
ScrollBar1.Max = Cells(Rows.Count, 1).End(xlUp).Row  
End Sub  
 
И при добавлении записей обновлять.  
 
Ну и тогда  
 
Private Sub ScrollBar1_Change()  
TIN.Value = Cells(ScrollBar1.Value + 2, 1).Value  
FULLN_U.Value = Cells(ScrollBar1.Value + 2, 2).Value  
End Sub  
 
и т.д.{/post}{/quote}  
 
Спасибо огромное.  
 
Можно считать что со ScrollBar проблема решена.  
 
Всё работает на УРА.  
   
Именно поэтому возникают следующие три вопроса:  
1. что значит:    
...И при добавлении записей обновлять...  
вернее, что прописать в свойства кнопки "Изменить" (или "Обновить", название не столь важно), чтобы она сохраняла данные в той же строке?  
Всё что я смог найти, это:  
Private Sub CHENGE_Click()  
' Активизация листа  
   Sheets("база").Activate  
' Активизация ячейки  
'    ActiveCell(Row = ScrollBar1, 1).Activate  
' Определение активной строки  
'    r = CStr(Selection.Row) - эта  
'    r = ActiveCell.Row      - или эта  
' Возврат (в ячейку) имени  
   Cells(r, 1) = TIN.Text  
   Cells(r, 2) = FULLN_U.Text  
   Cells(r, 3) = NAME_U.Text  
   и т.д. ...  
End Sub  
 
Но при этих функциях (если разрэмить любую из них) данные сохраняются в строке, которая была выделена до вызова формы ввода данных. Что я не так пишу?  
 
2. при использовании ScrollBar обновляются все перечисленные по вашему методу данные в TextBox. Но не изменяются данные в OptionButton и CheckBox, которые у меня работают с такими функциями:    
' Передача пола  
   If ob_POL_M Then Cells(NextRow, 6) = "Ч"  
   If ob_POL_W Then Cells(NextRow, 6) = "Ж"  
' Определить используемость паспорта  
   If cb_PASP = True Then Cells(NextRow, 31) = "X"  
   If cb_PASP = False Then Cells(NextRow, 31) = ""  
Ума не приложу, как можно их записать,чтобы и они принимали значение, уже обозначенное в строках.  
 
3. Можно ли функции для ScrollBar, как-то модифицировать для кнопок "Предыдущий" и "Следующий"?  
 
Заранее благодарен за ответ и помощь.
v_i_t_e_n_d_o_@_r_a_m_b_l_e_r_._r_u
 
Давайте Вашу форму с уже имеющимися доработками, и уточните ближайшие узкие места.
 
Я сразу всё сделать не могу - работа не даёт вникнуть в детали, поэтому так только посоветую алгоритм. как вижу.  
Про "при добавлении записей обновлять" - я думаю, что при добавлении записей нужно перерисовать скроллбар на новое количество строк (соответственно изменив ScrollBar1.Max), и сразу его подвинуть на последнее значение.  
И вероятно можно по его активному значению "двигать курсор" по таблице, т.е. обновлять значения текстбоксов.  
Так же при нажатии на кнопки "Предыдущий" и "Следующий" можно менять ScrollBar1.value, а в свою очередь при изменении этого значения обновлять текстбоксы по нему.  
Вот как-то так, нет времени проверять в коде.
 
Вот, чуть проверил, работает:  
 
Private Sub BACK_Click()  
ScrollBar1.Value = ScrollBar1.Value - 1  
If ScrollBar1.Value = ScrollBar1.Min Then [BACK].Enabled = 0 Else [BACK].Enabled = 1
If ScrollBar1.Value = ScrollBar1.Max Then [FORWARD].Enabled = 0 Else [FORWARD].Enabled = 1
End Sub  
 
 
Private Sub FORWARD_Click()  
ScrollBar1.Value = ScrollBar1.Value + 1  
If ScrollBar1.Value = ScrollBar1.Min Then [BACK].Enabled = 0 Else [BACK].Enabled = 1
If ScrollBar1.Value = ScrollBar1.Max Then [FORWARD].Enabled = 0 Else [FORWARD].Enabled = 1
End Sub
 
Игорь, я делал несколько таких форм и везде делал активной строку с текущей записью (она всегда перед глазами). В этом случае вообще очень просто кнопке "сказать" - что делать: Offset или, row +/- 1 :-)
 
И кстати это же нужно добавить и сюда, чтоб ошибки не было при ручном уводе скроллбара в конец и потм нажатии на кнопку:  
 
Private Sub ScrollBar1_Change()  
If ScrollBar1.Value = ScrollBar1.Min Then [BACK].Enabled = 0 Else [BACK].Enabled = 1
If ScrollBar1.Value = ScrollBar1.Max Then [FORWARD].Enabled = 0 Else [FORWARD].Enabled = 1
 
TIN.Value = Cells(ScrollBar1.Value + 2, 1).Value  
FULLN_U.Value = Cells(ScrollBar1.Value + 2, 2).Value  
...  
...  
End Sub
 
Юрий, я тебя понял, но тут вообще таблица не причём, я подразумевал текущие данные на форме.  
Кстати, они исправно обновляются при изменении скроллбара - т.е. кнопки (или вручную) меняют скроллбар, он в свою очередь обновляет данные.  
 
Я чуть перестарался - блокировку кнопок достаточно повесить на изменение скроллбара - на самих кнопках это можно убрать, достаточно изменения скроллбара.  
Так всё перевязано :)
 
Мне кажется, что легче будет переписать всё заново :-)  
А текущие данные на форме - данные активной строки.
 
Ещё чуть:  
 
Private Sub OKButton_Click()  
...  
...  
   TIN.SetFocus  
     
 ScrollBar1.Max = Cells(Rows.Count, 1).End(xlUp).Row - 2  
 ScrollBar1.Value = ScrollBar1.Max  
End Sub  
 
Private Sub UserForm_Initialize()  
ScrollBar1.Max = Cells(Rows.Count, 1).End(xlUp).Row - 2  
End Sub
 
Да вроде получается на том, что есть - кнопки работают, скроллбар тоже.  
Позже вечером покажу, что получится у меня, может лругие варианты быстрее будут готовы.
 
Разобрался с кнопками вперёд/назад, скроллбаром, оптионбуттонами, чекбоксом. Запоминается положение, при котором закрыта форма (пока не закрыт файл).  
Не смотрел остальное - изменить/добавить.
Страницы: 1 2 3 4 5 След.
Читают тему
Наверх