
エクセル2003にて、チェックボックスのオン・オフを利用して指定セルへの楕円の挿入と削除をしたいと考えております。
具体的にはオンの時に別シートの指定したセルに楕円を作り、オフの時にそれを削除したいのです。
チェックボックスのクリックで指定セルに楕円を挿入するようには下記の通りで出来たのですが、
その楕円を削除する方法と、
チェックボックスのオン・オフで挿入と削除を切り替える方法が分からず、困っております。
下記にどのうように追記すれば宜しいでしょうか?
どなたか詳しい方がいらっしゃいましたら、ご教授頂ければと思います。
宜しくお願い致します。
Sub チェック3_Click()
Dim myInp As Variant
Dim addCell As Range
Dim chkFlag As Integer
With ThisWorkbook.Worksheets("登録前")
Set addCell = .Range("DZ17").MergeArea
.Ovals.Add Left:=addCell.Left, _
Top:=addCell.Top, _
Width:=addCell.Width, _
Height:=addCell.Height
End With
End Sub
No.3ベストアンサー
- 回答日時:
#2の回答者です。
objName = Application.Caller
ここで取得していますから、
>If .CheckBoxes("Macro1").Value = xlOn Then
"Macro1" は不要です。あえて入れるなら、チェックボックスの名称です。
If .CheckBoxes(objName).Value = xlOn Then
のままで結構です。
この部分がないと、自分自身のチェックボタンのオン/オフが取れませんね。
それと、まっさらのシートでやってみましたが、うまく行きません。
よく見てみると、
Left:=addCell.Left
どうやら、ここの部分で、はみ出てしまうようですね。
だから、
Left:=addCell.Left +1
+1を足してみると良いでしょう。
ついでに、Top も足してみました。
デバッグとして、ステップモード(F8)で、ローカルウィンドウで、中がどのように変化していくか見るのが、コツです。
Sub チェック3_Click()
'名前をつけないで行う 場所を指定して削除
Dim myInp As Variant
Dim addCell As Range
Dim chkFlag As Integer
Dim objName As Variant
Dim shp As Object
objName = Application.Caller
With ThisWorkbook.Worksheets("登録前")
Set addCell = .Range("DZ17").MergeArea
If VarType(objName) <> vbString Then Exit Sub
If .CheckBoxes(objName).Value = xlOn Then
.Ovals.Add Left:=addCell.Left + 1, _
Top:=addCell.Top + 1, _
Width:=addCell.Width, _
Height:=addCell.Height
Else
On Error Resume Next
For Each shp In .Shapes
If Not Intersect(shp.TopLeftCell, addCell) Is Nothing Then
shp.Delete
End If
Next
On Error GoTo 0
End If
End With
End Sub
'-----------------------
こちらは、ワークシートの左上の四角のName Box で、一旦、楕円/円の図形の名前を、例えば、Oval1 とかしてあげて、名前を入れてあけないといけませんね。
'//
Sub チェック3_Click()
'Visible のオン/オフ
Dim myInp As Variant
Dim addCell As Range
Dim objName As Variant
Dim shp As Object
objName = Application.Caller
With ThisWorkbook.Worksheets("登録前")
Set addCell = .Range("DZ17").MergeArea
Set shp = .Shapes("Oval1") '名称*
If VarType(objName) <> vbString Then Exit Sub
If .CheckBoxes(objName).Value = xlOn Then
shp.Visible = msoTrue
Else
On Error Resume Next
shp.Visible = msoFalse
On Error GoTo 0
End If
End With
End Sub
さて、こんなところですが、
>団塊世代の上司に命ぜられ、今日からVBAの勉強を始めたばかりでして。。
って、65歳ぐらいでしょうか。本当は、その世代って、特に、Excelなどは得意としているはずなのですが……。ビル・ゲーツは、それよりも歳下です。しかし、ゲーツは、こういうことは不得意だったりして(笑)。しかし、ゲーツという人は、ビジネスの戦略では家康のように用意周到のようです。
今日からでは、ちょっとレベルが高すぎますね。
だって、この手の内容は、どこにも、もう載っていないはずです。
No.5
- 回答日時:
チェックボックスって、ActiveXコントロールですよね?フォームコントロールじゃないですよね?
マクロはチェックボックスのClickイベントプロシジャとして良いのですよね?
であれば、楕円を動的に作成するのではなく、事前に作成しておけば、とっても簡単です。
こんな感じです。
Private Sub チェック_3_Click()
Me.Shapes.Range(Array("円/楕円 1")).Visible = チェック_3.Value
End Sub
"円/楕円 1"のところは、事前に作成した図形の名前にしてください。
No.4
- 回答日時:
こんばんは!
横からお邪魔します。
Private Sub チェック3_Click()
Dim myInp As Variant
Dim addCell As Range
Dim chkFlag As Integer
Dim mySp As Shape, wS As Worksheet
Set wS = Worksheets("登録前")
Set addCell = wS.Range("DZ17").MergeArea
If チェック3 = True Then
With wS
.Ovals.Add Left:=addCell.Left, _
Top:=addCell.Top, _
Width:=addCell.Width, _
Height:=addCell.Height
End With
Else
For Each mySp In wS.Shapes
If mySp.AutoShapeType = msoShapeOval Then
If mySp.Top >= addCell.Top And mySp.Left >= addCell.Left Then
If mySp.Height <= addCell.Height And mySp.Width <= addCell.Width Then
mySp.Delete
Exit For
End If
End If
End If
Next mySp
End If
End Sub
※ Excel2010では大丈夫でした。
手元にExcel2003がないので
ちゃんと動かなかったらごめんなさい。m(_ _)m
No.2
- 回答日時:
考えてみました。
トグルのテクニックなどは、おわかりになっていただけるかと思います。フォームコントロールならではの手法です。objName = Application.Caller
を使うのが、コツです。
1. オートシェイプに名前をつけないで実行する方法
Sub チェック3_Click()
'名前をつけないで行う 場所を指定して削除
Dim myInp As Variant
Dim addCell As Range
Dim chkFlag As Integer
Dim objName As Variant
Dim shp As Object
objName = Application.Caller
With ThisWorkbook.Worksheets("登録前")
Set addCell = .Range("DZ17").MergeArea
If VarType(objName) <> vbString Then Exit Sub
If .CheckBoxes(objName).Value = xlOn Then
.Ovals.Add Left:=addCell.Left, _
Top:=addCell.Top, _
Width:=addCell.Width, _
Height:=addCell.Height
Else
On Error Resume Next
For Each shp In .Shapes
If Not Intersect(shp.TopLeftCell, addCell) Is Nothing Then
shp.Delete
End If
Next
On Error GoTo 0
End If
End With
End Sub
1. オートシェイプに名前をつけて実行する方法
(最初に、前のオートシェイプは削除していないといけません)
Sub チェック3_Click()
'名前をつけて行う
Dim myInp As Variant
Dim addCell As Range
Dim chkFlag As Integer
Dim objName As Variant
objName = Application.Caller
If VarType(objName) <> vbString Then Exit Sub
With ThisWorkbook.Worksheets("登録前")
If .CheckBoxes(objName).Value = xlOn Then
Set addCell = .Range("DZ17").MergeArea
Set shp = .Ovals.Add(Left:=addCell.Left, _
Top:=addCell.Top, _
Width:=addCell.Width, _
Height:=addCell.Height)
shp.Name = "CheckOval"
Else
On Error Resume Next
.Shapes("CheckOval").Delete
On Error GoTo 0
End If
End With
End Sub
'//
なお、たぶん、環境によると思うのですが、Excel 2003等でオートシェイプ等の削除・追加を繰り返していると、画面が反応しなくなることがあります。論理的には、100万回以上なのですが、千回程度で、上限に達することがあります。この回数はシートに対して累積のようです。問題がなければ、この話は無視して構いませんが、もし何かあれば、#1さんがお書きなった方法を採用していただいたほうがよいかもしれません。
だめになったら、シートを新しくすれば、復活するのですが、そんな人はいませんよね。(^^;
わざわざご記入まで頂き、ありがとうございます。
あまりVBAに詳しくなく、頂いたとおりに入力してみたのですが、「チェックボックスのプロパティエラー」というものが出てしまいます。
If .CheckBoxes("Macro1").Value = xlOn Thenno
のところでエラーが出てしまうのですが、どうすれば良いでしょうか。。。
実は団塊世代の上司に命ぜられ、今日からVBAの勉強を始めたばかりでして。。。
No.1
- 回答日時:
回答では有りません、提案になります。
「挿入」と「削除」だと楕円の管理が難しいので、「見える(○○.ShapeRange.Line.Visible = msoFalse)」と「見えない(○○.ShapeRange.Line.Visible = msoFalse)」としたほうがいいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- PowerPoint(パワーポイント) ExcelのVBAコードについて教えてください。 3 2022/05/25 14:32
- Visual Basic(VBA) QRコード作成マクロについて 3 2022/11/26 16:55
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Excel(エクセル) Excelのマクロについて教えてください。 4 2022/05/31 14:07
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Excel(エクセル) Excel2019 マクロを使用し画像を貼り付けした際のリンク切れについて 2 2022/11/15 16:14
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
onenoteでノートブックを削除出...
-
特定のプロジェクトを削除するには
-
行を削除する時に警告したい
-
エクセルで一度作ったユーザー...
-
Word 2010で画面に2ページ並ん...
-
bilibiliという動画サイトの動...
-
ワード文書 B5→A4変換
-
「K」のみのグレーと「K」を使...
-
Teams会議の上のメニューが消え...
-
デザインのみの印刷
-
goo地図の印刷について
-
エクセルで右下に簡易計算結果...
-
PDFデータを印刷、複製、スクシ...
-
OKボタンが押せない
-
エプソン電話連絡先は?
-
「筆三昧 あてな」での印刷
-
タイトルバーしか表示されない
-
VBA=一定時間エクセルの入...
-
一太郎で封筒の宛名印刷したい...
-
年賀状 インジェクト紙について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
onenoteでノートブックを削除出...
-
特定のプロジェクトを削除するには
-
リストボックスでの選択項目分...
-
Excelで行挿入イベントをハンド...
-
ODBCの自動登録について
-
インターエデュの登録解除・退...
-
行を削除する時に警告したい
-
ビルダー9で既存の作成したサ...
-
不要行を削除したい
-
エクセルの背景に挿入した画像...
-
FOMAカードの電話帳の削除の仕方
-
自動的に過去の入力文字が選択...
-
これも削除するのか教えてg0...
-
IEで右クリックして出てくるメ...
-
ショートカットを探しに行くの...
-
iPOD shuffle 曲の削除
-
OUTLOOK EXPRES...
-
MP3プレーヤーに書き込んだ曲を...
-
メールソフトBecky2の使い...
-
aboutbrank 2回感染
おすすめ情報
ご回答とご提案ありがとうございます。
「見える」・「見えない」とする場合は、どのようなマクロを組めば宜しいのでしょうか。。。
当方あまりVBAに詳しくなく、お手数でなければご教授頂ければと思います。