Новости:

Прикрепить к сообщению можно только файлы xls, gif, jpg, rar, zip,7z, bas, frm, cls, doc размером до 150 Кб.

Главное меню

Списки в Excel

Автор Findirector, 20.02.2008, 14:39

« назад - далее »

Шпец Докапыч

Цитата: SNAS от 06.03.2009, 15:43
Какое событие генерится при выборе из списка ("проверка данных")?

Worksheet_Change конечно же.
Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли

SNAS

ЦитироватьWorksheet_Change конечно же.
Но, в случае маскирования Worksheet_Change придется как-то проверять установлено ли в измененной ячейке "проверка данных"?
Я думал, что есть отдельное событие именно по ячейке с "проверка данных".
И еще - не нашел, где можно взять по ячейке с "проверка данных" ссылку на установленный список.

Шпец Докапыч

Если у Вас эта ячейка плавающая по листу, то проверить проверку (сорри за тавтологию) можно так:
  On Error Resume Next
  testVal = Target.Validation.Formula1
  On Error GoTo 0

  If IsEmpty(testVal) Then
    MsgBox "Нет": Exit Sub
  Else
    MsgBox "Есть"
  End If


Ссылку на список возвращает как раз это свойство (Formula1):
  If Asc(Left(testVal, 1)) = 61 Then
    MVal = Application.Transpose(Evaluate(testVal))
  Else
    MVal = Split(testVal, ";")
  End If
  MsgBox Join(MVal, Chr(10))


Полезный совет: Если будете изменять ячейку в событии "Изменение", чтобы не зациклило отключайте и включайте Application.EnableEvents.
Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли

SNAS

#48
Спасибо!
Ячейка не плавающая, просто их много и в разных местах листа.
С ходу получился такой код. Работает, но может можно оптимальнее?

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim strTemp, strTemp1 As String, SearchValue As Variant, rngCurTmp, rngCurTmp1 As Range, shCurTemp As Worksheet
    strTemp = Empty
    If Target.Cells.Count > 1 Then Exit Sub
    On Error Resume Next
        strTemp = Target.Validation.Formula1
    On Error GoTo 0
    If IsEmpty(strTemp) Then
        Exit Sub
    Else
        rngCurTmp = ActiveCell.Address
        shCurTemp1 = ActiveCell.Worksheet.name
        SearchValue = Target.Value
        strTemp = Right(strTemp, Len(strTemp) - 1)
       
        Application.Goto Reference:=[strTemp]
        Selection.Find(What:=Target.Value, After:=ActiveCell, LookIn:=xlValues, _
            LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False).Activate
       
        Application.EnableEvents = False
        Target.Formula = "=" & ActiveCell.Worksheet.name & "!" & ActiveCell.Address
        Application.EnableEvents = True

        Sheets(shCurTemp1).Select
        ActiveSheet.Range(rngCurTmp).Select
    End If
End Sub


Добавление:
Метод Goto Reference выделяет указанный диапазон, что не очень удобно (корректно). Иной способ поиска строки и взятие ее адреса, насколько я понимаю - перебор строк диапазона списка?

твой друг

Здравствуйте! Проблема: есть два списка регионов России с рядами данных по годам, один с 90 до 99 года, другой после 2000 и до 2007. Регионы в списках расположены в совершенно разном порядке, в одном списке на 2 региона больше, чем в другом. Как с помощью excel сделать из этих двух списков один с рядами данных с 90 по 07 годы? очень уж не хочется делать это вручную...

IKor

Вам поможет функция ВПР(_) и немного терпения для того, чтобы привести в соответсвие написание регионов на обоих листах.
Посмотрите вложенный файл - и заканчивайте сравнение списков.

твой друг

IKor, спасибо большое за ответ, все очень четко сопоставляется, буду доделывать. подскажите, где можно прочитать про ВПР(_), чтоб было просто и доступно, по Вашей ссылке пишет:"Сервер перегружен, попробуйте зайти позже".

IKor

Цитата: твой друг от 27.03.2009, 00:00
IKor, спасибо большое за ответ, все очень четко сопоставляется, буду доделывать. подскажите, где можно прочитать про [url=https://msexcel.ru/content/view/20/2/]ВПР(_)[/url], чтоб было просто и доступно, по Вашей ссылке пишет:"Сервер перегружен, попробуйте зайти позже".
Ну и попробуйте зайти позже  ::) , а лучше читайте справку Excel - там все написано очень подробно.

Fatat

Уважаемые формучане, помогите срочно бедному чайнику желательно на уровне ясельной группы растолкуйте:

Есть два листа в Ехцеле на двух вкладках в одном файле.

Первый лист - база данных имя гостя, дата заезда, адрес (это будет список гостей приехавших за год)
Второй лист - список гостей приежающих на этой неделе (число столбцов- 1)

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

IKor

Цитата: Fatat от 21.04.2009, 18:48
Уважаемые формучане, помогите срочно бедному чайнику желательно на уровне ясельной группы растолкуйте:
Это проще показать, чем рассказать.
На вскидку: можно воспользоваться условным форматированием (меню ФОРМАТ) и выделять цветом те ячейки, для которых выполняется условие:
=СЧЁТЕСЛИ(Диапазон_второго_листа;Текущая_ячейка_первого_листа)>0
В этом случае изо всех гостей будут ОДИНАКОВО выделены те, кто приглашен на этой неделе.

Fatat

Так как оба листа очень длинные скажем несколько тысяч строк, то искать потом в нем выделенные слова будет невозможно долго, нужно что бы они копировались в отдельный лист. Попробовала через VLOOK UP, но теперь проблема в том, что имя одного и того же человека может быть написано в разных вариантах:

Например: Грегори Баскет/ Марианна Саво - 1 лист,
а во втором листе только Марианна Саво,
соответсвенно нужно, что бы при вводе во второй лист Имени "Марианна" у меня на третьем листе появлялась полностью строчка (в 4 колонки)/ или несколько строк (так как имена или фамилии могут повторятся несколько раз по дате приезда) из базы данных содержащая имя "Марианна".

IKor

Цитата: Fatat от 22.04.2009, 13:15
Так как оба листа очень длинные скажем несколько тысяч строк, то искать потом в нем выделенные слова будет невозможно долго, нужно что бы они копировались в отдельный лист.
И все-таки было бы гораздо проще разобраться в Вашем вопросе, если бы Вы приложили короткий пример того, что у есть и того, что нужно получить... (без секретной информации)

Может ли Марианна встречаться на первом листе не единожды? Что нужно выводить на третьем листе в этом случае?

Правильно ли я понимаю, что выделяться должны совпадающие на обоих листах персоналии? не будет ли проще на втором листе выделить (или дополнить нужной информацией с первого листа) лица, присутствующих в обоих листах - это несколько проще, чем создавать третий лист и в нем формировать новый список.

Fatat

Прилагаю файл. Да, возможно также решение проблемы, если совпадающие имена будут высвечиваться и добавляться колонки в листе на заезд, а не в базе так как конечно он короче, но проблема в том, что в одной строке может быть записано 2-3 имени через /,  а в новом заезде может повторятся только одно из имен, будут ли строки добавлятся в таком случае?? или решение проблемы может быть, только если  в одной строке листа будет только одно имя?

IKor

Мне удалось сделать половину дела: на листе Результат выводится список прибывающих гостей построчно.
Настоятельно рекомендую Вам использовать либо "/", либо " / " в качестве разделителя.

К сожалению, моя формула-массива отказалась работать корректно ??? Я попробую что-нибудь придумать завтра, а Вы пока взгляните на решение и скажите в ту ли сторону мы движимся...

P.S. Конечно, можно разбить и базу данных на столбцы, содержащие по одному имени, по аналогии с первым листом, а затем искать каждое имя во всех столбцах - но получится достаточно громоздско...

Fatat

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