На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Организуем VBA-FAQ! Если у Вас есть предложения, выскажитесь здесь: Пишем FAQ, интересно Ваше мнение
Популярные разделы FAQ:    user posted image Общие вопросы    user posted image Особенности VBA-кода    user posted image Оптимизация VBA-кода    user posted image Полезные ссылки

1. Старайтесь при создании темы указывать в заголовке или теле сообщения название офисного приложения и (желательно при работе с Office 95/97/2000) его версию. Это значительно сократит количество промежуточных вопросов.
2. Формулируйте вопросы как можно конкретнее, вспоминая (хотя бы иногда) о правилах ВЕЛИКОГО И МОГУЧЕГО РУССКОГО ЯЗЫКА, и не забывая, что краткость - сестра таланта.
3. Не забывайте использовать теги [сode=vba] ...текст программы... [/code] для выделения текста программы подсветкой!
4. Темы с просьбой выполнить какую-либо работу полностью за автора здесь не обсуждаются и переносятся в раздел ПОМОЩЬ СТУДЕНТАМ.
Модераторы: Old Bat, MIF
  
> Рисование в excel прямоугольника , на основании значений в ячейках
    Хэллоу!
    Сформировал табличку с данными по размерам\стоимости листового текстолита, дальше считаю стоимость изделий(плат, вообще то, но вот решил ради интереса посчитать и коробку, собранную из него же - параллелепипедом ботаны обзывают этот трехмерный прямоугольник)...
    И всё прекрасно считается, но не хватает визуализации! - Вроде не в каменном же веке живём, автоматизация + визуализации, все дела... :rolleyes:

    Вставка, фигуры, прямоугольник - получилось вставить!
    Добавить функцию изменения размеров прямоугольника - получилось:
    ExpandedWrap disabled
      Sub Прямоугольник1()
      Set s = ActiveSheet.Shapes("Прямоугольник 1")
          s.DrawingObject.Caption = Range("A5") 'текст в прямоугольнике
          s.Width = Range("B5").Value 'ширина
          s.Height = Range("C5").Value 'высота
      End Sub


    Добавить авто-применение размеров, при изменении значений в ячейке - получилось (пр.кн.мышки по вкладке "Лист2", "исходный текст"):
    ExpandedWrap disabled
      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Application.Run "Прямоугольник1"
      End Sub

    И всё бы хорошо, но продолжать в том же духе, рисуя параллелепипед из прямоугольников и линий - по моему несколько извратно, для 21го века... Неужели нет способа проще? - редактировать сразу параллелепипед, придав ему x,y,z, и может быть даже некое вращение, уклон? :rolleyes:
    Сообщение отредактировано: Руслан -
      О как!
      Короче, кто ищет, тот найдет!
      Попер я значит в свойства прямоугольника (правой кнопкой, "формат фигуры"), смотрю - есть же 3Д упоминания! А раз есть - значит и менять его можно в ВБ.
      Захожу в ВБ редактор, view\locals window - отображаем окно со свойствами обьектов.
      Ставлю БП(BreakPoint) на строчку выше обращения к прямоугольнику - кнопкой F9. Потом кнопкой F8 дохожу до обработки своего обьекта - s. Наблюдаю появление возможности посмотреть какие свойства можно менять у обьекта!! Ура!

      Прикреплённый файлПрикреплённый файлUntitled_1.jpg (149,06 Кбайт, скачиваний: 669)

      В итоге добавляю в обработчик:
      ExpandedWrap disabled
            s.Width = Range("B5").Value
            s.Height = Range("C5").Value
            s.ThreeD.BevelTopDepth = Range("B6").Value
            s.ThreeD.RotationX = Range("B9").Value
            s.ThreeD.RotationY = Range("B10").Value
            s.ThreeD.RotationZ = Range("B11").Value


      И вуаля! Всё работает, параллелепипед изобретён, и даже вращается при изменении ячеек B9=-30 B10=20 B11=0 :) :) :)
        Ну и коль уж такая пьянка, если кто рыть будет в эту же сторону, возможно ему так же как и мне, захочется прикрутить автоматическую и относительно постоянную динамику вращения обьекта, делается это как оказалось (после некоторых мучений) довольно просто:

        ExpandedWrap disabled
          'часть для не допущения повторного запуска функции:
          Static fRunning As Boolean 'прикрутим переменную, показывающую, что макрос уже запущен
          If fRunning Then
              fRunning = False 'если макрос уже запушеен - запомнить что не запущен,
              End 'и окночить его выполнение. - Да, вот такая интересная "логика" у ВБ оказалась... ))
          End If
             fRunning = True ' Укажем, что макрос запущен


        ExpandedWrap disabled
          'а это крутилка:  :)
              Do 'вечный цикл
                  For i = 0 To 360 Step 5
                      Application.Calculation = xlCalculationManual 'отключаем пересчет таблицы - для нормального отображения, блин...
                      s.ThreeD.RotationX = i
                      Application.Calculation = xlCalculationAutomatic 'для отображения графических изменений... 21й век, блин методы...
                      DoEvents ' Даем Excel команду обработать пользовательский ввод
                      Sleep 50
                  Next i
                  DoEvents ' Даем Excel команду обработать пользовательский ввод
              Loop

        Возможно встанет вопрос как прикрутить Sleep мс? Где нить сверху когда обьявить примерно такую фишку(в нэте нарыл, надеюсь помог вам не рыть всё, чо самому пришлось):
        ExpandedWrap disabled
          #If VBA7 Then
              Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
          #Else
              Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
          А какая связь между версией VBA и разрядностью системы?
            Есть предложение как правильней подключить Sleep?
              Цитата Руслан @
              Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems

              Тип LongPtr используется только для указателей и дескрипторов (хэндлов), а параметр dwMilliseconds в Sleep имеет тип DWORD (32 бит), поэтому объявлять его как LongPtr не нужно (хотя и можно - ошибки не будет).
              Сообщение отредактировано: leo -
                Цитата leo @
                Тип LongPtr используется только для указателей и дескрипторов

                Цитата
                LongPtr преобразуется в тип Long в 32-разрядных средах или в тип LongLong в 64-разрядных средах.
                (office 2013+) https://msdn.microsoft.com/ru-ru/library/of...e/gg251378.aspx

                В любом случае, к чему это? Есть вариант, как подключить sleep более совместимым с разными версиями excel, или что?
                Сообщение отредактировано: Руслан -
                  Цитата Руслан @
                  В любом случае, к чему это?

                  К тому, что в зависимости от разрядности среды изменяют свой размер только указатели и дескрипторы, а тип DWORD имеет размер 32 бита независимо от разрядности среды, поэтому объявлять его в VB нужно как As Long, а не LongPtr.

                  Цитата Руслан @
                  Есть предложение как правильней подключить Sleep?

                  Есть - в твоем "нарытом в нэте" объявлении заменить LongPtr на Long - и всё.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0350 ]   [ 18 queries used ]   [ Generated: 27.04.24, 22:28 GMT ]