Показывать / скрывать изображение профиля в каждой строке на основе имени сотрудника?

#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 /

Пример данных: Распечатайте экран из макета Excel

Комментарии:

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