Excel のオートシェイプの線及び線矢印が微妙に曲がっているのをまっすぐに補正します。
アクティブシートに対して動作し、オートシェイプごとに確認メッセージが出て、対象を確認しながら補正できます。
検出するズレは 0.2cm にしています。(0.3cm あたりになると線が曲がってることが視認できるため)
0.2 cm以下の長さの線がある場合には誤動作するので気をつけてください。
Sub オートシェイプの線をまっすぐにする()
'------------------------------------------------------------------------------
'オートシェイプの線をまっすぐにする
'1.高さ→2.幅の順でチェックして、片方だけ検出
'------------------------------------------------------------------------------
Dim MsgRtn As Long 'メッセージの返り値
Dim lnglimitCM As Single '検出対象の長さ(cm)
Dim lngLimit As Long '検出対象の長さ
Dim s As Shape 'オートシェイプ
Dim blnHeight As Boolean '高さで検出
Dim blnWidth As Boolean '幅で検出
Dim strMsgHeight As String '高さで検出したときのメッセージ可変部
Dim strMsgWidth As String '幅で検出したときのメッセージ可変部
'cmをpointに変換。0.2cm以下のものだけチェック
lnglimitCM = 0.2
lngLimit = Application.CentimetersToPoints(lnglimitCM)
For Each s In ActiveSheet.Shapes
'線と線矢印に有効
If InStr(s.Name, "Straight Connector") > 0 Or InStr(s.Name, "Straight Arrow Connector") > 0 Then
'フラグ等初期化
blnHeight = False
blnWidth = False
strMsgHeight = ""
strMsgWidth = ""
'高さが検出対象の長さ以下
If 0 < s.Height And s.Height <= lngLimit Then
blnHeight = True
strMsgHeight = " →0★"
'幅が検出対象の長さ以下
ElseIf 0 < s.Width And s.Width <= lngLimit Then
blnWidth = True
strMsgWidth = " →0★"
End If
If blnWidth = True Or blnHeight = True Then
'次のメッセージ出すタイミングでオートシェイプ選択して、見えるようにウィンドウ位置合わせ
s.Select
If s.TopLeftCell.Row > 5 Then
ActiveWindow.ScrollRow = s.TopLeftCell.Row - 5
Else
ActiveWindow.ScrollRow = 1
End If
If s.TopLeftCell.Column > 5 Then
ActiveWindow.ScrollColumn = s.TopLeftCell.Column - 5
Else
ActiveWindow.ScrollColumn = 1
End If
'確認メッセージ
MsgRtn = MsgBox("選択した線をまっすぐにしますか?" & vbCrLf & vbCrLf & _
"【" & s.Name & "】" & vbCrLf & _
"高さ(ポイント): " & s.Height & strMsgHeight & vbLf & _
"幅 (ポイント): " & s.Width & strMsgWidth & vbLf & vbLf & _
"検出対象は " & lngLimit & " ポイント ( " & lnglimitCM & " cm) " & "以下です。" & vbLf, _
vbYesNoCancel + vbInformation, Title:="確認")
'Cancel選択時は中断
If MsgRtn = vbCancel Then
Exit Sub
'Yes選択時に高さまたは幅を0にする
ElseIf MsgRtn = vbYes Then
If blnHeight = True Then
s.Height = 0
ElseIf blnWidth = True Then
s.Width = 0
End If
End If
End If
End If
Next s
Set s = Nothing
End Sub
