Страницы: 1
RSS
Добавление описания/примечания (выпадающий список) на картинке, Как сделать чтобы при наведении на картинку появлялся список/описание
 
Всем доброго! В общем задача такая, необходимо сделать так, чтобы при наведении на картинку появлялся список (характеристик, описание и т.д) получилось сделать следующее (см. скрин) реализовано было так: в ячейке, что за картинкой тупо вставил примечание и вроде бы вот оно счастье, но картинок планируется много и если их переместить то всё пойдет по тому самому месту ((( Как можно и ЕСЛИ можно, добавить примечание к самой картинке? Чтобы куда бы её не переместили описание было намертво прикреплено к ней? Из идей создать отдельный лист с id и привязать эти id с описаниями к конкретной картинке, но как это сделать ума не хватает! (( Одна надежда на гуру Excel, помогите пожалуйста!
 
Файл нужен в формате excel.
фотки не подходят или к ворожке обратиться
 
Цитата
Parovoznik написал:
Файл нужен в формате excel.
А поможет?  :D

https://www.excelworld.ru/forum/10-54239-1
но не стоит надеяться что приложение предназначено для такой визуализации.
По вопросам из тем форума, личку не читаю.
 
Цитата
написал:
А поможет?
Можно было бы показать пару ссылок. На этих картинках нет макросов, так что в этом случае ссылки подойдут. Про это всё прописано, если пройти по ссылке из сообщения #3 и почитать переписку.
Изменено: gling - 14.03.2025 20:20:18
 
Цитата
написал:
https://www.excelworld.ru/forum/10-54239-1
ну это почти то, но там не понятно как потом редактировать (( да и с макросами я не работал ни когда, я думал может штатно как-то можно, как в примерах когда в описания картинку вставляют. Мне бы так же только наоборот )))) А может вы знаете как можно привязать картинку к ячейки, чтобы можно было потом эту картинку таскать куда угодно с сохранением привязки к ячейки? Может ещё так прокатит, а то у меня идеи как это без кода и при этом легко редактируемо сделать вообще закончились ((((
 
Цитата
написал:
Файл нужен в формате excel.фотки не подходят или к ворожке обратиться
Ну если это как-то поможет
 
kot2012, здравствуйте.
Можно попробовать вот так, только не при наведении на картинку, а при клике.
См. вложение.
 
Цитата
написал:
kot2012 , здравствуйте.Можно попробовать вот так, только не при наведении на картинку, а при клике.См. вложение.
Да! Это оно! Вы супер!  :) А как изменять аннотацию/описание? И как можно изменить положение описания? Я в этом абсолютный ноль (( буду очень признателен за разъяснение!
Изменено: kot2012 - 14.03.2025 21:35:01
 
Цитата
kot2012 написал:
А как изменять аннотацию/описание?
Описание меняется в свойстве Caption объекта Label1.
Цитата
kot2012 написал:
И как можно изменить положение описания?
Положение меняется в свойствах Left и Top объекта Label1.
 
Цитата
написал:
Положение меняется в свойствах Left и Top объекта Label1.
Благодарю! Еще раз огромное спасибо вам за помощь!  
 
Цитата
написал:
Положение меняется в свойствах Left и Top объекта Label1.
Подскажите пожалуйста, на что он ругается? Я просто скопировал весь код в новый файл без изменений, и он перестал работать
 
Цитата
kot2012 написал:
и он перестал работать
а нет на листе Label1 вот и ругается. И обратите внимание, подобные трюки на листе приводят к сбросу UNDO, что делает не возможность отмены действий.

В зависимости от того , как сильно можно и нужно заморочится, то
делаем группу из двух LABEL  объектов и картинки. Размер Label1 чуть больше картинки, Label2 чуть больше чем Label1  вот у них есть событие MouseMove
по Label2 определяем что вышли за пределы картинки и гасим описание, по Lavel1 наоборот.
получаем две процедуры на листе
 
Код
Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'Debug.Print "Label1"
End Sub

Private Sub Label2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'Debug.Print "Label2"
End Sub


Если объекты нужно плодить то нужно и процедуры плодить тоже, что не хорошо, тогда нужно через класс обработку событий делать.

Иными словами получится то получится, а вот на сколько трудоемкость компенсирует  - трудно сказать.

Можно конечно в сторону API глянуть, ведь событие системное есть при наведении на картинку, но надо искать
Изменено: БМВ - 15.03.2025 08:54:15
По вопросам из тем форума, личку не читаю.
 
Потеря Undo происходит при выполнении любого макроса. В данном случае можно минимизировать сброс Undo, к примеру, используя повторное нажатие на картинку с проверкой имени для скрытия описания. Это позволит уйти от использования Worksheet_SelectionChange.
 
Цитата
asesja написал:
Потеря Undo происходит при выполнении любого макроса.
не совсем так но я больше для предупреждения.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Иными словами получится то получится, а вот на сколько трудоемкость компенсирует  - трудно сказать.
А мне видится реализация довольно лаконичной (для моего варианта).
Независимо от количества картинок на листе, присвоить всем одну процедуру. На другой лист получить в столбик имена всех картинок и рядом уже прописывать свои данные (характеристики или что там будет у ТС), ну и, соответственно, выводить описание по имени картинки в единственный label. Естественно, всё описанное делается программно.
Изменено: asesja - 15.03.2025 09:24:29
 
Цитата
asesja написал:
А мне видится реализация довольно лаконичной
если про предложенный мной метод, то не совсем, все просто. Даже расположить подложки из меток и то не совсем просто.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
если про предложенный мной метод, то не совсем, все просто
Нет, я про свой метод.))
Изменено: asesja - 15.03.2025 09:22:10
 
Цитата
написал:
А мне видится реализация довольно лаконичной (для моего варианта).Независимо от количества картинок на листе, присвоить всем одну процедуру. На другой лист получить в столбик имена всех картинок и рядом уже прописывать свои данные (характеристики или что там будет у ТС), ну и, соответственно, выводить описание по имени картинки в единственный label. Естественно, всё описанное делается программно.
А можно ли так реализовать, к примеру на соседнем листе вносить данные, а на рабочем к картинке подтягивались ее характеристики (из таблицы), чтобы в код не лазить? Для меня это темный лес ((
 
Цитата
kot2012 написал:
А можно ли так реализовать, к примеру на соседнем листе вносить данные, а на рабочем к картинке подтягивались ее характеристики (из таблицы), чтобы в код не лазить?
Так я это и предложил, в описании реализации своего варианта  :) .
Изменено: asesja - 15.03.2025 10:22:49
 
Цитата
написал:
Так я это и предложил, в описании реализации своего варианта   .
:) ну вот видите мой уровень в программировании )) я ни слова не понял ))) а сложно ли это реализовать? И если у кода будут комментарии вообще будет супер! Буду признателен за помощь!
 
Цитата
kot2012 написал:
я ни слова не понял ))) а сложно ли это реализовать?
Для специалиста это решаемо.
Изменено: asesja - 15.03.2025 11:19:45
 
Цитата
написал:
Сложно ли, к примеру, на автомобиле поменять ГРМ или Шаровую опору для обычного водителя, который в этом не разбирается (или не понимает как сделать) и для специалиста, который работает в этой сфере в автомастерской?       Еще нужно учитывать, что у каждого  мастера свой уровень знаний, практического опыта ну и собственно подхода к выполнению работы (качественно или "на отвали").      
Видимо, сложно ( думал как с примечаниями к ячейке, что так и с картинкой можно поступить в два клика, это печально  :cry:  
 
Цитата
написал:
Для специалиста это решаемо.
Это понятно, что спец сделает, но я к таким не отношусь к сожалению, поэтому и обратился за помощью  
 
Порылся в интернете, но подсказки так и не появляются (( помогите пожалуйста найти ошибку
Изменено: kot2012 - 15.03.2025 22:36:56
 
Народ, помогите пожалуйста! Не пойму почему размер по ширине метка не изменяет (((
Sub ОписаниеКартинок()
   Dim pic As Shape, lbl As OLEObject
   Dim imgID As String
   Dim desc As String
   Dim additionalInfoC As String
   Dim additionalInfoD As String
   Dim additionalInfoE As String
   Dim rowIndex As Long
   Dim maxWidth As Double
   maxWidth = 300 ' Максимальная ширина метки

   ' Получаем ссылку на картинку
   Set pic = ActiveSheet.Shapes(Application.Caller)

   ' Проверяем наличие Label1 на активном листе
   On Error Resume Next
   Set lbl = ActiveSheet.OLEObjects("Label1")
   On Error GoTo 0

   If lbl Is Nothing Then
       MsgBox "Label1 не найдена на активном листе", vbExclamation
       Exit Sub
   End If

   If Not TypeOf lbl.Object Is MSForms.Label Then
       MsgBox "Объект Label1 не является меткой!", vbExclamation
       Exit Sub
   End If

   ' Получаем метку
   Dim lblLabel As MSForms.Label
   Set lblLabel = lbl.Object

   ' Получаем ID картинки
   imgID = Split(pic.Name, "_")(1)
   Debug.Print "imgID: " & imgID

   ' Ищем строку по ID
   rowIndex = FindRowByID(imgID, "Данные")

   If rowIndex > 0 Then
       desc = Sheets("Данные").Range("B" & rowIndex).Value
       additionalInfoC = Sheets("Данные").Range("C" & rowIndex).Value
       additionalInfoD = Sheets("Данные").Range("D" & rowIndex).Value
       additionalInfoE = Sheets("Данные").Range("E" & rowIndex).Value
       
       desc = "Описание: " & desc & vbCrLf & _
              "Дополнительно C: " & additionalInfoC & vbCrLf & _
              "Дополнительно D: " & additionalInfoD & vbCrLf & _
              "Дополнительно E: " & additionalInfoE
       
       desc = Replace(desc, ",", vbCrLf) ' Меняем запятую на перенос строки

       ' Проверяем, отличается ли текст метки от нового текста
       If lblLabel.Caption <> desc Then
           lblLabel.Caption = desc

           ' Отключаем автоматическую подгонку высоты
           lblLabel.AutoSize = False
           
           ' Устанавливаем ширину метки, и если она больше maxWidth, устанавливаем maxWidth
           lblLabel.Width = Application.WorksheetFunction.Min(lblLabel.Width, maxWidth)
           
           ' Устанавливаем высоту
           lblLabel.Height = Application.WorksheetFunction.Max(lblLabel.Height, 20)

           ' Изменяем шрифты и цвет заливки
           With lblLabel.Font
               .Name = "Arial"
               .Size = 11
               .Bold = False
           End With

           ' Устанавливаем цвет заливки
           lblLabel.BackColor = RGB(255, 255, 0)

           ' Получаем координаты для размещения Label
           With pic
               Dim picRight As Double
               Dim picBottom As Double
               picRight = .Left + .Width
               picBottom = .Top + .Height - 15
           End With
           
           lblLabel.Left = picRight
           lblLabel.Top = picBottom
           
           lbl.Visible = True
       End If
   Else
       MsgBox "ID не найден: " & imgID & vbNewLine & "Проверьте наличие данных на листе 'Данные'."
   End If

End Sub


Function FindRowByID(imgID As String, sheetName As String) As Long
   Dim ws As Worksheet

   ' Проверяем, существует ли sheetName
   On Error Resume Next
   Set ws = Sheets(sheetName)
   On Error GoTo 0

   If ws Is Nothing Then
       MsgBox "Лист '" & sheetName & "' не найден", vbExclamation
       FindRowByID = -1
       Exit Function
   End If

   Dim lastRow As Long
   lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row ' Находим последнюю строку в столбце A
   
   Dim i As Long
   For i = 1 To lastRow
       If ws.Cells(i, 1).Value = imgID Then ' Предполагается, что ID находится в столбце A
           FindRowByID = i ' Возвращаем номер строки, где найден ID
           Exit Function
       End If
   Next i
   
   FindRowByID = -1 ' Если не найден, возвращаем -1
End Function
 
Цитата
написал:
Народ, помогите пожалуйста! Не пойму почему размер по ширине метка не изменяет (((
к сожалению файл не прикрепить ибо превышен размер допустимого в 300 кб  ((((  
 
Всем доброго! В общем всё получилось! ) Огромная благодарность и отдельное спасибо за наставление на путь истинный - asesja! В общем выкладываю то, что у меня получилось, надеюсь кому то подойдет данный шаблон! Но если будут рекомендации по коду буду только рад! Всем спасибо за помощь и поддержку!  
 
kot2012, приветствую.
Есть ещё такой вариант.
Преимущества:
1. Не используется событие "Worksheet_SelectionChange" (минимальна вероятность сброса Undo).
2. Работает при наведении мышкой.
3. При необходимости, изменение данных можно назначить на любое действие/событие (кнопка, клик по картинке, и ит.д.).
4. При изменении масштаба листа текс остается читаемым.
Страницы: 1
Читают тему
Наверх