Страницы: 1
RSS
Диаграмма на форме, Обновление диаграммы на форме
 
Добрый день.
Ребята, подскажите, пожалуйста, как правильно обновлять диаграмму на форме при изменении ячеек на листе.
Как поместить её туда я нашёл пример, вроде подходит, не знаю как программно закрыть активную форму и можно ли обновить диаграмму не закрывая форму.
Пример во вложении.
Заранее спасибо за возможный проявленный интерес.
 
Правой кнопкой мыши на листе "Данные" - Исходный текст. Вставляете код:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$C$3" Then
        Dim sh As Worksheet
        Set sh = ThisWorkbook.Worksheets("ïðÿìàÿ")
        UserForm1.LoadSelectedChart sh, "íå çíàþ, çà÷åì ýòî íàäî"
    End If
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо, идея местами ясна, но кракозябры скрыли от меня самое главное.
Если написать
Код
Set sh = ThisWorkbook.Worksheets("прямая")

то при изменении ячейки  $C$3 диаграмма обновляется только для UserForm1, а у меня этих форм 3. Т.е. надо вместо конкретного названия листа прописать значения ячейки  $C$2 и вместо userform1 тоже подставить соответствующую форму, но как не знаю.
При изменении же ячейки  $C$2, например на "куб", надо закрыть активную форму (т.е. UserForm1 или UserForm2, если они открыты) и открыть UserForm3.
 
Цитата
Gekan пишет:
кракозябры скрыли от меня самое главное.
"Главное" - это Ваша же строка:
Код
LoadSelectedChart sh, "не знаю, зачем это надо"

А вот от меня скрыт смысл наличия трёх форм - почему нельзя все диаграммы выводить на одну и ту же форму? Подобный подход наблюдается у новичков и с календарём, когда нужно при помощи него ввести начальную и конечные даты: рисуют две формы с календарями)))
P.S. Сам вначале с календарями тоже так поступал :)
 
Цитата
Юрий М пишет:
А вот от меня скрыт смысл наличия трёх форм - почему нельзя все диаграммы выводить на одну и ту же форму?
Я, конечно, новичок, но предвидел этот вопрос и в приложенном файле (т.е. для тех, кто заинтересуется и откроет файл) в P.S. написал ответ  ;)
 
Я сразу открыл редактор, не прочитав текст на листе))
Элементы управления ведь всегда можно расположить выше/ниже/слева/справа от самой диаграммы. Впрочем, решать это Вам... Но, надеюсь, мысль мою Вы уловили :)
 
Цитата
Юрий М пишет:
Но, надеюсь, мысль мою Вы уловили :)
Мысль я как раз уловил ещё до создания темы, поэтому и написал P.S. в файле.
Цитата
Юрий М пишет:
Элементы управления ведь всегда можно расположить выше/ниже/слева/справа от самой диаграммы. Впрочем,
решать это Вам
Эти элементы управления разные для каждого вида диаграммы.
Может быть не совсем понятно зачем, просто я хотел бы видеть, как реализовать именно то, о чём я изначально просил.
 
Цитата
Gekan пишет:
просто я хотел бы видеть, как реализовать именно то, о чём я изначально просил
А изначальный вопрос был: "можно ли обновить диаграмму не закрывая форму"
Разьве мое сообщение не дает ответ на этот вопрос?

Я показал принцип. Применить его ко всем формам - дело уже Ваше.
Другой вопрос - я не понял что Вы там закрывать собрались при переходе на другие листы и что в этом случае потом открывать.

В общем код в первый лист:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Call запуск
End Sub

измененный код в модуле:
Код
Sub запуск()
    Dim oFrm As UserForm
    For Each oFrm In UserForms
        Unload oFrm
    Next oFrm
    Select Case [c2]
    Case "прямая": UserForm1.Show 0
    Case "квадрат": UserForm2.Show 0
    Case "куб": UserForm3.Show 0
    End Select
End Sub

чтобы закрывалась форма при активации других листов, в каждом листе:
Код
Private Sub Worksheet_Activate()
    Call запуск
End Sub


И на всякий случай файл с частью решения.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, спасибо, принцип понятен. Остальное подстроил.
 
Чтобы форма закрывалась(и ничего другого не открывалось) на других листах можно так:
Код
Private Sub Worksheet_Activate()
    End
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, спасибо, возьму на заметку.
Но в моём случае "работаем" только с листом данные, соответственно нет необходимости при переходе на другие листы что-либо делать (они просто содержат расчёты).
Смысл в том, что если изменяется ячейка С3, то форму можно просто перерисовать (Вы показали это в своём первом ответе), а если изменяется ячейка С2, то закрываем перебором все формы (хотя открыта одна, но я так понял к ней нельзя обратиться) и просто открываем нужную.
Я подозреваю, что сделал коряво, но вот пример, как оно приблизительно должно было работать.
 
Цитата
Gekan пишет:
Эти элементы управления разные для каждого вида диаграммы.
Тогда можно на форме сделать MultiPage (для каждого вида диаграммы своя страничка с нужным набором контролов). Общие контролы - на самой форме.
 
Чтобы не городить кучу кода в каждой форме - я бы вынес в отдельную процедуру. В общем все во вложении.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Юрий М пишет:
Тогда можно на форме сделать MultiPage (для каждого вида диаграммы своя страничка с нужным набором контролов). Общие контролы - на самой форме.
А если делать PrintScreen, то эти странички на форме как бы не в тему. Да и придётся кода городить много.
Цитата
The_Prist пишет:
Чтобы не городить кучу кода в каждой форме - я бы вынес в отдельную процедуру. В общем все во вложении.
Да, так, конечно, код намного чище получается.
Я только не понял, зачем там Load oFrm (вроде и без этого работает), т.е. если форма открыта, то она обновляется с помощью
Код
LoadSelectedChart Sheets(имя_листа), имя_листа, oFrm

а вот если закрыть форму, то при изменении ячейки С3 она не появится (тогда как при изменении С2 появляется; в принципе можно по тому же принципу форму выгружать (unload) и опять show, но просто интересно, как её обновлять не выгружая, а если она закрыта, то перед этим соответственно загрузить, как-то так)
Можно изменить часть кода вот так:
Код
        Select Case [c2]
        Case "прямая": If UserForm1.Visible = False Then UserForm1.Show 0: Set oFrm = UserForm1
        Case "квадрат": If UserForm2.Visible = False Then UserForm2.Show 0: Set oFrm = UserForm2
        Case "куб": If UserForm3.Visible = False Then UserForm3.Show 0: Set oFrm = UserForm3
        End Select

Но тогда Excel "думает" и это мерцание заметно.
 
Ещё такой небольшой вопрос: как скопировать изображение активной формы в word.
Получается только скрин диапазона ячеек вот таким кодом.  
Код
Sub ворд()
Range("A1:B10").CopyPicture xlScreen
Set appWD = CreateObject("Word.Application")
appWD.Visible = True
appWD.Documents.Add
appWD.Activate
appWD.Selection.PasteSpecial
End Sub

Или с формой надо что-то типа:
Код
Application.SendKeys "%PRTSC"
Страницы: 1
Наверх