Всем доброго! В общем задача такая, необходимо сделать так, чтобы при наведении на картинку появлялся список (характеристик, описание и т.д) получилось сделать следующее (см. скрин) реализовано было так: в ячейке, что за картинкой тупо вставил примечание и вроде бы вот оно счастье, но картинок планируется много и если их переместить то всё пойдет по тому самому месту ((( Как можно и ЕСЛИ можно, добавить примечание к самой картинке? Чтобы куда бы её не переместили описание было намертво прикреплено к ней? Из идей создать отдельный лист с id и привязать эти id с описаниями к конкретной картинке, но как это сделать ума не хватает! (( Одна надежда на гуру Excel, помогите пожалуйста!
Добавление описания/примечания (выпадающий список) на картинке, Как сделать чтобы при наведении на картинку появлялся список/описание
14.03.2025 15:57:33
|
|
|
|
14.03.2025 20:01:13
Файл нужен в формате excel.
фотки не подходят или к ворожке обратиться |
|
|
|
14.03.2025 20:03:54
но не стоит надеяться что приложение предназначено для такой визуализации.
По вопросам из тем форума, личку не читаю.
|
|||
|
|
14.03.2025 20:17:41
Изменено: |
|||
|
|
14.03.2025 20:29:04
|
|||
|
|
14.03.2025 20:32:41
|
|||
|
|
14.03.2025 20:47:48
Можно попробовать вот так, только не при наведении на картинку, а при клике. См. вложение. |
|
|
|
14.03.2025 21:20:58
![]()
Изменено: |
|||
|
|
14.03.2025 21:59:28
|
|
|
|
14.03.2025 23:03:39
|
|||
|
|
15.03.2025 07:36:32
В зависимости от того , как сильно можно и нужно заморочится, то делаем группу из двух LABEL объектов и картинки. Размер Label1 чуть больше картинки, Label2 чуть больше чем Label1 вот у них есть событие MouseMove по Label2 определяем что вышли за пределы картинки и гасим описание, по Lavel1 наоборот. получаем две процедуры на листе
Если объекты нужно плодить то нужно и процедуры плодить тоже, что не хорошо, тогда нужно через класс обработку событий делать. Иными словами получится то получится, а вот на сколько трудоемкость компенсирует - трудно сказать. Можно конечно в сторону API глянуть, ведь событие системное есть при наведении на картинку, но надо искать
Изменено:
По вопросам из тем форума, личку не читаю.
|
|||||
|
|
15.03.2025 08:56:10
Потеря Undo происходит при выполнении любого макроса. В данном случае можно минимизировать сброс Undo, к примеру, используя повторное нажатие на картинку с проверкой имени для скрытия описания. Это позволит уйти от использования Worksheet_SelectionChange.
|
|
|
|
15.03.2025 09:05:54
По вопросам из тем форума, личку не читаю.
|
|||
|
|
15.03.2025 09:09:48
Независимо от количества картинок на листе, присвоить всем одну процедуру. На другой лист получить в столбик имена всех картинок и рядом уже прописывать свои данные (характеристики или что там будет у ТС), ну и, соответственно, выводить описание по имени картинки в единственный label. Естественно, всё описанное делается программно.
Изменено: |
|||
|
|
15.03.2025 09:19:17
По вопросам из тем форума, личку не читаю.
|
|||
|
|
15.03.2025 09:21:59
|
|
|
|
15.03.2025 10:18:01
|
|||
|
|
15.03.2025 10:22:37
|
|
|
|
15.03.2025 10:43:07
![]() |
|||
|
|
15.03.2025 10:55:33
|
|
|
|
15.03.2025 11:29:46
![]() |
|||
|
|
15.03.2025 11:32:11
|
|||
|
|
15.03.2025 19:56:57
Порылся в интернете, но подсказки так и не появляются (( помогите пожалуйста найти ошибку
Изменено: |
|
|
|
19.03.2025 16:10:38
Народ, помогите пожалуйста! Не пойму почему размер по ширине метка не изменяет (((
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 |
|
|
|
19.03.2025 16:13:30
|
|||
|
|
12.04.2025 17:07:54
Всем доброго! В общем всё получилось! ) Огромная благодарность и отдельное спасибо за наставление на путь истинный -
|
|
|
|
13.04.2025 09:41:15
Есть ещё такой вариант. Преимущества: 1. Не используется событие "Worksheet_SelectionChange" (минимальна вероятность сброса Undo). 2. Работает при наведении мышкой. 3. При необходимости, изменение данных можно назначить на любое действие/событие (кнопка, клик по картинке, и ит.д.). 4. При изменении масштаба листа текс остается читаемым. ![]() |
||||
|
|
|||
Читают тему