[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロでオートシェイプを描く』(やん)
管理人さん回答者さんいつもお世話になります。
隣り合うセルに男、女と書き込んであります。
その男、女を○で囲みたくてオートシェイプの塗りつぶしなしで やってますがなんせ1000人以上分あるのでマクロを使ってやりたいのですが・・・
できればセルを選択して ダブルクリックで丸が付く ショートカットで丸が付く←本当はこっちが好ましい
Googleで調べて こんなコードを見つけたのですがセルの大きさいっぱいに ○が広がってでか過ぎなんです(しかも楕円) 該当箇所と思われるところを修正し走らせてみたらエラーはでないんですが 丸がでなくて自考の限界を迎えてしまいました。 下記コードの修正点でもいいんですができればsubプロシジャーが嬉しいです。
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
msoShapeOval, .Left, .Top, .Width, .HeightをmsoShapeOval, 308.25, 165#, 13.5, 13.5としました。
すみませんがご教授お願いします
あとなんで私の質問はフォントがデカいんでしょうか(ToT)
男と女の文字のフォント11で、一文字のみ入り左にあるとして、 Shapes.AddShape(msoShapeOval, .Left + 1.5, .Top + 1.5, 12, 12).Fill.Visible = msoFalse
このくらいで如何でしょう?
>あとなんで私の質問はフォントがデカいんでしょうか(ToT) 書込み用の【プレビュー】下の テキスト整形ルールを見るとわかると思いますが、 半角スペースを入れると整形されますよ〜♪
入れないとこんな感じ〜
(キリキ)(〃⌒o⌒)b チョット修正
ありがとうございます なるほど〜オフセットをかける要領でいいんですね
ちょっと値を変えてみたら成功しました。
昔作ったのがあったので、ちょっと改造してみました。 シートモジュールに Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim MyShape As Shape Cancel = True If Intersect(Target, Range("A1:D5")) Is Nothing Then Exit Sub With Target Set MyShape = Me.Shapes.AddShape(msoShapeOval, _ .Left + (.Width / 4), .Top, (.Width / 4) * 2, .Height) MyShape.Fill.Visible = msoFalse End With With MyShape .OnAction = "削除" End With Set MyShape = Nothing End Sub 標準モジュールに Option Explicit Sub 削除() Dim MyName As String MyName = ActiveSheet.Shapes(Application.Caller).Name ActiveSheet.Shapes(MyName).Delete End Sub 失礼!選択しなくても出来ますよねぇ??? (SoulMan)
わっ!削除まで簡単にできてしまうんですね?すごいの一言です。 マクロの記録からの発展でいけると思っていたので少し悔しいですがw
僕の質問が的を得てなかったのですがこれをすべてのシートに貼り付けるとなると(シート数計50枚)コードの記入も マクロ処理したほうが早いですよね?既存のシートなんで マクロ入りシートにデータ貼り付けるか、データの方にマクロを コピるか。。。
とにかくありがとうございました
>これをすべてのシートに貼り付けるとなると(シート数計50枚) シートモジュールのコードを削除して ↓これをメニューバーのファイルの隣にあるExcelのマークを右クリックしてコード表示させて そこに貼り付けると全シートで使えますよ? Option Explicit Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Dim MyShape As Shape Cancel = True If Intersect(Target, Sh.Range("A1:D5")) Is Nothing Then Exit Sub With Target Set MyShape = Sh.Shapes.AddShape(msoShapeOval, _ .Left + (.Width / 4), .Top, (.Width / 4) * 2, .Height) MyShape.Fill.Visible = msoFalse End With With MyShape .OnAction = "削除" End With Set MyShape = Nothing End Sub もう、見てないかな?? (SoulMan)
見てますよ〜。またまたありがとうございます。 はじめてこんなところクリックしました、奥が深すぎです(ToT)
しょ・衝突〜
最初のコードを再利用〜♪ ThisWorkbookに貼付
Option Explicit Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Dim CurShape As Shape
Cancel = True For Each CurShape In ActiveSheet.Shapes If CurShape.TopLeftCell.Address = Target.Address Then CurShape.Delete Exit Sub End If Next With Target ActiveSheet.Shapes.AddShape(msoShapeOval, .Left + 1.5, .Top + 1.5, 12, 12).Fill.Visible = msoFalse End With End Sub
(キリキ)(〃⌒o⌒)b
私ならファイルサイズが増加するので、1000個も図形を配置することはしませんが・・・ (INA)
う〜ん、確かに。。。(ー_ー;) (キリキ)(;⌒o⌒)b
すみません、今までプリントアウトして手書きで○つけていたんですけど 最近メールでファイルで欲しいと要望が強くこのようなことになってしまいました 添付できるサイズなら多少は我慢します。 っていうか他に方法あるんでしょうか?....ちょっと期待
ということで、1000個作ってみましたぁ(^^; 新規Bookでシートが3枚22.5KBだったのが 167KBになりました。といっても 1000回ダブルクリックしたわけではありませんがぁ(^^; あれ?今やったら、 15.5KB→144KBでした。ざっと10倍ですね。。 (SoulMan)
検証ありがとうございます。10倍ですか・・・ まぁ作業が9割減になればOKです。
例えばSoulManさんのコードを条件によって分ける場合
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Dim MyShape As Shape Cancel = True If Intersect(Target, Sh.Range("F8:G27")) Is Nothing Then Exit Sub With Target Set MyShape = Sh.Shapes.AddShape(msoShapeOval, .Left + 5#, .Top + 18#, 12, 12) MyShape.Fill.Visible = msoFalse
End With ElseIf Intersect(Target, Sh.Range("M8:M27")) Is Nothing Then Exit Sub With Target Set MyShape = Sh.Shapes.AddShape(msoShapeOval, _ .Left + (.Width / 4), .Top, (.Width / 4) * 2, .Height) MyShape.Fill.Visible = msoFalse
End With With MyShape .OnAction = "削除" End With Set MyShape = Nothing End Sub
としたのですがElseに対するIfがありませんとエラーになってしまいました。 なぜなんでしょう・・・?そもそもこれは「If Then Else」構文では ないのでしょうか?
それは、、、 >If Intersect(Target, Sh.Range("F8:G27")) Is Nothing Then Exit Sub ~~ ~~~~~~~~~~~~~ ここのIFが1行で終結している為だと思います。 試しに Exit Sub を取って見たらどうなりますでしょう? End If もお忘れなく〜♪
(キリキ)(〃⌒o⌒)b
早速やってみました。なんとかなりました 二つの範囲で違うサイズの○がほしくなってお二人のコードを参考に少してを加えました
結局「〜の範囲に無い場合は何もしない」ってコードがかけずじまいですが... (やん)
そういう時は↓一つでいいですよ。 If Intersect(Target, Sh.Range("F8:G27,M8:M27")) Is Nothing Then Exit Sub (SoulMan)
違う範囲にはサイズの違う○が付けたくなったんです。 (SoulMan)さんのコードは「〜である時〜しない」ってことですよね? あれ?違う? 頭悪くてイヤになります。これでも通勤中や休みの日にはマクロをうまく かくために勉強してるんですけど・・・ね (やん)
すみません。全然、見てませんでした(^^; そんな時はSelectCaseの方がよくないですか? Option Explicit Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Dim MyShape As Shape Cancel = True If Intersect(Target, Sh.Range("F8:G27,M8:M27")) Is Nothing Then Exit Sub With Target Select Case True Case .Row >= 8 And .Row <= 27 Select Case True Case .Column = 6 Or .Column = 7 Set MyShape = Sh.Shapes.AddShape( _ msoShapeOval, .Left + 5#, .Top + 18#, 12, 12) Case .Column = 13 Set MyShape = Sh.Shapes.AddShape( _ msoShapeOval, .Left + (.Width / 4), .Top, (.Width / 4) * 2, .Height) End Select End Select End With With MyShape .Fill.Visible = msoFalse .OnAction = "削除" End With Set MyShape = Nothing End Sub あってるかな?? (SoulMan)
完璧です。これでいろんなところに応用できます。 しっかし(SoulMan)さん(キリキ)さん 何度もありがとうございます
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.