Еще раз прошу всех извинить меня.Я в стартовом посте выразился неточно по форме и неверно по содержанию.
Не "разобрался", а добился нужного мне поведения программы - если положить n = 1000, то прямоугольник плавно едет к нужной границе ячейки [ компьютер старый и специально ( Sleep, ... ) замедлять не надо ];
Win XP SP2 Excel 2003, разрешение экрана 800х600.
После ответа
Jack Ferre, на чужом компьютере [
Win XP SP3 Excel 2007, разрешение экрана забыл посмотреть ] невнимательно посидел/проверил, послал ответ ... неверный!
Персональное извинение.
А вчера сидел долго и не добился желаемого, то есть
волшебная строкаActiveSheet.Shapes("theShape").DrawingObject.Left = Cells(1,2).Leftна моем компе работает, а на втором - нет.
@prontoМне кажется, что Ваши варианты полностью аналогичны указанному в загадке; тем не менее - проверил, результат ожидаемый.
Мелкие брызги.
Почему такой код? Прежде всего потому, что такой ...кодер.
Выяснилось немало любопытного:
1. Свойства столбца
Width и
ColumnWidthодно в пикселях, другое привязано к фонту [ а если их несколько !? ]
одно можно устанавливать, другое
Read Onlyу обоих тип
Single, но,
по-моему, реально происходит какое-то округление до каких-то знаков ... [ могу и обмануть по тупости ].
2. Поэтому [ псевдо
Single ] и не пользовался
IncrementLeft.
Думается, что в глубине лежат физика мониторов, метрики и прочие вещи из Windows API, толщина линий сетки и границ, ... - но я уже стар вспоминать / [ до ] изучать / разбираться ( все равно быстро забуду ) - мне бы на уровне чистого VBA и объектной модели.
Но главные вопросы:
- почему
не работает Фигура.Left = Ячейка.Left ?
- почему
по-разному работает Фигура.DrawingObject.Left = Ячейка.Left ?
остаются невыясненными и если кто-либо из настоящих гуру может помочь, то большая просьба - естественно, при наличии времени.
Особой любознательности и/или необходимости у меня нет, вся работа "для себя" и демонстрировать могу и в 2003-ей версии - но, вдруг, это представляет некий общий интерес.
Спасибо за внимание.
- Код: Выделить всё
Public Sub Try()
Dim dx As Single, aShape As Shape, j As Long
Dim Ls0 As Single, Lr0 As Single, R As Range, n As Long
' Columns("A:A").Width = 10
Set aShape = ActiveSheet.Shapes("theShape")
Set R = Cells(1, 2)
aShape.DrawingObject.Left = 10.123456789
Ls0 = aShape.DrawingObject.Left
' aShape.Left = 10.123456789
' Ls0 = aShape.Left
Lr0 = R.Left
n = 1000
dx = (Lr0 - Ls0) / n
Debug.Print
Debug.Print "Columns('A:A').Width ="; Columns("A:A").Width, vbNewLine; "Ls0 ="; Ls0, "Lr0 ="; Lr0, dx
Debug.Print "aShape.DrawingObject.Left ="; aShape.DrawingObject.Left, vbNewLine; "R.Left ="; R.Left
' Debug.Print "aShape.Left ="; aShape.Left, vbNewLine; "R.Left ="; R.Left
Debug.Print
For j = 1 To n
aShape.DrawingObject.Left = Ls0 + j * dx
' DoEvents
Debug.Print j, j * dx, Ls0 + j * dx - aShape.DrawingObject.Left, vbNewLine; String$(90, "-")
' aShape.Left = Ls0 + j * dx
' Debug.Print j, j * dx, Ls0 + j * dx - aShape.Left, vbNewLine; String$(90, "-")
Next j
Set R = Nothing
Set aShape = Nothing
End Sub
' Win XP SP3, Excel 2007
' Font Arial Cyr 10
' Columns('A:A').Width = 58,2
' Ls0 = 10,12339 Lr0 = 58,2 4,807662
' aShape.Left = 10,12339
' R.Left = 58,2
' 1 4,80766153335571 2,33650207519531E-05
'------------------------------------------------------------------------------------------
' 2 9,61532306671143 4,76837158203125E-05
'------------------------------------------------------------------------------------------
' 3 14,4229846000671 7,10487365722656E-05
'------------------------------------------------------------------------------------------
' 4 19,2306461334229 1,62124633789063E-05
'------------------------------------------------------------------------------------------
' 5 24,0383076667786 3,76701354980469E-05
'------------------------------------------------------------------------------------------
' 6 28,8459692001343 6,29425048828125E-05
'------------------------------------------------------------------------------------------
' 7 33,65363073349 8,10623168945313E-06
'------------------------------------------------------------------------------------------
' 8 38,4612922668457 3,33786010742188E-05
'------------------------------------------------------------------------------------------
' 9 43,2689538002014 5,48362731933594E-05
'------------------------------------------------------------------------------------------
' 10 48,0766153335571 0
'------------------------------------------------------------------------------------------
' Columns('A:A').Width = 58,2
' Ls0 = 10,12339 Lr0 = 58,2 4,807662
' aShape.DrawingObject.Left = 10,1233854293823
' R.Left = 58,2
'
' 1 4,80766153335571 2,33650207519531E-05
'------------------------------------------------------------------------------------------
' 2 9,61532306671143 4,76837158203125E-05
'------------------------------------------------------------------------------------------
' 3 14,4229846000671 7,10487365722656E-05
'------------------------------------------------------------------------------------------
' 4 19,2306461334229 1,62124633789063E-05
'------------------------------------------------------------------------------------------
' 5 24,0383076667786 3,76701354980469E-05
'------------------------------------------------------------------------------------------
' 6 28,8459692001343 6,29425048828125E-05
'------------------------------------------------------------------------------------------
' 7 33,65363073349 8,10623168945313E-06
'------------------------------------------------------------------------------------------
' 8 38,4612922668457 3,33786010742188E-05
'------------------------------------------------------------------------------------------
' 9 43,2689538002014 5,48362731933594E-05
'------------------------------------------------------------------------------------------
' 10 48,0766153335571 0
'------------------------------------------------------------------------------------------