Страницы: 1
RSS
Всплывающее окно при наведении на ячейку, Отобразить всплывающее окно с информацией из неактивной таблицы при наведении на ячейку
 
Доброго времени суток. Помогите пожалуйста сделать всплывающее окно, которое будет отображать информацию из таблицы на листе № 2 (в формате ID | Name | Age | Passport_series | .....)  при наведении на ячейку с ID на листе №1. Связь ячеек по ID, на листе 2 они уникальны.
Пример таблиц:
Лист 1
ID
1
2
3
Лист2
ID | Name | Age | Passport_series  | .....
1   | Вася  | 20   | 777777               | .....
2   | Петя  | 20   | 999999               | .....
3   | Коля  | 21   | 444444               | .....
Изменено: Илья Б - 08.06.2022 11:30:55
 
Илья Б, здравствуйте
Проверка данных - заполните вторую вкладку инструмента для выделенной области
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Спасибо. Но это не то, что нужно.  Видимо криво объяснил.То, что вы предлагаете - это просто подсказка для поля (как понял я, ее нельзя сделать динамической). Мне нужно чтобы при наведении на ячейку с ID в таблице на листе 1 всплывало окно с совокупной информацией по всем ячейкам связанным с конкретным ID из таблицы на листе 2.
Изменено: Илья Б - 08.06.2022 13:13:02
 
Илья Б,  разговор именно про наведение курсора мышки на ячейку или про её активацию?
 
Цитата
Илья Б написал:
То, что вы предлагаете - это просто подсказка для поля (как понял я, ее нельзя сделать динамической)
нельзя недооценивать силу макросов, но без  оных заадумку не воплотить.
По вопросам из тем форума, личку не читаю.
 
Цитата
написал:
Илья Б,  разговор именно про  наведение  курсора мышки на ячейку или про её  активацию ?
Лучше при наведении, но не принципиально.
 
В модуль листа.
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.Count = 1 Then
        myAddShape

    End If
End Sub
В стандартный модуль.
Код
Option Explicit

Sub myAddShape()
    Dim txt  As String
    txt = GetTxt(ActiveCell.Value)
    
    Dim sh As Shape
    For Each sh In ActiveSheet.Shapes
        sh.Delete
    Next
    
    If txt <> "" Then
        Set sh = ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 1, 1, 500, 25)
        With sh
            .TextFrame2.TextRange.Characters.Text = txt
            Do
                If .TopLeftCell.Row >= ActiveCell.Row Then Exit Do
                .Top = .Top + 10
            Loop
            Do
                If .TopLeftCell.Column > ActiveCell.Column Then Exit Do
                .Left = .Left + 10
            Loop
        End With
    End If
End Sub

Function GetTxt(ActiveCell_Value As Variant) As String
    With Лист2
        Dim yy As Long
        On Error Resume Next
        yy = WorksheetFunction.Match(ActiveCell_Value, .Columns(1), 0)
        On Error GoTo 0
        If yy > 0 Then
            Dim xx As Long
            xx = .UsedRange.Columns.Count
            If xx = 1 Then xx = 2
            Dim arr As Variant
            Dim brr As Variant
            arr = .Cells(yy, 1).Resize(1, xx)
            ReDim brr(1 To UBound(arr, 2))
            For xx = 1 To UBound(arr, 2)
                brr(xx) = arr(1, xx)
            Next
            GetTxt = Join(brr, "    ")
        End If
    End With
End Function
 
МатросНаЗебре, Спасибо! То, что надо!
 
Возможно лучше уйти от циклов Do ... Loop просто на свойства, т.е. вместо вот этого

Код
       With sh
            .TextFrame2.TextRange.Characters.Text = txt
            Do
                If .TopLeftCell.Row >= ActiveCell.Row Then Exit Do
                .Top = .Top + 10
            Loop
            Do
                If .TopLeftCell.Column > ActiveCell.Column Then Exit Do
                .Left = .Left + 10
            Loop
        End With

лучше вот это

Код
        With sh
            .TextFrame2.TextRange.Characters.Text = txt
            .Top = ActiveCell.Top + 1
            .Left = ActiveCell.Width + 10
        End With
Изменено: New - 10.06.2022 14:01:47
 
Точно. Так лучше. Ну и, как вариант, можно дополнить на случай, если активная ячейка будет не в первом столбце.
Код
 .Left = ActiveCell.Left + ActiveCell.Width + 10
 
Бюджетный вариант:
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'Sheets(1)
If Not Intersect(Target, Range("a6:a8")) Is Nothing Then
del
With Sheets(2).Columns(1)
Set f = .Find(What:=Target, LookIn:=xlValues, LookAt:=xlWhole)
  If Not f Is Nothing Then
  Target.AddComment Text:="ID: " & f & Chr(10) & "Name: " & .Cells(f.Row, 2) & _
    Chr(10) & "Age: " & .Cells(f.Row, 3) & Chr(10) & _
    "Passport: " & .Cells(f.Row, 3)
  Else
  Target.AddComment Text:="Не найдено."
  End If
End With
Else
  del
End If
End Sub

Sub del()
If ActiveSheet.Comments.Count > 0 Then
  For Each x In ActiveSheet.Comments
  x.Delete
  Next
End If
End Sub
 
New Добрый день! Не могли бы Вы пожалуйста отредактировать Ваш код, на отображение всплывающего окна с информацией из таблицы другого листа, при наведении на ячейку, но с условием, что на другом листе повторяющихся строк "ID" может быть несколько и всплывающее окно так же отобразит все строки. Во вложении Ваш файл отредактированный по содержимому в Лист2.
Страницы: 1
Наверх