Изменить размер изображения

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Sadikov
Сообщения: 6
Зарегистрирован: 06 июн 2015, 07:45
Откуда: р.Саха

06 июн 2015, 08:45

Подскажите пожалуйста, как сделать масштабируемым элемент Image внутри Userfom при изменении размеров формы?
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

06 июн 2015, 09:24

Как изменяются размеры UserForm ?
Sadikov
Сообщения: 6
Зарегистрирован: 06 июн 2015, 07:45
Откуда: р.Саха

06 июн 2015, 09:32

pashulka писал(а):Как изменяются размеры UserForm ?
Форма меняет размеры при помощи мыши простым растягиванием. Код здесь на форуме брал
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

06 июн 2015, 09:55

Тогда можно попробовать такой подход :

Код: Выделить всё

Private oldHeight!, oldWidth!

Private Sub UserForm_Initialize()
    oldHeight = Me.Height: oldWidth = Me.Width
End Sub

Private Sub UserForm_Resize()
    With Me.Image1
         .Height = .Height * (Me.Height / oldHeight)
         .Width = .Width * (Me.Width / oldWidth)
    End With
    oldHeight = Me.Height: oldWidth = Me.Width 'Or UserForm_Initialize
End Sub
При ответе не нужно цитировать предыдущее сообщение.
Sadikov
Сообщения: 6
Зарегистрирован: 06 июн 2015, 07:45
Откуда: р.Саха

06 июн 2015, 10:17

Да , все сработало волшебным образом!!! Правда появилась другая проблема - Увеличивающееся изображение начинает перекрывать находящиеся на форме объекты Кнопка. им бы задать некую привязку.....
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

06 июн 2015, 11:12

Тогда, или перебирать все элементы управления и менять их размеры :

Код: Выделить всё

Private oldHeight!, oldWidth!

Private Sub UserForm_Initialize()
    oldHeight = Me.Height: oldWidth = Me.Width
End Sub

Private Sub UserForm_Resize()
    Dim iControl As MSForms.Control, percHeight!, percWidth!

    percHeight = Me.Height / oldHeight
    percWidth = Me.Width / oldWidth

    For Each iControl In Me.Controls
        With iControl
             'Есть также метод .Move
             .Top = .Top * percHeight
             .Left = .Left * percWidth
             .Height = .Height * percHeight
             .Width = .Width * percWidth
        End With
    Next

    oldHeight = Me.Height: oldWidth = Me.Width 'Or UserForm_Initialize
End Sub
Или же использовать свойство .Zoom. В последнем случае, необходимо учесть, что ширина и высота формы могут меняться непропорциально, например, percHeight = 105 , а percWidth = 150 (в примере я просто выбрал минимум, но это не является обязательным условием)

Код: Выделить всё

Private oldHeight!, oldWidth!

Private Sub UserForm_Initialize()
    oldHeight = Me.Height: oldWidth = Me.Width
End Sub

Private Sub UserForm_Resize()
    Dim percHeight%, percWidth%
    
    percHeight = (Me.Height / oldHeight) * 100
    percWidth = (Me.Width / oldWidth) * 100
    
    Me.Zoom = Application.Min(percHeight, percWidth, 400)
    'В окончательном варианте необходимо учесть, что
    'масштаб должен быть в пределах от 10 до 400
End Sub
Sadikov
Сообщения: 6
Зарегистрирован: 06 июн 2015, 07:45
Откуда: р.Саха

06 июн 2015, 12:30

Уважаемый Мастер pashulka! Это исчерпывающий ответ! Первый способ мне больше глянулся! Не нашел я по форуму как поднимать репутацию, СПАСИБО! Еще есть вопрос, но не знаю, можно ли в этой теме или новую создавать? Суть вопроса как с помощью кнопочного циферблата в данной UserForm осуществить ввод числа в активную ячейку Excel ???
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

06 июн 2015, 12:56

Мы с гуглом, что называется, "теряемся в догадках" касательно того, что есть кнопочный циферблат, применительно к UserForm ... но если абстрагироваться от этого термина и предположить, что в момент выполнения макроса, активная ячейка наличествует, то :

Код: Выделить всё

ActiveCell = 123 'ActiveCell.Value = 123
Sadikov
Сообщения: 6
Зарегистрирован: 06 июн 2015, 07:45
Откуда: р.Саха

06 июн 2015, 13:08

Все проще, имеется 10 кнопок, как в телефоне и с их помощью в ячейку набирается число!
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

06 июн 2015, 13:36

Такая версия имелась в разработке, но было маловато доказательств … а если серьёзно, то при определённой ситуации, можно даже так :

Код: Выделить всё

Private Sub CommandButton0_Click() 'Цифра 0
    ActiveCell = ActiveCell & 0
End Sub

Private Sub CommandButton1_Click() 'Цифра 1
    ActiveCell = ActiveCell & 1
End Sub

и т.д.
...
В идеале, конечно же, используя событие UserForm_Initialize, активную ячейку имеет смысл почистить от мусора, а также, установить соответствующий формат, например, числовой или общий (но не текстовый)

P.S. Если же создавать десять событий (для каждой кнопки) не хочется, то здесь можно найти примеры создания массивов элементов, автором которых является Дмит
Ответить