プロが教える店舗&オフィスのセキュリティ対策術

勤務先で、Excelで作成した住所一覧から封筒あて名印刷ができるようにVBAを設定をしました。
分からないことがあり、「教えて!goo」で質問をします。
以下をご参照の上、アドバイスを頂けると大変助かります。
VBAは初心者です。
この封筒あて名印刷のExcelファイルは、当方史上の大作で完成させたいの一心です。
どうぞ、よろしくお願いいたします。

【困っていること】
料金別納表示の下半分を広告に使えると聞き、Excelの図形を組み合わせて作成しました。
コマンドボタンで表示することはできるのですが、削除の設定が出来ずに困っています。
料金別納表示をコマンドボタンで削除するコードに知識がないため、ネット検索してはコピペを繰り返すもエラー。
料金別納表示は図形なのか、画像なのかでコードが変わってくるのかも分からず、お手上げ状態です。

【Excelで作成したのは、以下の通りです】
①「sheetあ」の「A1セル」に、図形を組み合わせて料金別納表示を作り、グループ化しました。
②「sheetい」の「A1:D4セル」を結合して、中央揃えで結合しました。
③「sheetい」にコマンドボタンを作り、①の料金別納表示を②に表示させました。

【要望】
『「料金別納表示削除コマンドボタン」をクリックしたら、削除できた』を、したいのです。
料金別納表示をコマンドボタンで削除するコードに知識がないため、ネット検索してはコピペを繰り返すもエラー。
料金別納表示は図形なのか、画像なのかでコードが変わってくるのかも分からず、お手上げ状態です。

【参考までに】
①料金別納表示をコマンドボタンで表示させてるコードです。
 Private Sub CommandButton14_Click() '料金別納表示広告
 Sheets(あ).Range("A1").CopyPicture Appearance:=xlScreen, Format:=xlPicture 'シート「あ」の「A1セル」の画像を
 Sheets(い).Paste Sheets(い).Range("A1") 'シート「い」の「A1セル」に貼り付けて

【添付ファイルの説明】
文章だけでは分かりにくいと思い、Excelの画面をコピペしました。

【その他】
料金別納表示が楕円になっていますが、あえて楕円にしてますので、そこを突っ込まれてもスルーします。

「Excel VBAについて【図形を組み合」の質問画像

質問者からの補足コメント

  • VBA通のみなさんに補足をわかりやすく書き、ヒント等を頂けたらと思っていますがが、「アウトプットが出来ないと言うことは、VBA知識が乏しい」現実に、困っています。
    また、ご回答をいただいても理解するのに時間がかかり、現在は応急処置中です。

    例えば、
    ボタン等に「名前を付ける」は、「Sheetあ」で「名前の定義」を使用し名前を付ける。
    「Sheetい」に画像を反映させたとて、名前までは引き継がれない。
    ここで、当方がフリーズしてしまいます。

    明日と言うか今日、会社でファイルとにらめっこする時間を数分設けてみます。

      補足日時:2023/11/21 00:35

A 回答 (5件)

既に、ご質問者のご希望に沿って、マクロを使った方法が複数回答されています。


ただ、
>コマンドボタンを作り、①の料金別納表示を②に表示させました。
>「料金別納表示削除コマンドボタン」をクリックしたら、削除できた』を、したい
というご説明が【料金別納表示と非表示(つまり削除された状態)の切り替えを行いたい】という意図なら、必ずしもマクロでなくても実現できます。

>住所一覧から封筒あて名印刷ができるようにVBAを設定をしました。
ということなので、封筒あて名印刷の部分はVBAに頼るとして、料金別納表示はチェックボックスを設けて、「料金別納表示」にチェックを入れると「(楕円の)料金別納の画像」が表示され、チェックを外すと、「料金別納の画像」が消えるという挙動を実現する方法はいかがでしょう。

https://hirogura.com/2016/05/12/post-1793/

上記のURLの「画像を自動で切り替える」方法が記載されています。このURLでは「野球チームのロゴ」の切り替えですが、これを参考にして、「別納料金画像」の「表示」と「非表示」を切り替えることにします。切り替える画像の一方を「料金別納の画像」、もう一方を「無地(白色)の画像」とし、この二つをチェックボックスの「TRUE」「FALSE」に連動させます。

仮に、チェックボックスの連動セルが「sheetあ」のL1セル、「シートあ」のL2セルで「表示」「非表示」を判定するとして、「シートあ」のL2に
=IF(Sheetあ!$L$1,"表示",非表示")を入れて、名前の定義で名前を「料金別納」、参照範囲を「=INDIRECT(Sheetあ!$L$2)」とします。

「料金別納の画像」のセルに「表示」、「無地(白色)の画像」のセルに「非表示」と名前をつけてリンク貼付けし、URLの指示に従えば、「チェックリストのチェックを外す」というワンクリックで料金別納表示の画像が消えることになるので、「削除コマンドボタンを押す」という手数と変わりません。

前述のとおり、【料金別納表示と非表示(つまり削除された状態)の切り替えを行いたい】という意図なら、この方法でもよいのではないかと思います。
    • good
    • 0
この回答へのお礼

goomania 様

お忙しい中、ご回答くださり、ありがとうございます。

添付して頂いたURLと、その下のご回答を参考にやってみたのですが、できないんです。
「チェックボタンでできないなら、プルダウンに画像と空白(削除した状態)でできるかも」とやってみたものの、画像の表示すらできませんでした。
原因は、当方の知識不足ですが、画像の大きさ?、貼り付け箇所セルの結合?も関係しているのか、よく分からずです。

現在は、No2のkigoshiさんとNo4のfujillinさんのお礼コメントに応急処置コードを書きました。
今後の時代の流れと共に封筒印刷することも減りますが、しれでもまだ数年は使用していくので、なんとかしてコマンドボタンに限らず、他の方法でもクリック(Wクリックでも可)だけで画像を削除できるように、勉強をしていきます。

ありがとうございました。

お礼日時:2023/11/21 00:22

こんにちは



CopyPictureメソッドの場合は、エクセルが新しく画像を作成してしまうので、元のオブジェクトのプロパティなどは利用できませんね。
Paste直後に、
 PicName = Selection.Name
等としておけば、貼り付けた図形のName属性を取得できます。
これで記憶しておいて、No1様の最初の方法で消去できるでしょう。
(Pictureそのものを保存しておいても良いです)

「A1セルにある画像を消去する」という方法で行うなら、
No1様の2番目の方法で、Top、Left が共に0である(=A1セルにあることを意味します)Shape要素を削除するようにすれば宜しいでしょう。
    • good
    • 0
この回答へのお礼

fujillin 様

お忙しい中、ご回答くださり、ありがとうございます。

2行目、
「CopyPictureメソッドの場合は、エクセルが新しく画像を作成してしまう」
これに悩んでいます。

そもそも画像(Picture数字)がかわるため、そこからヒントを頂き、またNo2のkigoshiさんの回答を参考にしながら、下記の通り応急処置をしました。

「Dim i As Long
 On Error Resume Next
 For i = 40 To 9999
 ActiveSheet.Shapes.Range("Picture " & i).Delete
 Next i」

9999まで行ったらどうなるのかな?と思いつつ、応急処置してます。
少ない数で実験をするといいんでしょうけど、まだやっていないです。

9行目、
「A1セルにある画像を消去する」をやってみたところ、できなかったんです。
当方のコードイメージとしては、
①A1セルの画像を選択(画像を選択すると四隅に小さい白い〇ができる)
②A1セルの画像を削除
なんですが、違うんでしょう。

なんとかしたいので、VBAの勉強をしていきます。
ありがとうございました。

お礼日時:2023/11/21 00:09

No.2です。


全部書いちゃうと、こんなかんじですか。

Dim shCnt As Integer

Private Sub CommandButton14_Click()
Sheets(あ).Range("A1").CopyPicture Appearance:=xlScreen, Format:=xlPicture 'シート「あ」の「A1セル」の画像を
Sheets(い).Paste Sheets(い).Range("A1") 'シート「い」の「A1セル」に貼り付けて
shCnt = Sheets(い).Shapes.Count
End Sub

Private Sub CommandButton15_Click() 'コマンドボタンの名前は適宜変更してください
Sheets(い).Shapes(shCnt).Delete
End Sub
    • good
    • 0
この回答へのお礼

kigoshi 様

コマンドボタンの名前の付け方が分からないんです。
No1のssawatakeさんのご回答と同じことをしてみたのですが、できないんです。

6行目「xlPicture」は、「xlPicture」ですよね。

当方のVBAの知識不足から、みなさんのご回答で解決できないでいます。
申し訳ありません。

お礼日時:2023/11/20 23:52

Dim shCnt As Integer



シート「い」の「A1セル」に貼り付けた処理の直後
shCnt = Sheets(い).Shapes.Count '貼りつけた図が何番目か

その他の処理

Sheets(い).Shapes(shCnt).Delete '「A1セル」に貼り付けた図を削除


ということをやりたいのでしょうか。
    • good
    • 0
この回答へのお礼

kigoshi 様

お忙しい中、ご回答くださり、ありがとうございます。
当方の説明が分かりにくく申し訳ありません。

3行目の「'貼りつけた図が何番目か」
料金別納表示を広告4種類作成しましたので、「貼り付けた図が何番目か」は、貼り付けた数、図を消した数だけの番数になります。

kigoshiさんの回答を参考にしながら、
「Dim i As Long
 On Error Resume Next
 For i = 40 To 9999
 ActiveSheet.Shapes.Range("Picture " & i).Delete
 Next i」
で、応急処置をしています。
9999まで行ったらどうなるのかな?と思いつつ、応急処置してます。

今後も勉強して、VBAが分からない人にもなんとか扱えるように、手間が1つでもなくなるファイルを作っていきます。

この度は、ありがとうございました。

お礼日時:2023/11/20 23:46

図形に名前を付けるならば、


Activesheet.Shapes(図形の名前).Delete

シート内一括削除で構わないなら
ActiveSheet.Shapes.SelectAll
Selection.ShapeRange.Delete
    • good
    • 0
この回答へのお礼

ssawatake 様

お忙しい中、ご回答くださりありがとうございます。

当方がVBA初心者なのと、Excelの機能を分かっているつもりの中途半端な知識しかないと気づかされました。

まず、
Activesheet.Shapes(図形の名前).Delete。
図形の名前の付け方が分からず、
・Excelの左上の四角いところで図形の名前を付ける
・コード内で名前を付ける
上記2点をGoogle先生の助けも借りながらやってみたものの、できませんでした。

「シート内一括削除」は、
画像が消えました!
が、同じシート状にあったコマンドボタンも消えてしまいました。

で、現在は、
「Dim i As Long
 On Error Resume Next
 For i = 40 To 9999
 ActiveSheet.Shapes.Range("Picture " & i).Delete
 Next i」
で、応急処置をしています。
9999まで行ったらどうなるのかな?と思いつつ、応急処置してます。

今後も勉強して、なんとかVBAが分からない人にも扱えるように、手間が1つでもなくなるファイルを作っていきます。

この度は、ありがとうございました。

お礼日時:2023/11/20 23:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A