Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.02;
Скачать: CL | DM;

Вниз

Excel   Найти похожие ветки 

 
{RASkov} ©   (2008-09-09 17:20) [0]

Можно тут вопросик по Excel"у задать?
Есть ли возможность в этой чудо(действительно так)-программе сделать "хитрый" список?
Поясняю:
Есть пару листов в книге. На одном в колонке список(не большой) Например:
Val1
Val2
Val3
...
Val20
и этот список имеет имя(выделяется диапазон и задается ему имя) Spsk, например. Кол-во может менятся, но думаю в пределах от 5 до 50.
На втором листе есть табличка из 10 строк и несколько колонок, так вот в одной из колонок хотелось бы сделать данный хитрый список
Т.е. я выделяю 10 ячеек в нужной колонке и Данные>Проверка... Там список и источник делаю =Spsk
Теперь могу выбирать в каждой ячеки колонки из списка с другого листа. Это все не проблема, а собс-но вопрос:
Как сделать список без применения макросов так, чтоб выбранное значение пропадало из общего выпадающего списка...
т.е. в колонке может быть только одна ячейка с определенным значением.... Другими словами в колонке таблицы должна быть возможность выбора всех элементов списка, но в произвольном порядке и небылоб возможности выбрать два раза одно и тоже.
Или такой вариант задуманного:
Пусть в выпадающем списке содержится весь список, но при выборе уже выбранного это как-то пресекалось или, например, очищалась предыдущая ячейка с этим значением... Думаю подробно все расписал, но могу если что уточнить или например скинуть куда-нибудь файл со списками, но без формул(вопрос в них)...


 
{RASkov} ©   (2008-09-09 17:31) [1]

> есть табличка из 10 строк

Т.е. не из 10, а сколько в списке значений, т.е. в нашем случае 20... Просто в одном месте подумал о списке из 20 значений, а в другом из 10... :( Сорри..


 
Andy BitOff ©   (2008-09-09 17:47) [2]

Скинь.
Если честно, очень сильно морщил репу, но так и не понял, что нужно =(


 
{RASkov} ©   (2008-09-09 17:57) [3]

http://webfile.ru/2217761
(16Кб)


 
Andy BitOff ©   (2008-09-09 20:03) [4]

Т.е. редактирование значений вручную недопустимо? Там где val7 второй раз. Тогда проще удалять значение из списка при его выборе один раз.


 
{RASkov} ©   (2008-09-09 20:17) [5]

> Т.е. редактирование значений вручную недопустимо?

Ну почему не допустимо... допустимо. Лишь бы правильно все было.
Т.е. например изначально в пустую ячейку C8 вводим значени вручки например Val5 то все должно нормально ввестись, а если Val7, то тут....
Тут можно придумать любые варианты решения, но желательно без макросов...
Например что-нибудь типа =ЕСЛИ(ПОИСКПОЗ(С8; SpisokUnicVals; ?)<>0;.... не могу я что-то соображать по екселевски :(

> Тогда проще удалять значение из списка при его выборе один раз

А как его оттуда удалить-то? И например потом если на ячейке с введенным значением(из списка) нажать Del то значение должно вернуться в список, так как теперь его можно будет выбрать в другой ячейки....
Это я все говорю про Лист1 и списки в ячейках колонки C
Я подозреваю, что описал не понятно, то что хочу реализовать :( Уже сам запутался в этом екселе.... в голове все по делфийски крутится :)


 
{RASkov} ©   (2008-09-09 20:24) [6]

Другими словами в книге [3] если очистить ячейку С8 то при имеющихся уже выбранных значениях:
Val1
Val7
Val10
У нас в любой пустой(и не только) список должен сожержать
Val2
Val3
Val4
Val5
Val6
Val8
Val9
Или другой вариант: Пусть список всегда полный, но при выборе уже выбранного значения, например в С8 выбрать Val7 то в С4 должна очиститься ячейка....


 
Andy BitOff ©   (2008-09-09 20:47) [7]

Думаю, что без макросов не обойтись. ИМХО.

Ща еще подумаем.


 
Andy BitOff ©   (2008-09-09 20:48) [8]

Я понял, что тебе надо.


 
Real ©   (2008-09-10 00:58) [9]

А чем макросы не устраивают? СИнтаксис - обычный бейсик, имена объектов - легко получить включив запись макроса и потыкав руками по листам да ячейкам...


 
ggg   (2008-09-10 05:48) [10]

>>чтоб выбранное значение пропадало из общего выпадающего списка...

Уверен, что нужно? Т.е. когда будут определены 19 из 20 значений, в 20-ом останется только один возможный вариант. А когда будут выбраные все, возможность редактирования (т.е. выбора другого значения для какого-то поля) вообще исчезнет. Надо будет найти, где уже установленно необходимое значение, там сбросить, и уже потом установить его в необходимом месте.
Чем-то напоминает гениальные идеи моего бывшего главного менеджера... :)


 
{RASkov} ©   (2008-09-10 08:23) [11]

> [10] ggg   (10.09.08 05:48)
> Т.е. когда будут определены 19 из 20 значений, в 20-ом останется
> только один возможный вариант.

Именно так.

> А когда будут выбраные все, возможность редактирования (т.е.
> выбора другого значения для какого-то поля) вообще исчезнет.

В принципе - да. Но если встать на любое выбранное значение и нажать Del(очистить ячейку) то значение должно вернуться в список, а если теперь на имеющемся значении выбрать из списка единственное значение, то они(значения) должны поменятся местами, из списка в ячейку из ячейки в список.

> Надо будет найти, где уже установленно необходимое значение,
> там сбросить, и уже потом установить его в необходимом
> месте.

Или так, но как это сделать без макросов? :)


 
Andy BitOff (PPC)   (2008-09-10 11:11) [12]

Без макросов не сделать Приду с работы покажу как с макросом сделать.


 
Andy BitOff (PPC)   (2008-09-10 11:50) [13]

Хотя я тут перечитал. Ты хочешь что бы из списка пропадало, а это намного муторнее. Т.к. список есть диапазон яцеек придется постоянно его варьировать, что геморройнее нежели проверять введенное значение и в случае повтора не давать его вводить.


 
{RASkov} ©   (2008-09-10 14:12) [14]

> Ты хочешь что бы из списка пропадало, а это намного муторнее.

Не, я хочу чтоб был контроль, а каким образом - всё равно. Можно чтоб из списка пропадали значения, можно не давать вводить, можно затирать предыдущее введеное значение, можно еще какой другой способ, как например цветом выделять или !-знаками..... Но чтоб без макрасов...
Просто макросы отключаются и все это не работает....(безопасность типа того, достала уже) :( Хотя на самый край можно и с макросами... с ними проще(делать) я думаю, но всеж желательно без них...
Andy BitOff Отдельное Большое Спасибо в любом случае)


 
Andy BitOff ©   (2008-09-10 18:52) [15]

Без макросов не получится. Зациклинная проверка получается, проверка проверки и т.д. до бесконечности, к тому же не возможно вставить любое значение отличное от содержащихся в списке. В общем вот макрос. Скопируй всё на Лист1 (через ALT+F11, конечно) и всё будет работать.
А на счет безопастности, здесь такой же вечный спор как и запуск потенциально опасного ехе"шника. Обычно юзеру запрещено то, что не разрешено админом и здесь такой же случай. Админ должен посмотреть, что всё нормально и уже дать юзеру, а сам юзер &#151; ни-ни. А VBA такой же мощный инструмент как и любой язык, плохо у него, конечно с GUI, а в остальном достаточно мощная штука. Тут тебе и WinAPI и БД и всё это в удобной обертке. Хотя сам на нем не пишу. Работал в паре с человеком, который на нем писал, так очень плотная взаимосвязь между приложениями, общались месаджами, перекидывали данные, он еще с Ораклом работал и был доволен, в общем.

Const MyRangeData = &laquo;C3:C12&raquo; " функция срабатывает только внутри этого range"а
Public PrevValue As String   " Предыдущее значение ячейки

" Проверка вхождения в нужный range
Function InMyRange(Target As Range) As Boolean
 Set MyRange = Range(MyRangeData)
 InMyRange = (Target.Row >= MyRange.Row And Target.Row <= MyRange.Row + MyRange.Rows.Count &#151; 1) And _
             (Target.Column >= MyRange.Column And Target.Column <= MyRange.Column + MyRange.Columns.Count &#151; 1)
End Function

" Запомнить предыдущее значение
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If InMyRange(Target) Then
   If Target.Count <= 1 Then
     PrevValue = Target.Text
   Else:
     PrevValue = ActiveCell.Offset(0, 0).Text
   End If
 End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
 If InMyRange(Target) Then
   If Target.Text <> &laquo;&raquo; Then
     " поиск повторного ввода
     Set MyRange = Range(MyRangeData)
     Set ResSearch = MyRange.Find(What:=Target.Text, LookAt:=xlWhole)
     If Not ResSearch Is Nothing Then
       FirstRes = ResSearch.Address
       ResCount = 0
       Do
         ResCount = ResCount + 1
         Set ResSearch = MyRange.FindNext(ResSearch)
       Loop While (Not (ResSearch Is Nothing)) And (ResSearch.Address <> FirstRes) And (ResCount <= 1)
       If ResCount <> 1 Then
         " найдено более одного значения
         t = MsgBox(&laquo;Такое значение уже существует.&raquo;, vbApplicationModal + vbCritical + vbOKOnly, &laquo;Ошибка&raquo;)
         Target.Formula = PrevValue
         Target.Activate
       End If
     End If
   End If
 End If
End Sub


 
{RASkov} ©   (2008-09-10 19:21) [16]

> [15] Andy BitOff ©   (10.09.08 18:52)

---------------------------
Microsoft Visual Basic
---------------------------
Compile error:

Invalid outside procedure
---------------------------
ОК   Справка  
---------------------------
И выделяет в первой строчке

> Const MyRangeData = «C3:C12» " функция

C12....
:)
Вообщем, понятно.... нужно "справку" нажать, потом это все дело перевести на русский, выкинуть из мозга знания делфи...
Не так уж в принципе и многое... Не, ну ее нафик.... Я уже с формулами, ёкселевскими, весь моск сломал...
Спасибо, конечно, Огромное, но думаю на этом хватит... нужно остановится. Дуб я в екселе и в VBA :(
Алгоритм-то конечно понятен, но "что куда сувать"...
Сделал пока по максимуму удобный ввод данных в ячейки, а проверку на (не)уникальность - опустил, (т.е. оставил на совесть пользователя, благо этот пользователь я сам, просто пользоватся буду редко, но...) Еще раз спасибо.


 
Andy BitOff ©   (2008-09-10 21:36) [17]

Все кавычки должны быть " парные. Это мне DMClient так помог.


 
{RASkov} ©   (2008-09-11 05:58) [18]

> [17] Andy BitOff ©   (10.09.08 21:36)

Ясно. Спасибо, попробую подменить кавычки на настоящие вэбэашные)


 
{RASkov} ©   (2008-09-11 15:38) [19]

Ага, это[15] "дело" заработало.... Там DMClient минусы еще подправил и еще вроде чего-то...)



Страницы: 1 вся ветка

Текущий архив: 2008.11.02;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.016 c
15-1220774723
Denis__
2008-09-07 12:05
2008.11.02
Книги по алгоритмам


2-1222088665
Фоофа
2008-09-22 17:04
2008.11.02
Определение включенности интернета


11-1194706878
matroskin66
2007-11-10 18:01
2008.11.02
Несколько форм в dll


15-1221016514
Василий Жогарев
2008-09-10 07:15
2008.11.02
Программирование под Unix- подобные системы.


15-1221024724
Vlad Oshin
2008-09-10 09:32
2008.11.02
BDS2006, палитра компонент, как упорядочить внутри вкладки по афл