#excel #vba #image
#excel #vba #изображение
Вопрос:
Я нашел простой скрипт, который позволяет скрывать или показывать изображение, используя текст в форме. Мне нравится функциональность, и я хотел бы применить ее к нашему списку сотрудников. Однако то, как оно построено прямо сейчас, потребует от меня добавления одного макроса для каждого человека, а это не является устойчивым в долгосрочной перспективе.
Есть ли способ переписать этот скрипт, чтобы он устанавливал имя изображения на основе имени сотрудника, расположенного в столбце A? Тогда было бы очень просто просто вставить изображения и назвать их именем сотрудника.
Я также вижу, что кнопка упоминается в коде. Так что это также должно быть написано более динамично. Могу ли я использовать обычный элемент управления форматом вместо формы? (Кнопка не должна изменять отображаемый текст, как в этом скрипте.)
Я действительно был бы признателен за вашу помощь здесь. Это выглядело бы очень гладко, и я думаю, что другие тоже хорошо использовали бы такой VBA.
Sub Macro1()
With ActiveSheet.Shapes("Rounded Rectangle 4").TextFrame2.TextRange.Characters
'Check if shape text is equal to "Hide"
If .Text = "Hide" Then
'Change shape text to "Show"
.Text = "Show"
'Hide shape
ActiveSheet.Shapes("Picture 1").Visible = False
'Continue here if shape is not equal to "Hide"
Else
'Change text to "Hide"
.Text = "Hide"
With ActiveSheet.Shapes("Rounded Rectangle 4")
'Move image named "Picture1" based to lower right corner of shape
ActiveSheet.Shapes("Picture 1").Left = .Left .Width
ActiveSheet.Shapes("Picture 1").Top = .Top .Height
'Show image
ActiveSheet.Shapes("Picture 1").Visible = True
End With
End If
End With
End Sub
Ссылка: https://www.get-digital-help.com/show-and-hide-a-picture-vba /
Комментарии:
1. Безусловно, неплохо сделать ваш метод более обобщенным и многоразовым. Я не очень понимаю, к чему именно вы пытаетесь это применить. «… и хотел бы применить его к нашему списку сотрудников» оставляет у меня много вопросов. У вас есть лист Excel с именами сотрудников и изображением для каждого из них? (20 сотрудников с 20 фотографиями?)
2. Спасибо за ваш вклад. У меня есть список имен и дополнительная информация о каждом человеке. Изображения прямо сейчас хранятся на отдельном диске. Я могу вставить их в любом случае, необходимые для работы этого скрипта.
3. но что здесь должно произойти? Как происходит скрытие / отображение изображения? Это что-то вроде того, что пользователь выбирает имя в столбце A, а затем должно отображаться соответствующее изображение, в то время как все остальные скрываются?
4. Итак, вам просто нужен скрипт, который переименовывает изображение, скажем, B1 с текстом в A1 .. изображение в B2 с текстом в A2 .. и т. Д.? — т. Е. Весь элемент hide / show скрипта не имеет значения?
5. Я добавил картинку, которая может это объяснить. Я хотел бы иметь возможность скрывать / показывать (или просто применять всплывающее окно, если это лучше), чтобы показывать изображение профиля каждого сотрудника.
Ответ №1:
Во-первых, я хотел бы сказать, что вам было бы намного лучше разработать что-то подобное в MS Access, а не в Excel. Существует множество руководств, показывающих, как создать именно это с помощью Access Forms. Это, безусловно, было бы намного проще в обслуживании.
При этом ваш вопрос касался выполнения этого в Excel, и я отвечу на это простым предложением по реализации. Просто имейте в виду, это связано с тем, что я бы назвал «грязным» обслуживанием.
Во-первых, у вас есть куча фигур, представляющих кнопки отображения / скрытия. Каждая из этих фигур должна иметь свое собственное уникальное имя (не важно, какое имя в данном случае), и каждая из них должна быть расположена внутри ячейки для строки, с которой они предназначены для работы (как показано на вашем примере фото).
Далее, имя фотографии каждого сотрудника должно совпадать с именем вашего сотрудника (значение в столбце A в вашем примере).
Наконец, вам нужно будет установить «Назначенный макрос» для каждой кнопки «Показать / скрыть» одним и тем же методом (я назвал мой Button_Click()
). Реализация этого метода выглядит следующим образом:
Sub Button_Click()
Dim clickedButton As Shape
Dim employeePhoto As Shape
Dim clickedButtonRow As Long
Dim employeeName As String
'// gets the row number in whcih the clicked button resides
Set clickedButton = ActiveSheet.Shapes(Application.Caller)
clickedButtonRow = clickedButton.TopLeftCell.Row
'// gets the employee name (column A in this case)
employeeName = ActiveSheet.Range("A" amp; clickedButtonRow).Value
Set employeePhoto = ActiveSheet.Shapes(employeeName)
With clickedButton
' //set the position of the employee photo
employeePhoto.Top = .Top .Height
employeePhoto.Left = .Left .Width
With .TextFrame.Characters
'// set the visibility of the associated employee picture based on the text state of the button
employeePhoto.Visible = .Text = "Show"
'// swap the label on the button
If ActiveSheet.Shapes(employeeName).Visible Then
.Text = "Hide"
Else
.Text = "Show"
End If
End With
End With
End Sub
Комментарии:
1. Вау! Большое спасибо! 🙂 Это решило мой вопрос. С вашей точки зрения это может показаться большим содержанием. Однако это решение позволяет человеку, не знакомому с VBA, просто обновлять этот документ новыми изображениями. Отлично!
Ответ №2:
При применении решения от ArcherBird я обнаружил необходимость добавить кнопку в заголовок, чтобы скрыть / показать все изображения. Это обеспечивает лучший пользовательский интерфейс.
Я добавил этот скрипт на лист (не в модуль) и подключил его к кнопке. В моем документе у меня есть логотип нашей компании в заголовке, и я всегда держал его видимым.
Я надеюсь, что кто-нибудь найдет эту настройку полезной! 🙂
Dim c As Boolean
Sub Button4_Click()
c = c Xor True
ActiveSheet.Pictures.Visible = c
ActiveSheet.Pictures("CompanyLogo").Visible = True
End Sub