Страницы: 1 2 3 След.
RSS
Автоматически показывать текущие размеры прямоугольника. Прошу помощи.
 
Мне необходимо сделать на листе прямоугольник с изменяемыми пользователем размерами.    
При этом текущие размеры в миллиметрах необходимо показывать внутри прямоугольника.    
В общем должен получиться приближенный аналог прямоугольника с проставленными размерами как в Visio.    
Прямоугольник должен свободно перемещаеться по экрану мышкой в обычном режиме (не в режиме конструктора форм!). Дополнительные кнопки на листе крайне нежелательны, а на панелях управления и пунктах меню - вообще не допустимы.  
Т.е. остаётся одно: использовать вызов процедур по событиям объекта.  
Т.к. из графических объектов листа обработку событий поддерживает только ДИАГРАММА, то вместо прямоугольника решил её и использовать.  
Вроде, практически всё заработало. НО!  
Я полхо умею работать с диаграммами, поэтому встал ряд проблем:  
После изменения размеров диаграммы они должны отображаться внутри поля.  
Не знаю, в какой из параметров диаграммы их вывести...?    
Хоть ChartArea и имеет все параметры для форматирования выводимого на неё текста, но сам текст вывести некуда - нет у ChartArea такого параметра.  
 
Пришлось выводить в ChartTitle, но у него нет параметров Height и Width, а есть только Top и Left поэтому не могу сделать высоту и ширину во всё поле ChartArea - остаются пустые поля справа и внизу.    
Да ещё и ChartTitle.AutoScaleFont как-то странно работает - не после каждого изменения размера подстраивает текст.  
 
При этом размеры нужны в миллиметрах! Как пересчитать - не знаю …  
 
Ну, и там ещё пара вопросиков есть чисто по теории в комментариях... :)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Может попробовать не через диаграмму а через Shape Object.
Редко но метко ...
 
Алекс, Вы можете вывести необходимое в ячейки? Если да, то нет проблем отобразить это в автофигуре.
 
Я же уже на днях спрашивал: "Какие из Shape Object кроме диаграмм поддерживают обработку событий7"  
Никто так и не откликнулся. Да я и сам поискал везде - ничего не нашёл...  
Если подскажете, как к обычному прямоугольнику прицепить обработчик событий, буду очень признателен.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Общая идея - для отслеживания событий использовать диаграмму, а надпись добавлять уже на shape. Не уверен, что пример будет работать в excel младше 2007, т.к. проверял именно в нем
 
Обращение по имени - Set oChart = Me.ChartObjects("Chart 7").Chart
 
.ChartArea.Top / .left - положение вехнего левого угла диаграммы на листе. Меняется при перемещении диаграммы
 
А у меня как примёрзло:  
ChartArea.Top = 3  
ChartArea.Left = 3  
Хотя ChartArea.Width и ChartArea.Height нормально отслеживаются...  
 
{quote}{login=}{date=01.07.2011 02:58}{thema=}{post}Обращение по имени - Set oChart = Me.ChartObjects("Chart 7").Chart{/post}{/quote}  
а почему же тогда Debug.Print Me.ChartObjects(1).Chart.Name  даёт "Лист1 Диагр. 7" ?  
И куда после этих русификаторов Офиса податься? Одни проблемы...  
 
В post_237602.xls у меня на 2003-ем не работает. Не удаётся ухватить диаграмму за узловые точки чтобы пожамкать... :)  
Но идея интересная пришла - попробовать сгруппировать диаграмму и прямоугольник над ней такого же размера. Тогда когда будешь изменять размер группы, автоматом изменятся оба размера и по событию диаграммы Resize можно будет косвенно отслеживать события прямоугольника. Буду думать. Спасибо за наводку.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Нет. Сгруппированная с прямоугольником диаграмма при попытке назначить Set oChart = Me.ChartObjects(1).Chart даёт ошибку 1004
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
post_237602.xls у меня на 2003 в части высоты/ширины сработал.
 
А если так:  
Private Sub oChart_Resize()  
Dim x As ChartObject  
Set x = Sheets("Лист1").ChartObjects("Chart 7")  
   With x.Chart  
   MsgBox x.Top & "  " & x.Left  
   End With  
Далее по тексту...
 
поковырял в 2003 ex - так должно работать
 
{quote}{login=}{date=01.07.2011 03:30}{thema=}{post}поковырял в 2003 ex - так должно работать{/post}{/quote}  
Неа - и ширина с высотой перестали :-)
 
Юрий, а за какой конец вы эту фигуру в post_237602.xls хватали чтобы изменить её размеры?  
У меня при наведении не неё курсора в обычном режиме (когда "толстый крестик") он превращается в стрелочку, а при клике - переход в редактирование текста надписи.  
А при режиме курсора "выбор объектов" ("стрелочка") точки для изменения хоть и появляются, но события не отрабатываются. Правда точки - белые кружки вместо стандартных чёрных квадратиков. Как у сгруппированной фигуры.  
post_237622.xls - тоже очень трудно зацепиться за точки размеров. Но уже всё-таки реально.  
А вот этого:  
Private Sub oChart_Resize()  
Dim x As ChartObject  
Set x = Sheets("Лист1").ChartObjects("Chart 7")  
With x.Chart  
MsgBox x.Top & " " & x.Left  
End With  
я не понял... Зачем мне MsgBox , когда параметры нормально считываются? Вот только размещать их приходится не на том объекте диаграммы, с которого они считываются...  
Да и на Chart.Top, Left, … у меня Ёксель ругается. Говорит, что нет такого свойства. Я уже пробовал - у Уокенбаха именно так и написано, а у меня не работает... Может, библиотеку какую-нибудь надо прицепить? …
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Вот.
 
Алекс, MsgBox толлько для того, чтобы показать, что Left и Top тоже отслеживаются. Если нужно поместите их в автофигуру и сгруппируйте с диаграммой.
 
Юрий, а в чём разница: As ChartObject или As Chart ?  
И почему нельзя брать ширину из oChart As Chart, но можно из x As ChartObject?  
Надо будет поковыряться и попробовать отлавливать события у объекта As ChartObject …  
Но это-то ладно, а вот как выводить без полей?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Попробовал - у объекта ChartObject нет событий, зато всё в порядке с размерами, а у Chart - есть события, но глючат размеры...  
А всё-таки: как пересчитать единицы размера фигуры в миллиметры?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=01.07.2011 04:03}{thema=}{post}Попробовал - у объекта ChartObject нет событий, зато всё в порядке с размерами{/post}{/quote}  
Ну вот, а то Вы капризничали - зачем MsgBox :-) В единицы размера не вникал.
 
{quote}{login=Юрий М}{date=01.07.2011 03:32}{thema=Re: }{post}{quote}{login=}{date=01.07.2011 03:30}{thema=}{post}поковырял в 2003 ex - так должно работать{/post}{/quote}  
Неа - и ширина с высотой перестали :-){/post}{/quote}  
 
не перестали - возможно надо нажать кнопочку на листе
 
Ага :-) После кнопки ширина/высота на объекте меняется. Позиция в ячейках нет.
 
а я в ячейки и не вставлял...
 
А где тогда позицию смотреть? Алекс ведь именно это сейчас ищет :-)
 
{quote}{login=Юрий М}{date=01.07.2011 04:39}{thema=}{post}А где тогда позицию смотреть? Алекс ведь именно это сейчас ищет :-){/post}{/quote}  
 
Тогда я уже запутался - а позицию чего ищем-то? И куда она должна записываться?
 
Алекс хитрый - сначала спрашивал про размеры, а потом появились ещё и ChartArea.Top и ChartArea.Left :-) Нужно ему, зачем-то...
 
А в мм приблизительно можно так перевести:  
sText = "Ширина = " & .ChartArea.Width * (25.4 / 72) & vbLf & "Высота = " & .ChartArea.Height * (25.4 / 72)
 
Positioning VBA user forms using pixels  
VBA user forms use points to position themselves. Most of the Win32 APIs deal with pixels. An inch has 72 points. The following code snippet converts from pixels to points. Another code snippet shows how to position user forms using this conversion function. We would position a user form on the right-most edge of the screen.  
 
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long  
Private Declare Function ReleaseDC Lib "user32" ( _  
   ByVal hWnd As Long, _  
   ByVal hDC As Long) As Long  
Private Declare Function GetDeviceCaps Lib "gdi32" ( _  
   ByVal hDC As Long, _  
   ByVal nIndex As Long) As Long  
 
Const LOGPIXELSX = 88  
Const LOGPIXELSY = 90  
Const TWIPSPERINCH = 1440  
 
Private Declare Function GetSystemMetrics Lib "user32" ( _  
   ByVal nIndex As Long) As Long  
 
Private Const SM_CXFULLSCREEN = 16  
Private Const SM_CYFULLSCREEN = 17  
 
Sub ConvertPixelsToPoints(ByRef X As Single, ByRef Y As Single)  
   Dim hDC As Long  
   Dim RetVal As Long  
   Dim XPixelsPerInch As Long  
   Dim YPixelsPerInch As Long  
 
   hDC = GetDC(0)  
   XPixelsPerInch = GetDeviceCaps(hDC, LOGPIXELSX)  
   YPixelsPerInch = GetDeviceCaps(hDC, LOGPIXELSY)  
   RetVal = ReleaseDC(0, hDC)  
   X = X * TWIPSPERINCH / 20 / XPixelsPerInch  
   Y = Y * TWIPSPERINCH / 20 / YPixelsPerInch  
End Sub  
 
Sub Test()  
   Dim Wt As Single  
   Dim Ht As Single  
 
   Wt = GetSystemMetrics(SM_CXFULLSCREEN)  
   Ht = GetSystemMetrics(SM_CYFULLSCREEN)  
   With TestUserForm  
       ConvertPixelsToPoints Wt, Ht  
       .Left = Wt - .Width  
       .Show vbModeless  
   End With  
End Sub
 
' как обратиться к объекту не по индексу, а по имени? Как узнать это имя?  
  'Debug.Print Me.ChartObjects(1).Chart.Name     ' даёт "Лист1 Диагр. 7", но при обращении по такому имени:  
  ' Set oChart = Me.ChartObjects("Лист1 Диагр. 7").Chart ' даёт ошибку  
 
 
Попробуй ActiveChart.Parent.Name
 
Вместо    
Set oChart = Me.ChartObjects(1).Chart  
используй  
Set oChart = ActiveChart  
   
при условии что других диаграмм на листе нет.
 
Алексей, зачем ты создаешь и удаляешь Shape Textbox. Его можно жестко привязать к Chart, а размеры и позицирование считать по размерам ChartArea.    
 
Если не секрет, зачем такая приблуда идею уловить не могу.
Страницы: 1 2 3 След.
Читают тему
Наверх