2016-09-07 8 views
0

Я создал макрос в excel, чтобы вставить красную стрелку с помощью команды клавиатуры. Я выяснил исследование, как заставить его остановить выбор ячейки, которая была выбрана, когда я написал макрос, но я не могу понять, как заставить его вставлять стрелку рядом с моим текущим выбором каждый раз. В настоящее время она вставляет стрелку в том же месте, что и моя оригинальная строка, когда я записал макрос. Есть ли способ обойти это?Excel vba insert arrow macro

Вот код:

Sub Red_Arrow_Insert() 

Red_Arrow_Insert Macro 
Insert Red Arrow 

Keyboard Shortcut: Ctrl+Shift+A 

    ActiveCell.Select 
    ActiveSheet.Shapes.AddConnector(msoConnectorStraight, 264, 50.25, 353.25, 139.5 _ 
     ).Select 
     Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadOpen 
    With Selection.ShapeRange.Line 
     .Visible = msoTrue 
     .ForeColor.RGB = RGB(255, 0, 0) 
     .Transparency = 0 
    End With 
    With Selection.ShapeRange.Line 
     .Visible = msoTrue 
     .Weight = 1.5 
    End With 
    ActiveCell.Select 
End Sub 
+0

читайте это: https://msdn.microsoft.com/en-us/library/office/ff834664.aspx – teddy2

+0

Кроме того, я предлагаю прочитать [как избежать использования '.Select'] (https: // stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) Он делает это в одной и той же ячейке, потому что ваш 'ActiveCell' никогда не изменяется. – BruceWayne

+0

Извините, это может быть немного выше моего уровня, я не очень программист. Означает ли это, что моя просьба может быть выполнена, потому что все всегда должно быть определено относительно верхнего левого угла документа? –

ответ

1

Этот запрос может быть сделан с помощью Top и Left свойства ActiveCell и использовать эти числа, чтобы поместить курсор, так как Top и Left собственности измеряются против в верхнем левом углу документа и при условии, что стрелка всегда будет статической.

См переработан код ниже:

Sub Red_Arrow_Insert() 

'Red_Arrow_Insert Macro 
'Insert Red Arrow 
'Keyboard Shortcut: Ctrl Shift + A 

Dim l As Long, t As Long 

l = ActiveCell.Left 
t = ActiveCell.Top 

ActiveSheet.Shapes.AddConnector(msoConnectorStraight, t + 89.25, l + 89.25, l, t).Select 

With Selection 
    With .ShapeRange.Line 
     .EndArrowheadStyle = msoArrowheadOpen 
     .Visible = msoTrue 
     .ForeColor.RGB = RGB(255, 0, 0) 
     .Transparency = 0 
     .Weight = 1.5 
    End With 
End With 

ActiveCell.Select 'assumes you want to activate the last active cell. 

End Sub 

нотабене - Я использовал 89.25 как длину, так как это была разница в точках вашего исходного кода. При необходимости измените.

+0

Скотт - Спасибо, это почти то, что мне нужно. Есть ли что-то, что контролирует длину стрелки? Кажется, все в порядке, если я нахожусь в верхних левых 100 или около того ячеек сетки, но когда я спускаюсь, чтобы сказать S, 200, линия становится очень длинной. –

+1

@JimO - играйте с аргументами 't + 89.25, l + 89.25, l, t'. Это в основном начало и конец стрелки, поэтому вам нужно сделать математику, чтобы точно определить, как сделать ее необходимой. –

+0

Я думаю, вы хотели использовать 'ActiveSheet.Shapes.AddConnector (msoConnectorStraight, l - 89.25, t - 89.25, l, t). Выберите'. Ваша текущая строка имеет t и l в стартовых позициях, и у вас есть стрелка, указывающая от ячейки. (Но я не знаю, что OP хочет, когда ячейка находится рядом с верхней или левой стороной документа - 't - 89.25' или' l - 89.25' может стать отрицательным.) – YowE3K