Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.11.02;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.007 c
15-1221120707
trubin
2008-09-11 12:11
2008.11.02
Доступен триал delphi 2009


1-1201264323
Kolan
2008-01-25 15:32
2008.11.02
Как дисэйблить кнопки если операция не поддерживается&amp;#133 ?


2-1222075958
Dennis I. Komarov
2008-09-22 13:32
2008.11.02
AllUsers App..Data?


2-1222246913
pathfinder
2008-09-24 13:01
2008.11.02
Массив объектов как параметр


15-1221129150
Elchin
2008-09-11 14:32
2008.11.02
Unicode





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский