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) |
|||
新規ブックを開いて、作成しています。作成後のブックには、マクロを含んでおらず、 関数で制御しています。 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カーブ)を描くには | ||
赤線枠内のセルを選択し、実行します。 |
|||
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() Private Sub
Worksheet_SelectionChange(ByVal Target As Range) |
|||
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() |
|||
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」と入力して実行すると、その行にかかっているのオートシェイプと、行自体も全て削除します |
|||
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)標準モジュールにあります。 |