Перемещение изображений между ячейками в VBA - PullRequest
8 голосов
/ 15 декабря 2009

У меня есть изображение в ячейке (3,1) и я хочу переместить изображение в ячейку (1,1).

У меня есть этот код:

ActiveSheet.Cells(1, 1).Value = ActiveSheet.Cells(3, 1).Value
ActiveSheet.Cells(3, 1).Value = ""

Однако, похоже, что значение ячейки пустое для ячеек, содержащих изображения, поэтому изображение не перемещается и изображение в ячейке (3,1) не удаляется. Ничего не произошло, когда я запустил этот конкретный бит кода.

Любая помощь очень ценится.

Спасибо.

Ответы [ 2 ]

7 голосов
/ 15 декабря 2009

Часть проблемы с вашим кодом состоит в том, что вы рассматриваете изображение как значение ячейки. Однако, хотя изображение может показаться «внутри» ячейки, на самом деле это не значение ячейки.

Чтобы переместить изображение, вы можете сделать это относительно (используя Shape.IncrementLeft или Shape.IncrementRight) или вы можете сделать это абсолютно (установив значения Shape.Left и Shape.Top).

В приведенном ниже примере я демонстрирую, как вы можете переместить фигуру в новое абсолютное положение с сохранением или без сохранения исходного отступа от исходной ячейки (если вы не сохраняете исходный отступ, это так же просто, как установить Top и Left значения Shape должны быть равными значениям цели Range).

Эта процедура принимает имя фигуры (вы можете найти имя фигуры несколькими способами; я сделал это, записав макрос, а затем щелкнув мышью по фигуре и переместив ее, чтобы увидеть сгенерированный код), целевой адрес (например, "A1" и (необязательно) логическое значение, указывающее, хотите ли вы сохранить исходное смещение отступа.

Sub ShapeMove(strShapeName As String, _
    strTargetAddress As String, _
    Optional blnIndent As Boolean = True)
Dim ws As Worksheet
Dim shp As Shape
Dim dblCurrentPosLeft As Double
Dim dblCurrentPosTop As Double
Dim rngCurrentCell As Range
Dim dblCurrentCellTop As Double
Dim dblCurrentCellLeft As Double
Dim dblIndentLeft As Double
Dim dblIndentTop As Double
Dim rngTargetCell As Range
Dim dblTargetCellTop As Double
Dim dblTargetCellLeft As Double
Dim dblNewPosTop As Double
Dim dblNewPosLeft As Double

'Set ws to be the ActiveSheet, though this can really be any sheet      '
Set ws = ActiveSheet

'Set the shp variable as the shape with the specified shape name  '
Set shp = ws.Shapes(strShapeName)

'Get the current position of the image on the worksheet                 '
dblCurrentPosLeft = shp.Left
dblCurrentPosTop = shp.Top

'Get the current cell range of the image                                '
Set rngCurrentCell = ws.Range(shp.TopLeftCell.Address)

'Get the absolute position of the current cell                          '
dblCurrentCellLeft = rngCurrentCell.Left
dblCurrentCellTop = rngCurrentCell.Top

'Establish the current offset of the image in relation to the top left cell'
dblIndentLeft = dblCurrentPosLeft - dblCurrentCellLeft
dblIndentTop = dblCurrentPosTop - dblCurrentCellTop

'Set the rngTargetCell object to be the address specified in the paramater '
Set rngTargetCell = ws.Range(strTargetAddress)

'Get the absolute position of the target cell       '
dblTargetCellLeft = rngTargetCell.Left
dblTargetCellTop = rngTargetCell.Top

'Establish the coordinates of the new position. Only indent if the boolean '
' parameter passed in is true. '
' NB: The indent can get off if your indentation is greater than the length '
' or width of the cell '
If blnIndent Then
    dblNewPosLeft = dblTargetCellLeft + dblIndentLeft
    dblNewPosTop = dblTargetCellTop + dblIndentTop
Else
    dblNewPosLeft = dblTargetCellLeft
    dblNewPosTop = dblTargetCellTop
End If

'Move the shape to its new position '
shp.Top = dblNewPosTop
shp.Left = dblNewPosLeft

End Sub

ПРИМЕЧАНИЕ. Я написал код очень функционально. Если вы хотите «очистить» этот код, лучше всего поместить функциональность в объект. Надеюсь, это поможет читателю понять, как формы работают в Excel в любом случае.

3 голосов
/ 15 декабря 2009

Быстрый и грязный способ:

Public Sub Example()
    MoveShape ActiveSheet.Shapes("Picture 1"), Range("A1")
End Sub

Private Sub MoveShape(ByVal shp As Excel.Shape, ByVal target As Excel.Range)
    shp.IncrementLeft -(shp.TopLeftCell.Left - target.Left)
    shp.IncrementTop -(shp.TopLeftCell.Top - target.Top)
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...