Добрый день! Подскажите как решить проблемку..... есть в екселе набранная база данных (таб. номер, ФИО, должность и т.д.) как сделать так что б во всех последующих документах при работе в ексель можна было в одной ячейке набирать таб номер а рядом в другой высвечивалась фамилия (или ФИО, или должность)..... людей очень много каждый раз искать проблемно.... спасибо.
Добрый день! Подскажите как решить проблемку..... есть в екселе набранная база данных (таб. номер, ФИО, должность и т.д.) как сделать так что б во всех последующих документах при работе в ексель можна было в одной ячейке набирать таб номер а рядом в другой высвечивалась фамилия (или ФИО, или должность)..... людей очень много каждый раз искать проблемно.... спасибо.ket2330
спасибо.... попробую..... мне главное важно непереносить информацию, т.е. при открытии другой страницы в екселе... можна было также ввести таб.номер и выбивалась фамилия..... еще раз спасибо.
спасибо.... попробую..... мне главное важно непереносить информацию, т.е. при открытии другой страницы в екселе... можна было также ввести таб.номер и выбивалась фамилия..... еще раз спасибо.ket2330
Можно сделать макросом по событию изменения ячейки. Например так - при открытии книги (или по команде оператора) в память загружаются данные. Далее если в ячейку вводится номер, присутствующий в памяти, то сразу в соседние ячейки выгружаются соотвествующие данные. Этот механизм можно отключать и включать в любое время элементом управления.
Можно сделать макросом по событию изменения ячейки. Например так - при открытии книги (или по команде оператора) в память загружаются данные. Далее если в ячейку вводится номер, присутствующий в памяти, то сразу в соседние ячейки выгружаются соотвествующие данные. Этот механизм можно отключать и включать в любое время элементом управления.Hugo
Доброго дня!! С макросами вообще туго..... я чайник в екселе... только начиаю изучать..... подскажите как его искать и создать..... спасибо большое.
Доброго дня!! С макросами вообще туго..... я чайник в екселе... только начиаю изучать..... подскажите как его искать и создать..... спасибо большое.ket2330
Нужен небольшой пример Вашей базы - строк на 10 хватит. Можете личные данные заменить на выдуманные (даже желательно). В принципе, единственную пока вижу сложность - как этот механизм отключать. Можно сделать например так - Вы открываете файл с этой базой, и пока она открыта, всюду правее введённого кода будут вставляться данные. Ну или в этой базе поставить чекбокс - соответственно его состоянию будет работать макрос. Работа не на 5 минут - поэтому если и буду делать, то скорее всего вечером.
Но может быть будут другие решения от других форумчан?
Нужен небольшой пример Вашей базы - строк на 10 хватит. Можете личные данные заменить на выдуманные (даже желательно). В принципе, единственную пока вижу сложность - как этот механизм отключать. Можно сделать например так - Вы открываете файл с этой базой, и пока она открыта, всюду правее введённого кода будут вставляться данные. Ну или в этой базе поставить чекбокс - соответственно его состоянию будет работать макрос. Работа не на 5 минут - поэтому если и буду делать, то скорее всего вечером.
Но может быть будут другие решения от других форумчан?Hugo
Вот попробуйте, погоняйте (файл обновил, исправил небольшую ошибку). Название чекбокса поменяйте на свой вкус. Кстати, номера запоминаются без ведущих нулей, т.е. то, что в ячейке, а не то, что Вы видите. Сделал, как описывал выше. Работает во всех файлах, пока открыт файл с базой и включен чекбокс.
Вообще имхо неплохая штука - можно код усложнить, добавить ещё чекбоксов или иначе устроить выбор - что именно будем копировать и куда. Например должность или ФИО целиком, или сразу всё. Да и похожих задач уже было много, а такого решения ещё не было!
Вот попробуйте, погоняйте (файл обновил, исправил небольшую ошибку). Название чекбокса поменяйте на свой вкус. Кстати, номера запоминаются без ведущих нулей, т.е. то, что в ячейке, а не то, что Вы видите. Сделал, как описывал выше. Работает во всех файлах, пока открыт файл с базой и включен чекбокс.
Вообще имхо неплохая штука - можно код усложнить, добавить ещё чекбоксов или иначе устроить выбор - что именно будем копировать и куда. Например должность или ФИО целиком, или сразу всё. Да и похожих задач уже было много, а такого решения ещё не было! Hugo
Serge_007 спасибо большое за формулу.... все просто и понятно.
Hugo - Ваше решение вообще супер.... вот только подскажите как мне перенети его в реальную базу.... или подсказку как пользаватся этим чудом в других таблицах.... спасибо.
Serge_007 спасибо большое за формулу.... все просто и понятно.
Hugo - Ваше решение вообще супер.... вот только подскажите как мне перенети его в реальную базу.... или подсказку как пользаватся этим чудом в других таблицах.... спасибо. ket2330
Чтоб перенести - нужно перенести весь код и чекбокс. Имя чекбокса должно быть именно таким, как в примере, имя листа тоже (ну или нужно править код).
Думаю, проще данные базы перенести в этот файл. Но вообще если разобраться в механике работы - то можно и к другим базам прикрутить. Только одновременно две разные базы работать не будут, если это не предусмотреть в коде. "как пользаватся этим чудом в других таблицах" - если вопрос в том, как получить фамилию из базы при вводе номера в другой файл, то оно для этого и делалось и так и работает. Если вопрос как подключить к другим базам/данным - самое простое, это перенести/скопировать лист другой базы в этот файл - тогда в коде нужно править самую малость. в модуле книги имя листа и чекбокса: [vba]
Code
Private Sub Workbook_Open() Set App.AppEv = Application If Sheets("база").CheckBox1 Then bWork = True fillbaza End If End Sub
[/vba] в модуле листа с чекбоксом имя чекбокса: [vba]
Code
Private Sub CheckBox1_Click() bWork = CheckBox1 If CheckBox1 Then fillbaza End Sub
[/vba] В стандартном модуле имя листа, диапазоны: [vba]
Code
Sub fillbaza() Dim i& Set oDict = CreateObject("Scripting.Dictionary")
With Sheets("база") tabNum = .Range(.[E4], .Range("b" & .Rows.Count).End(xlUp)).Value End With
For i = 1 To UBound(tabNum) If Not oDict.exists(tabNum(i, 1)) Then oDict.Item(tabNum(i, 1)) = i Next
End Sub
[/vba]
Что куда копировать прописано в модуле класса в строке Target.Offset(, 1).Value = tabNum(oDict.Item(Target.Value), 4): [vba]
Code
Private Sub AppEv_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Cells.Count = 1 Then If bWork Then Application.EnableEvents = False If oDict.exists(Target.Value) Then Target.Offset(, 1).Value = tabNum(oDict.Item(Target.Value), 4) End If Application.EnableEvents = True End If End If End Sub
[/vba] В принципе, эти 1 и 4 можно брать с листа - т.е. организовать, чтоб эти параметры пользователь мог задавать сам согласно задаче. 1 - это сдвиг места вставки фамилии от изменяемой ячейки (1 ячейка вправо) 4 - это что именно из базы нужно брать. Там в коде выше в массив tabNum берутся данные из базы, 4 - это номер "столбца" этого массива с короткими ФИО.
Есть некоторые ограничения использования - если базу менять/пополнять, то данные в массиве нужно обновить, сняв и поставив снова чекбокс. Хотя это неудобство тоже можно устранить, усложнив код.
Ещё будет позже поправка - если база большая, и этот функционал не используется постоянно (т.е. он "навешен" на реальную базу, а не на файл, сделанный только для этой работы), то при снятии чекбокса нужно освобождать память от данных. Если при открытии файла чекбокс не стоит - то в память данные не загружаются. Но если стоит, или поставлен в процессе работы - то сейчас данные загружаются и только обновляются, но не выгружаются.
Чтоб перенести - нужно перенести весь код и чекбокс. Имя чекбокса должно быть именно таким, как в примере, имя листа тоже (ну или нужно править код).
Думаю, проще данные базы перенести в этот файл. Но вообще если разобраться в механике работы - то можно и к другим базам прикрутить. Только одновременно две разные базы работать не будут, если это не предусмотреть в коде. "как пользаватся этим чудом в других таблицах" - если вопрос в том, как получить фамилию из базы при вводе номера в другой файл, то оно для этого и делалось и так и работает. Если вопрос как подключить к другим базам/данным - самое простое, это перенести/скопировать лист другой базы в этот файл - тогда в коде нужно править самую малость. в модуле книги имя листа и чекбокса: [vba]
Code
Private Sub Workbook_Open() Set App.AppEv = Application If Sheets("база").CheckBox1 Then bWork = True fillbaza End If End Sub
[/vba] в модуле листа с чекбоксом имя чекбокса: [vba]
Code
Private Sub CheckBox1_Click() bWork = CheckBox1 If CheckBox1 Then fillbaza End Sub
[/vba] В стандартном модуле имя листа, диапазоны: [vba]
Code
Sub fillbaza() Dim i& Set oDict = CreateObject("Scripting.Dictionary")
With Sheets("база") tabNum = .Range(.[E4], .Range("b" & .Rows.Count).End(xlUp)).Value End With
For i = 1 To UBound(tabNum) If Not oDict.exists(tabNum(i, 1)) Then oDict.Item(tabNum(i, 1)) = i Next
End Sub
[/vba]
Что куда копировать прописано в модуле класса в строке Target.Offset(, 1).Value = tabNum(oDict.Item(Target.Value), 4): [vba]
Code
Private Sub AppEv_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Cells.Count = 1 Then If bWork Then Application.EnableEvents = False If oDict.exists(Target.Value) Then Target.Offset(, 1).Value = tabNum(oDict.Item(Target.Value), 4) End If Application.EnableEvents = True End If End If End Sub
[/vba] В принципе, эти 1 и 4 можно брать с листа - т.е. организовать, чтоб эти параметры пользователь мог задавать сам согласно задаче. 1 - это сдвиг места вставки фамилии от изменяемой ячейки (1 ячейка вправо) 4 - это что именно из базы нужно брать. Там в коде выше в массив tabNum берутся данные из базы, 4 - это номер "столбца" этого массива с короткими ФИО.
Есть некоторые ограничения использования - если базу менять/пополнять, то данные в массиве нужно обновить, сняв и поставив снова чекбокс. Хотя это неудобство тоже можно устранить, усложнив код.
Ещё будет позже поправка - если база большая, и этот функционал не используется постоянно (т.е. он "навешен" на реальную базу, а не на файл, сделанный только для этой работы), то при снятии чекбокса нужно освобождать память от данных. Если при открытии файла чекбокс не стоит - то в память данные не загружаются. Но если стоит, или поставлен в процессе работы - то сейчас данные загружаются и только обновляются, но не выгружаются.Hugo
Вот чуть навернул функционала. Дизайнер конечно из меня ещё тот... Вместо чекбокса вероятно лучше бы смотрелся ToggleButton, но лень переделывать. В общем, как вариант.
Вот чуть навернул функционала. Дизайнер конечно из меня ещё тот... Вместо чекбокса вероятно лучше бы смотрелся ToggleButton, но лень переделывать. В общем, как вариант.Hugo