Excelノート 17-2 図形

HOME  検索  索引  もくじ  関数目次  前ページへ  次ページへ

タイトル欄のアドレスは、エクセルファンクラブの該当する頁へのリンク先です。
詳しい事は、こちらの
お願いをご覧になってください。

21 スケジュール表(バーチャート、ガントチャート)を作成するには?
22 Sheet1のA列に入れた数字の分だけ、Sheet2のセルを塗りつぶすには?
23 図形のインデックス番号を取得するには?
24 指定した名前のオートシェイプが有るか無いかを判断するには?
25 ダブルクリックで、セル内にオートシェイプの○を描いたり消したりするには?
26 正弦線(SINカーブ)を描くには
27 セルの値が変わったら図形を移動させ、図形が移動したらセルの値を変更するには?(図形の位置とセルの値の連動)
28 選択範囲に、縦横比率そのままの図形をできるだけ大きく挿入するには?
29 角度を指定して四角形を描画するには?
30 選択範囲のセル一つ一つに、画像をちょうどの大きさで表示するには
31 図形をある一点を中心として角度を少しずつずらしていって連続の図形をつくるには?
32 複数の図形をピッタリくっつけて並べるには
33 3つの図形の真ん中を、他の図形にピッタリくっ付けるには
34 任意の複数の画像を他シートの任意のセルにぴったり貼付けて印刷するには?
35 図形の場所・縦横のサイズを、ミリで指定して描くには
36 選択範囲のセルの外周に、角丸のサイズを指定して角丸四角形を描くには
37 「0」が入力された行に接している図形を削除するには?
38 ダイアログボックスから画像を選択して、指定の範囲の大きさに挿入するには?
39 フォルダ内の画像を一括して全て挿入するには
40 虹のマクロ

21 スケジュール表(バーチャート、ガントチャート)を作成するには?
http://www.ae.wakwak.com/cgi-bin/sbox/~efc21/wwwlng.cgi?print+200104/01040423.txt
 「マウスでセルをドラックして図形(オートシェイプ)を描画するには?」 【VBAラウンジ】
http://www.ae.wakwak.com/~efc21/cgi-bin/wwwlng.cgi?print+200109/01090413.txt
 「過去ログへの質問なのですが(ガントチャート作成)」 【VBAラウンジ】
このようなシートで、B列に入れた数だけ、C列以降に線を引きます。
    A    B   C     D     E     F    G    H     I
1  開始日 日数 5月1日 5月2日 5月3日 5月4日 5月5日 5月6日 5月7日
2  5月1日  2  -------------
3  5月3日  4             ----------------------------
4  5月7日  1                                   ------
5  5月2日  5        ------------------------------------  
6  5月4日  3                   ---------------------

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim i As Integer, j As Long, futosa As Variant, LastCol As Integer, k As Integer
 Dim s As Shape, wLeft, wTop, wRight, wBottom
 Dim shapeLeft, shapeTop, shapeRight, shapeBottom
 Dim iroNO As String, iro As Variant
 On Error GoTo trap
 i = Target.Value
 j = Target.Row
 If Target.Column <> 2 Or j = 1 Or i <= 0 Or i > 31 Then
  Exit Sub
 End If
 With Application
  Do
   futosa = .InputBox("太さを指定してください?", "整数入力", 5, Type:=1)
   If VarType(futosa) = vbBoolean Then
    .EnableEvents = False
    .Undo
    .EnableEvents = True
    Exit Sub
   End If
   If futosa > 0 Then
    If futosa <= Target.Height Then
     Exit Do
     Else
     MsgBox "セルの縦幅よりも太いです。もう少し細い線を指定してください"
    End If
   End If
  Loop
   iroNO = " 8)黒 9)白 10)赤 11)黄緑" & vbCrLf & "12)青 13)黄 14)ピンク 15)水色"
  Do
   iro = .InputBox("線の色は、何番にしますか?" & vbCrLf & iroNO, "線の色指定", 8, Type:=1)
   If VarType(iro) = vbBoolean Then
    .EnableEvents = False
    .Undo
    .EnableEvents = True
    Exit Sub
   End If
   Select Case iro
    Case 8 To 15
     Exit Do
   End Select
   Loop
 End With
  With Rows(j)
  wTop = .Top
  wLeft = .Left
  wBottom = .Top + .Height
  wRight = .Left + .Width
 End With
   For Each s In ActiveSheet.Shapes
   shapeTop = s.Top
   shapeLeft = s.Left
   shapeBottom = s.Top + s.Height
   shapeRight = s.Left + s.Width
   If wTop <= shapeTop And wLeft <= shapeLeft And _
   wBottom >= shapeBottom And wRight >= shapeRight Then
   s.Delete
   End If
  Next
 LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
 For k = 3 To LastCol
  If Target.Offset(0, -1).Value = Cells(1, k) Then
   With ActiveSheet.Shapes.AddLine(Cells(j, k).Left, Target.Top + Target.Height / 2, _
       Cells(j, k + i).Left, Target.Top + Target.Height / 2).Line
       .Weight = futosa
    .ForeColor.SchemeColor = iro
   End With
   Exit For
  End If
 Next
 Target.Select
 trap:
End Sub

  このコードの使い方は、マクロの使い方(2)該当するシートのモジュールにあります。

新規ブックを開いて、作成しています。作成後のブックには、マクロを含んでおらず、
関数で制御しています。
 
Sub GanttChart()
  '変数宣言部
  Dim shtGantt As Worksheet 'ガントチャートシート
  Dim rngInitialDate As Range
'日付初期値
  Dim rngMonthArea As Range
'月表示エリア
  Dim rngDateArea As Range
'日付表示エリア
  Dim rngChartArea As Range
'チャートエリア
  Dim rngInputDate As Range
'開始日入力エリア
  Dim rngInputPeriod As Range
'期間入力エリア
  Dim shpScrollBar As Shape
'スクロールバー
  Dim rngControlDate As Range
'スクロールバー制御日付
  Dim rngControlArea As Range
'スクロールバー表示エリア
  '初期値設定部
  Set shtGantt = Workbooks.Add(1).Worksheets(1)
  With shtGantt
   Set rngInitialDate = .Range("E1")
   Set rngMonthArea = .Range("F2:AN2")
   Set rngDateArea = .Range("F3:AN3")
   Set rngChartArea = .Range("F4:AN19")
   Set rngInputDate = .Range("D4:D19")
   Set rngInputPeriod = .Range("E4:E19")
   Set rngControlDate = .Range("E20")
   Set rngControlArea = .Range("F20:AN20")
  End With
  '関数入力部
  rngInitialDate.Formula = "=30000 + " & rngControlDate.Address
  rngMonthArea.Formula = "=if(day(" & rngDateArea.Item(1).Address(False, False) _
   & ")=1,month(" & rngDateArea.Item(1).Address(False, False) & "),"""")"
  rngMonthArea.Item(1).Formula = "=month(" & rngDateArea.Item(1).Address & ")"
  rngDateArea.Formula = "=" & rngDateArea.Item(0).Address(False, False) & "+1"
  rngDateArea.Item(1).Formula = "=" & rngInitialDate.Address
  rngChartArea.Formula = "=if(and($D4<=F$3,$D4+$E4>F$3),1,"""")"
  rngChartArea.Formula = "=if(and(" & rngInputDate.Item(1).Address(False, True) _
                & "<=" & rngDateArea.Item(1).Address(True, False) & "," _
                & rngInputDate.Item(1).Address(False, True) _
                & "+" & rngInputPeriod.Item(1).Address(False, True) & ">" _
                & rngDateArea.Item(1).Address(True, False) & "),1,"""")"
  '書式設定部
  rngInputDate.Item(-1).Value = "開始日"
  rngInputPeriod.Item(-1).Value = "期間"
  rngInitialDate.NumberFormatLocal = "m/d"
  rngMonthArea.Font.Size = 9
  rngDateArea.Item(1).Select
  With rngDateArea
   .Font.Size = 8
   .NumberFormatLocal = "d"
   .FormatConditions.Add Type:=xlExpression, Formula1:= _
   "=WEEKDAY(" & rngDateArea.Item(1).Address(False, False) & ",2)>=6"
   .FormatConditions(1).Font.ColorIndex = 3
  End With
  With rngChartArea
   .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="1"
   .FormatConditions(1).Interior.ColorIndex = 4
   .EntireColumn.ColumnWidth = 1.75
  End With
  'スクロールバー設定部
  With rngControlArea
   ActiveSheet.ScrollBars.Add(.Left, .Top, .Width, .Height).Select '.Name = "ScrollBar"
  End With
  'Set shpScrollBar = shtGantt.Shapes("ScrollBar")
  With Selection
   .Min = 100
   .Max = 30000
   .SmallChange = 1
   .LargeChange = 30
   .LinkedCell = rngControlDate.Address
   .Value = rngControlDate.Value
   .Display3DShading = True
  End With
  rngControlDate.Value = 6982
  'デフォルト値入力部
  With rngInputDate
   .Item(1) = "4/11": .Item(2) = "4/15": .Item(3) = "4/22"
   .Item(4) = "": .Item(5) = "5/4": .Item(6) = "5/24"
   .Item(7) = "": .Item(8) = "4/11": .Item(9) = "4/20"
   .Item(10) = "": .Item(11) = "": .Item(12) = "4/11"
   .Item(13) = "4/12": .Item(14) = "4/15": .Item(15) = "4/28"
  End With
  With rngInputPeriod
   .Item(1) = "4": .Item(2) = "7": .Item(3) = "3"
   .Item(4) = "": .Item(5) = "20": .Item(6) = "8"
   .Item(7) = "": .Item(8) = "9": .Item(9) = "2"
   .Item(10) = "": .Item(11) = "": .Item(12) = "1"
   .Item(13) = "2": .Item(14) = "13": .Item(15) = "2"
  End With
  shtGantt.Range("A1").Select
 End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
22 Sheet1のA列に入れた数字の分だけ、Sheet2のセルを塗りつぶすには?
http://cgi.fuji.ne.jp/~fj2094/cgi-bin5/wwwlng.cgi?print+200105/01050018.txt
  「シートの連動について」 【その他ラウンジ】
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim i As Integer, j As Long, k As Integer
 If Target.Column <> 1 Then
  Exit Sub
 End If
 On Error Resume Next
 i = CInt(Target.Value)
 If Err.Number = 0 And i = Target.Value And i >= 0 And i <= 256 Then
  If i = 0 Then
   Worksheets("Sheet2").Rows(Target.Row).Interior.ColorIndex = xlNone
  Else
   j = Target.Row
   With Worksheets("Sheet2")
    .Rows(j).Interior.ColorIndex = xlNone
    With .Range(.Cells(j, 1), .Cells(j, i)).Interior
     If j Mod 2 = 0 Then
      .ColorIndex = 3
     Else
      .ColorIndex = 5
     End If
    End With
   End With
  End If
 Else
  MsgBox "入力値が不正です。", vbCritical
  With Application
   .EnableEvents = False
   .Undo
   .EnableEvents = True
  End With
 End If
End Sub

  このコードの使い方は、マクロの使い方(2)該当するシートのモジュールにあります。
23 図形のインデックス番号を取得するには?
http://www.keep-on.com/~excelyou/2000lng4/200010/00100233.txt
  「図形のインデックス番号を取得するには?」 【VBAラウンジ】
Sub test()
 If VarType(Selection) = vbObject Then
  MsgBox "選択したオブジェクトの" & vbCrLf & vbCrLf & _
  "種類は・・・ " & TypeName(Selection) & vbCrLf & vbCrLf & _
  "同種図形でのインデックスは・・・ " & Selection.Index & vbCrLf & vbCrLf & _
  "全図形でのインデックスは・・・ " & Selection.ShapeRange.ZOrderPosition
 Else
  MsgBox "オブジェクトが選択されていません", vbCritical
 End If
End Sub
  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
24 指定した名前のオートシェイプが有るか無いかを判断するには?
http://www.keep-on.com/~excelyou/2000lng4/200001/00010323.txt
  「シート上に指定した名前のオブジェクト(オートシェイプ)が有るか無いかを判断するには?」 
    【VBAラウンジ】
Sub Test()
  Dim shp As Shape
  For Each shp In Worksheets("Sheet1").Shapes
    If shp.Name = "四角形 1" Then
      MsgBox "発見!!"
    End If
  Next shp
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
25 ダブルクリックで、セル内にオートシェイプの○を描いたり消したりするには?
http://www.ae.wakwak.com/~efc21/cgi-bin/wwwlng.cgi?print+200105/01050231.txt
 「クリック(ダブルでもOK)すると○で囲んだ文字、
    もう一度クリックすると○で囲んでない文字にするには?」  【VBAラウンジ】
同一セルに「男性・女性」と入力されている場合
1:男性に○があれば女性に○を移動
2:女性に○があれば男性に○を移動
3:どちらにも○が無い場合は男性に○を描画
※セル内での文字位置が標準(横:標準、縦:下)以外の場合は OvalPt のコードを修正します。  
 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)
 Cancel = True
 Call Test
 End Sub

  このコードの使い方は、マクロの使い方(2)該当するシートのモジュールにあります。
 Sub Test()
  Dim vntFPt(1 To 4) As Variant, vntMPt(1 To 4) As Variant
  Dim strFON As String, strMON As String
  Call OvalPt("女性", vntFPt)
  Call OvalPt("男性", vntMPt)
  If vntFPt(1) = False Or vntMPt(1) = False Then Exit Sub
   strFON = OvalCheck(vntFPt)
   strMON = OvalCheck(vntMPt)
   With ActiveSheet
    If strFON <> "" And strMON = "" Then
     With .Shapes(strFON)
      .Top = vntMPt(2)
      .Left = vntMPt(1)
     End With
    ElseIf strFON = "" And strMON <> "" Then
     With .Shapes(strMON)
      .Top = vntFPt(2)
      .Left = vntFPt(1)
     End With
    ElseIf strFON = "" And strMON = "" Then
     Call OvalDraw(vntMPt)
    End If
   End With
 End Sub
 Sub OvalDraw(vntArr() As Variant)
  ActiveSheet.Shapes.AddShape(msoShapeOval, vntArr(1), _
  vntArr(2), vntArr(3), vntArr(4)).Fill.Visible = msoFalse
 End Sub
 Sub OvalPt(strChr As String, vntArr() As Variant)
  Dim intFP As Long
  Const sngCoeff As Single = 1.1
  With ActiveCell
   intFP = .Font.Size
   If InStr(.Value, strChr) > 0 Then
    vntArr(1) = Round075(.Left + intFP * (InStr(.Value, strChr) - 1))
    vntArr(2) = Round075(.Top + .Height - intFP * sngCoeff)
    vntArr(3) = Round075(intFP * Len(strChr) * sngCoeff)
    vntArr(4) = Round075(intFP)
   Else
    vntArr(1) = False
   End If
  End With
 End Sub
 Function Round075(vntNum As Variant)
  Round075 = Int(vntNum / 0.75) * 0.75 + 0.75
 End Function
 Function OvalCheck(vntArr() As Variant) As String
  Dim vntTmp As Variant
  With ActiveSheet
   For Each vntTmp In .Shapes
    With vntTmp
     If .Top = vntArr(2) Then
      If .Left = vntArr(1) Then
       If .Height = vntArr(4) Then
        If .Width = vntArr(3) Then OvalCheck = vntTmp.Name: Exit Function
        End If
      End If
     End If
    End With
   Next vntTmp
  End With
 End Function

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Dim CurShape As Shape
 Cancel = True
 For Each CurShape In Shapes
  If CurShape.TopLeftCell.Address = Target.Address Then
   CurShape.Delete
   Exit Sub
  End If
 Next
 With Target
  Shapes.AddShape(msoShapeOval, .Left, .Top, .Width, .Height).Fill.Visible = msoFalse
 End With
End Sub

  このコードの使い方は、マクロの使い方(2)該当するシートのモジュールにあります。
26 正弦線(SINカーブ)を描くには

赤線枠内のセルを選択し、実行します。

Sub 正弦線_SINカーブ()
 Dim TTT As Double, LLL As Double, WWW As Double, HHH As Double, XXX As Double, XX As Double
 Dim N As Integer, NNN As Integer, i As Integer, F As Single
 TTT = Selection.Top
 LLL = Selection.Left
 WWW = Selection.Width
 HHH = Selection.Height
 N = Val(InputBox("選択範囲にいくつの山を入れますか?", "整数入力", 5))
 If Not N > 0 Then Exit Sub
  F = Val(InputBox("線の太さを入力して下さい。", "太さ入力", 1.5))
 If Not F > 0 Then Exit Sub
 NNN = N * 2
 XX = WWW / (NNN * 2)
 With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, LLL, TTT + HHH / 2)
  XXX = XXX + XX
  .AddNodes msoSegmentCurve, msoEditingAuto, LLL + XXX, TTT + HHH
  For i = 1 To NNN Step 2
   If i = NNN - 1 Then
    XXX = XXX + XX * 2
    .AddNodes msoSegmentCurve, msoEditingAuto, LLL + XXX, TTT
    XXX = XXX + XX
    .AddNodes msoSegmentCurve, msoEditingAuto, LLL + XXX, TTT + HHH / 2
   Else
    XXX = XXX + XX * 2
    .AddNodes msoSegmentCurve, msoEditingAuto, LLL + XXX, TTT
    XXX = XXX + XX * 2
    .AddNodes msoSegmentCurve, msoEditingAuto, LLL + XXX, TTT + HHH
   End If
  Next
  .ConvertToShape.Line.Weight = F
 End With
End Sub

  このコードの使い方は、マクロの使い方(2)該当するシートのモジュールにあります。

27 セルの値が変わったら図形を移動させ、図形が移動したらセルの値を変更するには?
                                (図形の位置とセルの値の連動)

http://www.ae.wakwak.com/~efc21/cgi-bin/wwwlng.cgi?print+200107/01070265.txt
  「図形とセルの数値を連動させるには?」 【VBAラウンジ】
A1に左位置、B1に高さを入力・表示します。

Private PrevCell As String

Private Sub Worksheet_Activate()
 PrevCell = ActiveCell.Address
End Sub
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
 Select Case Target.Address
  Case "$A$1"
   If IsNumeric(Target.Value) Then
    ActiveSheet.DrawingObjects(1).Left = Target.Value
   End If
  Case "$B$1"
   If IsNumeric(Target.Value) Then
    ActiveSheet.DrawingObjects(1).Top = Target.Value
   End If
 End Select
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If (PrevCell <> "$A$1" And PrevCell <> "$B$1" And _
              Target.Address <> "$A$1" And _
              Target.Address <> "$B$1") Or _
              (PrevCell = "$A$1" And Target.Address <> "$A$1" And _
              Target.Address <> "$A$2" And _
              Target.Address <> "$B$1") Or _
              (PrevCell = "$B$1" And Target.Address <> "$A$1" And _
              Target.Address <> "$B$1" And _
              Target.Address <> "$B$2" And _
              Target.Address <> "$C$1") Then
  Range("B1") = Selection.Top
  Range("A1") = Selection.Left
 End If
 PrevCell = ActiveCell.Address
End Sub

  このコードの使い方は、マクロの使い方(2)該当するシートのモジュールにあります。

28 選択範囲に、縦横比率そのままの図形をできるだけ大きく挿入するには?
http://www.ae.wakwak.com/~efc21/cgi-bin/wwwlng.cgi?print+200107/01070526.txt
 「図を最適サイズにするには?」 【VBAラウンジ】
図形を挿入する範囲を選択してから実行します
Sub 絵挿入2_2()
 Dim Target As Range
 Dim a As Double, b As Double, aa As Double, bb As Double
 If TypeName(Selection) <> "Range" Then Exit Sub
 Set Target = Selection
 If Application.Dialogs(xlDialogInsertPicture).Show = False Then Exit Sub
 With Selection
  a = .Height
  b = .Width
  aa = Target.Height
  bb = Target.Width
  If a > b Then
   .Height = aa
   .Width = b * aa / a
   If .Width > bb Then
    .Height = a * bb / b
    .Width = bb
   End If
  Else
   .Height = a * bb / b
   .Width = bb
   If .Height > aa Then
    .Height = aa
    .Width = b * aa / a
   End If
  End If
  .Left = Target.Left
  .Top = Target.Top
 End With
 Set Target = Nothing
End Sub

  このコードの使い方は、マクロの使い方(2)該当するシートのモジュールにあります。
29 角度を指定して四角形を描画するには?
http://www.ae.wakwak.com/cgi-bin/sbox/~efc21/wwwlng.cgi?print+200107/01070450.txt
  「表の数値から自動で作図する(させる)には?」  【VBAラウンジ】

Sub Test()
 Dim intDNum As Integer
 intDNum = Application.InputBox(prompt:="描画するNoを入力してください。" & vbLf & _
    "0で全て描画します。", Default:=0, Type:=1)
 With Worksheets("Sheet1")
  If intDNum = 0 Then
   intDNum = 4
   Application.ScreenUpdating = False
   Do Until Cells(intDNum, 1).Value = ""
    Application.StatusBar = intDNum - 3 & "番目の図形を描画中"
    Call DrawingQua(.Cells(intDNum, 2).Value, .Cells(intDNum, 3).Value, _
    .Cells(intDNum, 4).Value, .Cells(intDNum, 5).Value, _
    .Cells(intDNum, 7).Left, .Cells(intDNum, 7).Top + .Cells(intDNum, 7).Height)
    intDNum = intDNum + 1
   Loop
   Application.StatusBar = False
   Application.ScreenUpdating = True
  Else
   intDNum = intDNum + 3
   Call DrawingQua(.Cells(intDNum, 2).Value, .Cells(intDNum, 3).Value, _
   .Cells(intDNum, 4).Value, .Cells(intDNum, 5).Value, _
   .Cells(intDNum, 7).Left, .Cells(intDNum, 7).Top + .Cells(intDNum, 7).Height)
  End If
 End With
End Sub

Sub DrawingQua(A_ABD, A_CBD, A_ACB, A_ACD, X, Y, Optional L_BC = 50)
 Dim A_BDC, A_BAC, A_ABC, A_BCD
'角度用
 Dim L_AB, L_BD '辺・補助線長用
 Dim vntXY(1 To 4, 1 To 2) As Variant
'座標用
 Dim strH(1 To 4) As String '名称用
 Dim vntNameArr(1 To 7) As Variant
'グループ化用
 Dim i As Integer 'ループ用カウンタ
 Const RadC As Variant = 3.14 / 180
'ラジアン
 '角の名称を配列へ
 strH(1) = "B": strH(2) = "C": strH(3) = "D": strH(4) = "A"
 '必要要素の計算(正弦定理?)
 A_BAC = (180 - A_ACB - (A_ABD + A_CBD))
 A_BDC = (180 - A_CBD - (A_ACD + A_ACB))
 A_ABC = (A_ABD + A_CBD)
 A_BCD = (A_ACD + A_ACB)
 L_AB = L_BC / Sin(A_BAC * RadC) * Sin(A_ACB * RadC)
 L_BD = L_BC / Sin(A_BDC * RadC) * Sin(A_BCD * RadC)
 '座標値を配列へ
 vntXY(1, 1) = X: vntXY(1, 2) = Y
'点B XY
 vntXY(2, 1) = X + L_BC: vntXY(2, 2) = Y
'点C XY
 vntXY(3, 1) = X + L_BD * Cos(A_CBD * RadC): vntXY(3, 2) = Y - L_BD * Sin(A_CBD * RadC)
'点D XY
 vntXY(4, 1) = X + L_AB * Cos(A_ABC * RadC): vntXY(4, 2) = Y - L_AB * Sin(A_ABC * RadC)
'点A XY
 
 '図形描画
 With Worksheets("Sheet1").Shapes
  '四角形本体描画
  With .BuildFreeform(msoEditingAuto, vntXY(1, 1), vntXY(1, 2))
'点B
   .AddNodes msoSegmentLine, msoEditingAuto, vntXY(2, 1), vntXY(2, 2)
'点C
   .AddNodes msoSegmentLine, msoEditingAuto, vntXY(3, 1), vntXY(3, 2)
'点D
   .AddNodes msoSegmentLine, msoEditingAuto, vntXY(4, 1), vntXY(4, 2)
'点A
   .AddNodes msoSegmentLine, msoEditingAuto, vntXY(1, 1), vntXY(1, 2)
'点B
   .ConvertToShape
  End With
  vntNameArr(1) = .Item(.Count).Name
 
  '対角線描画(上からBD・AC)
  .AddLine(vntXY(1, 1), vntXY(1, 2), vntXY(3, 1), vntXY(3, 2)).Line.Weight = 0.25
  vntNameArr(2) = .Item(.Count).Name
  .AddLine(vntXY(4, 1), vntXY(4, 2), vntXY(2, 1), vntXY(2, 2)).Line.Weight = 0.25
  vntNameArr(3) = .Item(.Count).Name

  '頂点名描画
  For i = 1 To 4
   With .AddLabel(msoTextOrientationHorizontal, vntXY(i, 1), vntXY(i, 2), 0, 0)
    With .TextFrame
     .Characters.Text = strH(i)
     .Characters.Font.Size = 6
     .AutoMargins = False
     .MarginBottom = 0
     .MarginTop = 0
     .MarginLeft = 0
     .MarginRight = 0
     .AutoSize = True
    End With
    If i > 2 Then .Top = .Top - .Height
     
 If i = 2 Or i = 3 Then
       .Left = .Left + 10
     Else
       .Left = .Left - 5
     End If
   End With
   vntNameArr(3 + i) = .Item(.Count).Name
  Next i
  
'描画した図形全てをグループ化
  .Range(vntNameArr).Group
 End With
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。

30 選択範囲のセル一つ一つに、画像をちょうどの大きさで表示するには
Sub miko_test1()
 Dim c As Range, cm As Range
 Application.ScreenUpdating = False
 For Each c In Selection
  Set cm = c.MergeArea
  If c.Address = cm.Item(1).Address Then
   If Application.Dialogs(xlDialogInsertPicture).Show = False Then Exit Sub
   With Selection
    .Left = cm.Left
    .Top = cm.Top
    .Height = cm.Height
    .Width = cm.Width
   End With
  End If
 Next
 Set cm = Nothing
 Application.ScreenUpdating = True
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
C:\My Documents\My Pictures\996401.gif の画像の名前は、自動記録等で確認してください。
 Sub miko_test2()
  Dim c As Range
  Dim cm As Range
  Application.ScreenUpdating = False
  For Each c In Selection
   Set cm = c.MergeArea
   If c.Address = cm.Item(1).Address Then
    With ActiveSheet.Pictures.Insert("C:\My Documents\My Pictures\gazou.gif")
     .Left = cm.Left
     .Top = cm.Top
     .Height = cm.Height
     .Width = cm.Width
    End With
   End If
  Next
  Set cm = Nothing
  Application.ScreenUpdating = True
 End Sub
  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
31 図形をある一点を中心として角度を少しずつずらしていって連続の図形をつくるには?
http://www.ae.wakwak.com/~efc21/cgi-bin/wwwlng.cgi?print+200108/01080461.txt
  「任意の図形を色を変えながら連続表示するには???」 【VBAラウンジ】
 
Excel97、2000、2002確認済み
Sub sample()
 Dim SP As Shape
 Dim i As Integer
 Dim j As Integer
 Dim SchemeColor As Integer
 Const RotStep As Integer = 4
 i = 1
 For SchemeColor = 7 To 21
  ThisWorkbook.Colors(SchemeColor) = RGB((255 \ 15) * i, 255 - (255 \ 15) * i, 255)
  i = i + 1
 Next
 i = 1
 For SchemeColor = 22 To 36
  ThisWorkbook.Colors(SchemeColor) = RGB(255, (255 \ 15) * i, 255 - (255 \ 15) * i)
  i = i + 1
 Next
 i = 1
 For SchemeColor = 37 To 50
  ThisWorkbook.Colors(SchemeColor) = RGB(255 - (255 \ 15) * i, 255, (255 \ 15) * i)
  i = i + 1
 Next
 Set SP = ActiveSheet.Shapes.AddShape(msoShapeIsoscelesTriangle, 200, 100, 300, 300)
 With SP
  .Fill.Visible = msoFalse
  .Fill.Transparency = 0#
  .Line.Weight = 0.75
  .Line.DashStyle = msoLineSolid
  .Line.Style = msoLineSingle
  .Line.Transparency = 0#
  .Line.Visible = msoTrue
  .Line.ForeColor.SchemeColor = 6
  .Select
 End With
 j = 7
 For i = 0 To 359 \ RotStep
  With SP.Duplicate
   .Left = SP.Left
   .Top = SP.Top
   .IncrementRotation (i * RotStep) Mod 360
   .Line.ForeColor.RGB = ThisWorkbook.Colors(j)
  End With
  DoEvents
  j = j + 1
  If j = 51 Then j = 7
 Next
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
Excel97、2000、2002確認済み
Sub Test()
  Dim i As Integer
  Const intA As Integer = 10 
'任意の回転角
    With ActiveSheet
      For i = 1 To Int(365 / intA) 
'ループ
   
 '二等辺三角形を描画
       With .Shapes.AddShape(msoShapeIsoscelesTriangle, _
                             .Range("D14").Left, .Range("D14").Top, 50, 50)
         .Rotation = i * intA
 '回転
         .Fill.ForeColor.SchemeColor = Int(Rnd * 53) + 1 
'背景色変更
       End With
      Next i
    End With
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
32 複数の図形をピッタリくっつけて並べるには

複数の図形を選択してから実行してください
Sub 複数の図形をピッタリくっつけて並べる()
 Dim obj As Object, i As Integer, j As Integer, WS As Worksheet
 Dim N() As String, L() As Single, W() As Single, aa As String
 Application.DisplayAlerts = False
'警告を非表示
 If TypeName(Selection) <> "DrawingObjects" Then Exit Sub
 '図形の数をカウント
 i = Selection.Count
 ReDim N(1 To i)
'変数の個数を設定
 ReDim L(1 To i)
 ReDim W(1 To i)
 Do
  aa = Application.InputBox(Prompt:="縦方向ですか? 横方向ですか?" _
              & Chr(10) & "縦方向:1" & Chr(10) & "横方向:2", Type:=1)
  If aa = False Then Exit Sub
  If aa = 1 Or aa = 2 Then Exit Do
  MsgBox "1、または2を入力してください"
 Loop
 '図形の名前、左位置、横幅を変数に格納
 i = 0
 For Each obj In Selection
  i = i + 1
  N(i) = obj.Name
  If aa = 1 Then
   L(i) = obj.Top
   W(i) = obj.Height
   ElseIf aa = 2 Then
   L(i) = obj.Left
   W(i) = obj.Width

  Else
   Exit Sub
  End If
 Next
 Set WS = ActiveSheet
 '一番左(グラフシート含む)のシートの前に新しいワークシートを1枚追加します。
 With ActiveWorkbook.Sheets.Add(Before:=Sheets(1))
  WS.Activate
  For j = 1 To i
   .Cells(j, 1) = j
   .Cells(j, 2) = N(j)
   .Cells(j, 3) = L(j)
   .Cells(j, 4) = W(j)
  Next
  .Columns("A:D").Sort Key1:=.Range("C1"), Order1:=xlAscending
  For j = 2 To i
   If aa = 1 Then
    WS.Shapes(.Cells(j, 2)).Top = _
    WS.Shapes(.Cells(j - 1, 2)).Top + .Cells(j - 1, 4)
   ElseIf aa = 2 Then
    WS.Shapes(.Cells(j, 2)).Left = _
    WS.Shapes(.Cells(j - 1, 2)).Left + .Cells(j - 1, 4)
   End If
  Next
  '挿入した一番左のシートを削除する
  .Delete
 End With
 If aa = 1 Then
  Selection.ShapeRange.Align msoAlignCenters, False
'横の配置をそろえる
 ElseIf aa = 2 Then

  Selection.ShapeRange.Align msoAlignMiddles, False '縦の配置をそろえる
 End If
 Application.DisplayAlerts = True
'警告を再表示
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
33 3つの図形の真ん中を、他の図形にピッタリくっ付けるには

3つの図形を選択してから実行してください
Sub 三個の図形の真ん中を他の図形にピッタリくっつける()
 Dim obj As Object, aa As String
 Dim i As Integer, N(3) As String, L(3) As Single, T(3) As Single
 If TypeName(Selection) <> "DrawingObjects" Then Exit Sub
 Do
  aa = Application.InputBox(Prompt:="縦方向ですか? 横方向ですか?" _
  & Chr(10) & "縦方向:1" & Chr(10) & "横方向:2", Type:=1)
  If aa = False Then Exit Sub
  If aa = 1 Or aa = 2 Then
   Exit Do
  End If
  MsgBox "1、または2を入力してください"
 Loop
 i = 0
 For Each obj In Selection
  i = i + 1
  Debug.Print i, obj.Name, obj.Left, obj.Top, obj.Width, obj.Height
  N(i) = obj.Name
  If aa = 1 Then
   L(i) = obj.Top
   T(i) = obj.Height
  ElseIf aa = 2 Then
   L(i) = obj.Left
   T(i) = obj.Width
  Else
   Exit Sub
  End If
 Next
 If aa = 1 Then                               
'縦方向にくっつける
  If L(1) < L(2) And L(2) < L(3) Then '1-2-3
   ActiveSheet.Shapes(N(2)).Top = L(1) + T(1)
   ActiveSheet.Shapes(N(2)).Height = L(3) - L(1) - T(1)
  ElseIf L(1) < L(3) And L(3) < L(2) Then '1-3-2
   ActiveSheet.Shapes(N(3)).Top = L(1) + T(1)
   ActiveSheet.Shapes(N(3)).Height = L(2) - L(1) - T(1)
  ElseIf L(2) < L(3) And L(3) < L(1) Then '2-3-1
   ActiveSheet.Shapes(N(3)).Top = L(2) + T(2)
   ActiveSheet.Shapes(N(3)).Height = L(1) - L(2) - T(2)
  ElseIf L(2) < L(1) And L(1) < L(3) Then '2-1-3
   ActiveSheet.Shapes(N(1)).Top = L(2) + T(2)
   ActiveSheet.Shapes(N(1)).Height = L(3) - L(2) - T(2)
  ElseIf L(3) < L(1) And L(1) < L(2) Then '3-1-2
   ActiveSheet.Shapes(N(1)).Top = L(3) + T(3)
   ActiveSheet.Shapes(N(1)).Height = L(2) - L(3) - T(3)
  ElseIf L(3) < L(2) And L(2) < L(1) Then '3-2-1
   ActiveSheet.Shapes(N(2)).Top = L(3) + T(3)
   ActiveSheet.Shapes(N(2)).Height = L(1) - L(3) - T(3)
  End If
  Selection.ShapeRange.Align msoAlignCenters, False
       '横の配置をそろえる
 ElseIf aa = 2 Then                             
'横方向にくっつける
  If L(1) < L(2) And L(2) < L(3) Then '1-2-3
   ActiveSheet.Shapes(N(2)).Left = L(1) + T(1)
   ActiveSheet.Shapes(N(2)).Width = L(3) - L(1) - T(1)
  ElseIf L(1) < L(3) And L(3) < L(2) Then '1-3-2
   ActiveSheet.Shapes(N(3)).Left = L(1) + T(1)
   ActiveSheet.Shapes(N(3)).Width = L(2) - L(1) - T(1)
  ElseIf L(2) < L(3) And L(3) < L(1) Then '2-3-1
   ActiveSheet.Shapes(N(3)).Left = L(2) + T(2)
   ActiveSheet.Shapes(N(3)).Width = L(1) - L(2) - T(2)
  ElseIf L(2) < L(1) And L(1) < L(3) Then '2-1-3
   ActiveSheet.Shapes(N(1)).Left = L(2) + T(2)
   ActiveSheet.Shapes(N(1)).Width = L(3) - L(2) - T(2)
  ElseIf L(3) < L(1) And L(1) < L(2) Then '3-1-2
   ActiveSheet.Shapes(N(1)).Left = L(3) + T(3)
   ActiveSheet.Shapes(N(1)).Width = L(2) - L(3) - T(3)
  ElseIf L(3) < L(2) And L(2) < L(1) Then '3-2-1
   ActiveSheet.Shapes(N(2)).Left = L(3) + T(3)
   ActiveSheet.Shapes(N(2)).Width = L(1) - L(3) - T(3)
  End If
  Selection.ShapeRange.Align msoAlignMiddles, False         
'縦の配置をそろえる
 End If
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
34 任意の複数の画像を他シートの任意のセルにぴったり貼付けて印刷するには?
http://www.ae.wakwak.com/~efc21/cgi-bin/wwwlng.cgi?print+200110/01100007.txt
 「任意の画像を取り出して印刷させるには」 【VBAラウンジ】
1.マクロの使い方(1)標準モジュールで、「右クリックメニュー追加」を実行します。
2.Sheet1の画像を右クリックし、「画像コピーあと2枚」を選択します。
3.続けてもう一枚右クリックし、「画像コピーあと1枚」を選択します。
4.右クリックメニューを元に戻すには、Alt+F8 で「右クリックメニューリセット」を実行します。

Public Count_G As Integer
Sub 右クリックメニュー追加()
 With Application.CommandBars("Pictures Context Menu").Controls.Add
  .Caption = "画像コピーあと2枚"
  .OnAction = "らくらく画像コピー"
 End With
 With Application.CommandBars("OLE Object").Controls.Add
  .Caption = "画像コピーあと2枚"
  .OnAction = "らくらく画像コピー"
 End With
 With Application.CommandBars("ActiveX Control").Controls.Add
  .Caption = "画像コピーあと2枚"
  .OnAction = "らくらく画像コピー"
 End With
End Sub
Sub 右クリックメニューリセット()
 Application.CommandBars("Pictures Context Menu").Reset
 Application.CommandBars("OLE Object").Reset
 Application.CommandBars("ActiveX Control").Reset
End Sub
Sub らくらく画像コピー()
 Dim Rng As Range, GW As Integer
 Dim GH As Integer, RW As Integer
 Dim RH As Integer, FileG As String
 Dim Comm As String, shp As Shape
 On Error GoTo skip
 If Count_G = 0 Then
  Set Rng = Sheets("Sheet2").Range("B4:B24")   
'1枚目のコピー先セル範囲をB4:B24に設定
 ElseIf Count_G = 1 Then
  Set Rng = Sheets("sheet2").Range("B30:B49")   
'2枚目コピー先セル範囲をB30:B49に設定
  ElseIf Count_G > 1 Then GoTo skip          
'1枚目の場合、skep のコードにジャンプ
 End If
 Selection.Copy
 Sheets("Sheet2").Activate
 DoEvents
 ActiveSheet.Paste
 RW = Rng.Width
 RH = Rng.Height
 GW = Selection.ShapeRange.Width
 GH = Selection.ShapeRange.Height
 Selection.ShapeRange.Top = Rng.Top
 Selection.ShapeRange.Left = Rng.Left
 Selection.ShapeRange.ScaleWidth (RW / GW), msoFalse, msoScaleFromTopLeft
 Selection.ShapeRange.ScaleHeight (RH / GH), msoFalse, msoScaleFromTopLeft
 DoEvents
 If Count_G = 0 Then
  ActiveWindow.ScrollRow = 1
  Comm = InputBox("注釈文を記入してください。もういっちょーいこか")
  Sheets("Sheet2").Range("B25") = Comm
  CommandBars("Pictures Context Menu").Controls("画像コピーあと2枚") _
                           .Caption = "画像コピーあと1枚"
  Sheets("Sheet1").Activate
  Count_G = 1
  Exit Sub
 ElseIf Count_G > 1 Then GoTo skip
 ElseIf Count_G = 1 Then
  ActiveWindow.ScrollRow = 24
  Comm = InputBox("注釈文を記入してください。これで2枚目、プレビューします")
  Sheets("Sheet2").Range("B50") = Comm
  ActiveWindow.SelectedSheets.PrintPreview
  'プリントプレビュー
  For Each shp In ActiveSheet.Shapes
   ' shp.Delete                     
'コピー先の画像を削除
  Next
  Sheets("Sheet1").Activate
 End If
 skip:
 Resume Next
 Count_G = 0
 CommandBars("Pictures Context Menu").Controls("画像コピーあと1枚") _
                          .Caption = "画像コピーあと2枚"
End Sub
「写真」シートで複数選択した図形を、「印刷」シートの任意のセルにぴったりの大きさで貼り付け
印刷プレビューして、印刷し、図形を削除します。

Sub miko_test()              
'複数の図形を選択してから実行してください
 Dim obj As Object, i As Integer, j As Integer, N() As String
 Dim seru As Range
 On Error Resume Next
 
'セルを選択している場合、処理を終了します
 If TypeName(Selection) = "Range" Then
  MsgBox "図形を選択してください"
  Exit Sub
 End If
 
'図形の数をカウント
 i = 0
 For Each obj In Selection
  i = i + 1
 Next
 If i = 1 Then
  MsgBox "図形は、2個以上選択してください" & Chr(10) & _
        "「Shift」キーを押しながら図形をクリックするといいですよ(^^)v"
  Exit Sub
 End If
 ReDim N(i)                
'変数の個数を設定
 
'図形の名前を変数に格納
 i = 0
 For Each obj In Selection
  i = i + 1
  N(i) = obj.Name
 Next
 Sheets("印刷").Select
 For j = 1 To i
  
'選択した図形をコピー
  Sheets("写真").Shapes(N(j)).Copy
  ActiveSheet.Paste
  
'貼り付けた図形を任意のセルに移動
  Set seru = Application.InputBox("図形をコピーするセルをクリックして下さい", "セルの選択", Type:=8)
  With Selection.ShapeRange
   .LockAspectRatio = msoFalse
   .Left = seru.MergeArea.Left           
'図形の左位置を選択したセルの左位置にする
   .Top = seru.MergeArea.Top
           '図形の上位置を選択したセルの上位置にする
   .Height = seru.MergeArea.Height       
'図形の縦幅を選択したセルの縦幅にする
   .Width = seru.MergeArea.Width        
'図形の横幅を選択したセルの横幅にする
  End With
 Next
 ActiveWindow.SelectedSheets.PrintPreview                
'プリントプレビューで確認
 If MsgBox("そのまま印刷しますか?", vbOKCancel + vbQuestion) = vbOK Then
  ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True  
'印刷
  ActiveSheet.DrawingObjects.Delete
                     '図形を削除
 End If
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
35 図形の場所・縦横のサイズを、ミリで指定して描くには
http://cgi.fuji.ne.jp/~fj2094/cgi-bin3/wwwlng.cgi?print+200110/01100016.txt
 「オートシェイプの四角とか楕円とかをセルの上下真中に書くには?」【グラフラウンジ】
図形の場所、縦横のサイズをミリで指定して描くマクロです。
Sub 図形の位置と大きさをミリで指定()
  Dim 縦 As Double, 横 As Double
  Dim 左 As Double, 上 As Double
  Dim 図形 As String, 図形番号 As Integer  
  左 = Application.InputBox(Prompt:="左位置を左端からミリ単位で入力してください", Type:=1)
  上 = Application.InputBox(Prompt:="上位置を上端からミリ単位で入力してください", Type:=1)
  横 = Application.InputBox(Prompt:="横幅をミリ単位で入力してください", Type:=1)
  縦 = Application.InputBox(Prompt:="縦幅をミリ単位で入力してください", Type:=1)
  図形番号 = Application.InputBox(Prompt:="図形を番号で選択してください" & Chr(10) & " 1:四角形 2:楕円", Type:=1)
  If 図形番号 = 1 Then
     図形 = msoShapeRectangle
  ElseIf 図形番号 = 2 Then
     図形 = msoShapeOval
  End If
  ActiveSheet.Shapes.AddShape(図形, 左 / 0.35, 上 / 0.35, 横 / 0.35, 縦 / 0.35).Select
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
36 選択範囲のセルの外周に、角丸のサイズを指定して角丸四角形を描くには
http://cgi.fuji.ne.jp/~fj2094/cgi-bin3/wwwlng.cgi?print+200110/01100013.txt
 「罫線での囲みの角を丸くするには?」【グラフラウンジ】
Sub 選択範囲の外枠に角丸四角形を描画()
 Dim vntR As Variant '角の丸みのR
 vntR = Application.InputBox(prompt:="角のRを指定して下さい。" & vbLf & _
                        "ポイント単位", Default:=3, Type:=1)
 With ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, Selection.Left, _
                      Selection.Top, Selection.Width, Selection.Height)
  .Fill.Visible = msoFalse
  .Line.Weight = 0.75
  If Selection.Width < Selection.Height Then
   .Adjustments.Item(1) = vntR / (Selection.Width / 2)
   If vntR > Selection.Width / 2 Then GoTo Err1
  Else
   .Adjustments.Item(1) = vntR / (Selection.Height / 2)
   If vntR > Selection.Height / 2 Then GoTo Err1
  End If
 End With
 Exit Sub
Err1:
 MsgBox prompt:="指定したRで描画出来ませんでした。"
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
37 「0」が入力された行に接している図形を削除するには?
http://www.ae.wakwak.com/~efc21/cgi-bin/wwwlng.cgi?print+200110/01100529.txt
 「
E列の数字が0だと、その行とオートシェイプで書いた図を削除する方法は?」 【VBAラウンジ】
E列のセルに「0」と入力して実行すると、その行にかかっているのオートシェイプを全て削除します
 Sub Test()
 Dim myShp As Shape
 Dim C As Range
 For Each C In Range("E1", Cells(Rows.Count, "E").End(xlUp))
  If C.Value = "0" Then
   For Each myShp In ActiveSheet.Shapes
    If (C.Top + C.Height > myShp.Top) And (C.Top < myShp.Top + myShp.Height) Then
     myShp.Delete
    End If
   Next
  End If
 Next
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。

E列のセルに「0」と入力して実行すると、その行にかかっているのオートシェイプと、行自体も全て削除します
Sub Test03()
 Dim myShp As Shape
 Dim i As Integer
 For i = Cells(Rows.Count, "E").End(xlUp).Row To 1 Step -1
  With Cells(i, "E")
   If .Value = "0" Then
    For Each myShp In ActiveSheet.Shapes
     If (.Top + .Height > myShp.Top) And (.Top < myShp.Top + myShp.Height) Then
      myShp.Delete
     End If
    Next
    .EntireRow.Delete
   End If
  End With
 Next
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。

38 ダイアログボックスから画像を選択して、指定の範囲の大きさに挿入するには?
Sub miko_test()
 Dim seru As Range, W As Double, L As Double
 Dim RW As Double, RH As Double, GW As Double, GH As Double
 On Error GoTo Errorline
 Set seru = Application.InputBox("図形を挿入する範囲をドラッグして下さい", "画像挿入範囲の選択", Type:=8)
 Application.Dialogs(xlDialogInsertPicture).Show
 RW = seru.Width
 RH = seru.Height
 With Selection.ShapeRange
  GW = .Width
  GH = .Height
  .Top = seru.Top
  .Left = seru.Left
  .ScaleWidth (RW / GW), msoFalse, msoScaleFromTopLeft
  .ScaleHeight (RH / GH), msoFalse, msoScaleFromTopLeft
 End With
Errorline:
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
39 フォルダ内の画像を一括して全て挿入するには
'A1セルに入力したのファルダ、または、C:\My Documents\My Pictures内のJPG・gif画像を全て挿入します
Dim i As Integer, j As Integer, k As Integer, m As Integer, N As String
Dim PathName As String, BookName As String
Sub 画像の一括挿入()
 Application.ScreenUpdating = False
'画面の動きを固定
 Sheets("写真一覧").Select
 ActiveSheet.DrawingObjects.Delete
 On Error GoTo Errorline
 i = Application.InputBox(Prompt:="横に何枚並べますか?", Default:=5, Type:=1)
 Cells.RowHeight = 30
 Cells.ColumnWidth = 18
 j = 2: k = 2
 Call セル横幅調整
 If Range("A1") <> "" Then
  N = Range("A1").Value
 Else
  N = "C:\My Documents\My Pictures\"
 End If
 PathName = Application.InputBox(Prompt:="表示する画像の入ったフォルダのフルパスを入力してください", _
 Default:=N, Type:=2)
 BookName = PathName & Dir(PathName & "*.jpg")
 Call 画像挿入
 BookName = PathName & Dir(PathName & "*.gif")
 Call 画像挿入
Errorline:
 ActiveSheet.Buttons.Add(507.75, 6, 69, 18).Select
 With Selection
  .OnAction = "プリクラ.xls!画像の一括挿入.画像の一括挿入"
  .Name = "画像挿入ボタン"
  .Characters.Text = "画像挿入"
  .Placement = xlMove
 End With
 Range("A1").Select
 Application.ScreenUpdating = True
End Sub
Private Sub 画像挿入()
 Do Until BookName = PathName & ""
  ActiveSheet.Pictures.Insert(BookName).Select
  With Selection
   .Left = Cells(j, k).MergeArea.Left
   .Top = Cells(j, k).MergeArea.Top
   .Height = Cells(j, k).MergeArea.Height
   .Width = Cells(j, k).MergeArea.Width
  End With
  k = k + 2
  If k > i * 2 Then
   k = 2
   j = j + 2
   Rows(j - 1).RowHeight = 18
   Rows(j).RowHeight = 80
  End If
  BookName = PathName & Dir()
 Loop
End Sub
Private Sub セル横幅調整()
 For m = 2 To i * 2 Step 2
  Columns(m - 1).ColumnWidth = 1
 Next
 Rows("2").RowHeight = 80
End Sub
  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。
40 虹のマクロ
下のような虹をマクロで描きます。


Sub DrawRainbow()
 Dim CRed As Integer
 Dim CGreen As Integer
 Dim CBlue As Integer
 Dim i As Integer
 Dim d As Double
 
 ActiveWindow.DisplayGridlines = False
 
 With ActiveSheet
 
  .DrawingObjects.Delete
  
  For i = 0 To 42
   d = i / 2
   With .Shapes.AddShape(msoShapeArc, 210 + d, 10 + d, 200 - d, 200 - d)
    .Adjustments.Item(1) = 180
    .Left = .Left - d
    .Line.Weight = 2
   End With
  Next
  CRed = 255
  CGreen = 0
  CBlue = 0
  For i = 1 To 8
   CGreen = (i - 1) * 32
   If CGreen > 255 Then CGreen = 255
   .Shapes(i).Line.ForeColor.RGB = RGB(CRed, CGreen, CBlue)
  Next
  
  CRed = 255
  CGreen = 255
  CBlue = 0
  For i = 1 To 8
   CRed = 255 - (i - 1) * 32
    If CRed < 0 Then CRed = 0
   .Shapes(i + 8).Line.ForeColor.RGB = RGB(CRed, CGreen, CBlue)
  Next
  
  CRed = 0
  CGreen = 255
  CBlue = 0
  For i = 1 To 8
   CBlue = (i - 1) * 32
   If CBlue > 255 Then CBlue = 255
   .Shapes(i + 16).Line.ForeColor.RGB = RGB(CRed, CGreen, CBlue)
  Next
  
  CRed = 0
  CGreen = 255
  CBlue = 255
  For i = 1 To 8
   CGreen = 255 - (i - 1) * 32
   If CGreen < 0 Then CGreen = 0
   .Shapes(i + 24).Line.ForeColor.RGB = RGB(CRed, CGreen, CBlue)
  Next
 
  CRed = 0
  CGreen = 0
  CBlue = 255
  For i = 1 To 8
   CRed = (i - 1) * 32
   If CRed > 255 Then CRed = 255
   .Shapes(i + 32).Line.ForeColor.RGB = RGB(CRed, CGreen, CBlue)
  Next
  
  For i = 41 To 43
  .Shapes(i).Line.ForeColor.RGB = RGB(255, 255, 255) 
  Next
 End With
End Sub

  このコードの使い方は、マクロの使い方(1)標準モジュールにあります。

HOME  検索  索引  もくじ  関数目次y  前ページへ  次ページへ

このページのTOPへ

inserted by FC2 system