Во вложении пример кода, где картинку в юзерформе можно двигать мышью. Параметры ImageLeft и ImageTop меняются во время движения этой картинки в каждый момент времени и перезаписываются в ячейку A1 и B1 (см строки кода №10 и №20), и в итоге в ячейках А1 и В1 остаются координаты только последнего положения картинки на юзерформе...
Как сделать так, чтобы все паарметры ImageLeft и ImageTop по мере перемещения картинки мышью записывались в столбец А и В не перезатирая друг -друга, ну или как занести в массив все координаты X и Y у картинки во время перемещения по юзерформе, а не только последние?
Заранее спасибо за ответ!:)
[vba]
Код
Option Explicit
'Положение диалогового окна UserForm Dim OldX As Double, OldY As Double
Private Sub Image1_MouseDown(ByVal Button As Integer, _ ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ' Начальное положение при нажатой кнопке OldX = X OldY = Y Image1.ZOrder 0 End Sub
Private Sub Image1_MouseMove(ByVal Button As Integer, _ ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ' Перемещение изображения Dim r As Integer If Button = 1 Then 'Debug.Print OldX, Image1.Left
r = r + 1 10 ActiveSheet.Cells(r, 1).Value = Image1.Left 20 ActiveSheet.Cells(r, 2).Value = Image1.Top End If End Sub
Private Sub CloseButton_Click() Unload Me End Sub
[/vba]
Добрый день, уважаемые коллеги.
Во вложении пример кода, где картинку в юзерформе можно двигать мышью. Параметры ImageLeft и ImageTop меняются во время движения этой картинки в каждый момент времени и перезаписываются в ячейку A1 и B1 (см строки кода №10 и №20), и в итоге в ячейках А1 и В1 остаются координаты только последнего положения картинки на юзерформе...
Как сделать так, чтобы все паарметры ImageLeft и ImageTop по мере перемещения картинки мышью записывались в столбец А и В не перезатирая друг -друга, ну или как занести в массив все координаты X и Y у картинки во время перемещения по юзерформе, а не только последние?
Заранее спасибо за ответ!:)
[vba]
Код
Option Explicit
'Положение диалогового окна UserForm Dim OldX As Double, OldY As Double
Private Sub Image1_MouseDown(ByVal Button As Integer, _ ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ' Начальное положение при нажатой кнопке OldX = X OldY = Y Image1.ZOrder 0 End Sub
Private Sub Image1_MouseMove(ByVal Button As Integer, _ ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ' Перемещение изображения Dim r As Integer If Button = 1 Then 'Debug.Print OldX, Image1.Left
Данный код заполняетс столбцы начиная со второй строки, из-за того, что даже при пустом листе, выражение [vba]
Код
r = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
[/vba] возвращает 2
Чтобы заставить заполнять столбцы с первой строки, пришлось извратиться
[vba]
Код
With ActiveSheet r = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 If IsEmpty(.Cells(r - 1, 1)) Then .Cells(r - 1, 1).Value = Image1.Left .Cells(r - 1, 2).Value = Image1.Top Else .Cells(r, 1).Value = Image1.Left .Cells(r, 2).Value = Image1.Top End If End With
[/vba]
Может есть более изящный способ заставить заполняться с первой строки?
Данный код заполняетс столбцы начиная со второй строки, из-за того, что даже при пустом листе, выражение [vba]
Код
r = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
[/vba] возвращает 2
Чтобы заставить заполнять столбцы с первой строки, пришлось извратиться
[vba]
Код
With ActiveSheet r = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 If IsEmpty(.Cells(r - 1, 1)) Then .Cells(r - 1, 1).Value = Image1.Left .Cells(r - 1, 2).Value = Image1.Top Else .Cells(r, 1).Value = Image1.Left .Cells(r, 2).Value = Image1.Top End If End With
[/vba]
Может есть более изящный способ заставить заполняться с первой строки?t330
With ActiveSheet With .Cells(.Rows.Count, 1).End(xlUp) With .Offset(-Not IsEmpty(.Value)) .Value = Image1.Left .Cells(1, 2) = Image1.Top End With End With End With
[/vba]
[vba]
Код
With ActiveSheet With .Cells(.Rows.Count, 1).End(xlUp) With .Offset(-Not IsEmpty(.Value)) .Value = Image1.Left .Cells(1, 2) = Image1.Top End With End With End With
Андрей, если б я не знал о чем речь, то, вот честно, ничего бы не понял Для таких, как я, которые по пунктам любят, как-то попробую разжевать
Для ActiveSheet Для первой снизу заполненной ячейки 1. .Value - ее значение 2. IsEmpty(п.1) - если пусто в п.1, то True, иначе - False 3. Not п.2 - наоборот п.2 - True превращаем в False, а False - в True * Дополнительно - в Excel при арифметических операциях ИСТИНА автоматически преобразуется к 1, а ЛОЖЬ к 0, в VBA все немного не так, там False также преобразуется в 0, а вот True преобразуется в минус единицу 4. Offset(-п.3) - в случае нуля в п.3 никуда не смещается, а в случае True в п.3 смещается на минус минус единицу, то есть на плюс единицу True в п.3 у нас тогда, когда False в п.2, когда не пусто первое снизу заполненная ячейка. То есть если ячейка заполнена, то уходим вниз на 1, если не заполнена (это может быть только в первой строке), то никуда не уходим, а работаем с этой ячейкой
Андрей, если б я не знал о чем речь, то, вот честно, ничего бы не понял Для таких, как я, которые по пунктам любят, как-то попробую разжевать
Для ActiveSheet Для первой снизу заполненной ячейки 1. .Value - ее значение 2. IsEmpty(п.1) - если пусто в п.1, то True, иначе - False 3. Not п.2 - наоборот п.2 - True превращаем в False, а False - в True * Дополнительно - в Excel при арифметических операциях ИСТИНА автоматически преобразуется к 1, а ЛОЖЬ к 0, в VBA все немного не так, там False также преобразуется в 0, а вот True преобразуется в минус единицу 4. Offset(-п.3) - в случае нуля в п.3 никуда не смещается, а в случае True в п.3 смещается на минус минус единицу, то есть на плюс единицу True в п.3 у нас тогда, когда False в п.2, когда не пусто первое снизу заполненная ячейка. То есть если ячейка заполнена, то уходим вниз на 1, если не заполнена (это может быть только в первой строке), то никуда не уходим, а работаем с этой ячейкой_Boroda_