(Excel VBA) Если значение ячейки равно "", то показать / скрыть изображения - PullRequest
5 голосов
/ 08 февраля 2012

Я работаю с электронной таблицей Excel, в которой при выборе значения в раскрывающемся списке появится всплывающее окно, а при выборе другого значения будет скрыто текущее изображение и отобразится изображение, относящееся к выбору. Я нашел несколько методов, которые просто слишком много времени, используя только лист и позиционирование изображения с помощью координат; это не совсем тот путь, по которому я хотел бы пойти. Я провел довольно небольшое исследование, прежде чем использовать StackOverflow, и пока что ничего не получалось. Ниже то, что я пытаюсь достичь. Я пытаюсь сохранить все изображения в электронной таблице, что добавляет еще один уровень сложности, но я считаю, что есть способ сделать это, потому что Excel назначает изображению номер при вставке EX. Изображение 9 .

Sub Main()
   If Range(G11).Value = "anything" Then

   Picture1 show

   Picture2 hide

   End If
End Sub

Любая помощь с благодарностью. Спасибо

Ответы [ 4 ]

5 голосов
/ 10 февраля 2012

Вместо того, чтобы скрывать / перемещать / уменьшать размер ненужного изображения, почему бы просто не удалить его?

Logic : Сохраните все ваши изображения на временном листе. Если когда-либо должно быть показано соответствующее изображение, возьмите его с временного листа и удалите предыдущее.

Вот пример.

Sub Sample()
    Select Case Range("G11").Value
        Case "Picture 1": ShowPicture ("Picture 1")
        Case "Picture 2": ShowPicture ("Picture 2")
        Case "Picture 3": ShowPicture ("Picture 3")
        Case "Picture 4": ShowPicture ("Picture 4")
    End Select
End Sub

Sub ShowPicture(picname As String)
    '~~> The reason why I am using OERN is because it is much simpler
    '~~> than looping all shapes and then deleting them. There could be
    '~~> charts, command buttons and other shapes. I will have to write
    '~~> extra validation code so that those shapes are not deleted.
    On Error Resume Next
    Sheets("Sheet1").Shapes("Picture 1").Delete
    Sheets("Sheet1").Shapes("Picture 2").Delete
    Sheets("Sheet1").Shapes("Picture 3").Delete
    Sheets("Sheet1").Shapes("Picture 4").Delete
    On Error GoTo 0

    Sheets("Temp").Shapes(picname).Copy

    '<~~ Alternative to the below line. You may re-position the image 
    '<~~ after you paste as per your requirement
    Sheets("Sheet1").Range("G15").Select 

    Sheets("Sheet1").Paste
End Sub

Снимок временного листа

enter image description here

2 голосов
/ 03 февраля 2017

Вот решение с использованием свойства Visible объекта.Я использовал это, чтобы показать картинку, основанную на значении в поле.Поле имело формулу, которая приводила к «хорошо» или «плохо».Если его значение было «хорошо», я хотел показать одну картину;для «плохо» должна показываться другая картинка;и они никогда не должны показываться одновременно.Поле должно было обновлять свое значение всякий раз, когда пользователь обновлял сводную таблицу, поэтому я поместил код в тот метод рабочего листа, где должны были появиться сводная таблица и рисунок.

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
'hide both pictures by loopng through all the shapes on the sheet
Dim s As Shape
For Each s In ActiveSheet.Shapes
'hide the shape if it is a picture, leave other shapes on the page visible.
If s.Type = msoPicture Then s.Visible = msoFalse
Next

Dim judgement As String
'The field whose value tells what picture to use is a one-cell named range called "judgement"
judgement = Range("judgement")

'you need to know which picture is which.
If judgement = "Good" Then ActiveSheet.Shapes("Picture 8").Visible = True
If judgement = "Bad" Then ActiveSheet.Shapes("Picture 1").Visible = True

End Sub
0 голосов
/ 08 февраля 2012

Может быть лучше просто переместить ваши картинки "за экран", особенно если они имеют разные размеры.

Sub Tester()
    ShowPicture "Picture 3"
End Sub

Sub ShowPicture(PicName As String)

    Dim s As Shape
    For Each s In ActiveSheet.Shapes
        With s
        .Top = IIf(.Name = PicName, 100, 100)
        .Left = IIf(.Name = PicName, 100, 1000)
        End With
    Next s

End Sub
0 голосов
/ 08 февраля 2012
Sub hidePicture(myImage)
    ActiveSheet.Shapes.Range(Array(myImage)).Select
    Selection.ShapeRange.Height = 0
    Selection.ShapeRange.Width = 0
End Sub

Sub showPicture(myImage)
    ActiveSheet.Shapes.Range(Array(myImage)).Select
    Selection.ShapeRange.Height = 200
    Selection.ShapeRange.Width = 300
End Sub

Полезный совет: запишите макрос и посмотрите на код, который он генерирует!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...