
以下コードは、以下の内容のマクロを、2つ同じ種類の物を連続して
書いただけです
当該マクロを、もう少し簡略して書くことはできますか?
アドバイス等でも良いので、教えて下さい
【マクロ内容】
・画像を作成
・画像にマクロを登録する
【コード】
Sub sample()
With ActiveSheet.Shapes.AddShape(msoShapeRectangle, 60, 60, 60, 60)
.Fill.ForeColor.RGB = RGB(220, 220, 220)
.Line.ForeColor.RGB = RGB(220, 220, 220)
.Name = "あいうえお"
With .TextFrame.Characters
.Text = "不要行削除"
.Font.Size = 16
End With
.Top = Range("d1").Top
.Left = Range("d1").Left
End With
ActiveSheet.Shapes("あいうえお").OnAction = "copy"
With ActiveSheet.Shapes.AddShape(msoShapeRectangle, 60, 60, 60, 60)
.Fill.ForeColor.RGB = RGB(220, 220, 220)
.Line.ForeColor.RGB = RGB(220, 220, 220)
.Name = "かきこ"
With .TextFrame.Characters
.Text = "重複"
.Font.Size = 16
End With
.Top = Range("h1").Top
.Left = Range("h1").Left
End With
ActiveSheet.Shapes("かきこ").OnAction = "かきくけこ"
End Sub
No.2ベストアンサー
- 回答日時:
No1の方のアドバイスに従って、修正してみました。
Sub samaple2()
Call my_shape("あいうえお", "不要行削除", "d1", "copy")
Call my_shape("かきこ", "重複", "h1", "かきくけこ")
End Sub
Sub my_shape(name As String, text As String, rng As String, act As String)
With ActiveSheet.Shapes.AddShape(msoShapeRectangle, 60, 60, 60, 60)
.Fill.ForeColor.RGB = RGB(220, 220, 220)
.Line.ForeColor.RGB = RGB(220, 220, 220)
.name = name
With .TextFrame.Characters
.text = text
.Font.size = 16
End With
.Top = Range(rng).Top
.Left = Range(rng).Left
End With
ActiveSheet.Shapes(name).OnAction = act
End Sub
No.3
- 回答日時:
こういう質問は得意(元情報システム部)なのですが、歳を取って長いコードをかくのが苦手なので GoogleGemini に丸投げしまし。
以下はその回答です。以下に、ご提示いただいたコードを簡略化する例と、さらに応用的な方法をご紹介します。
1. 繰り返し処理と配列の活用
VBAでは、Forループを使って同じ処理を繰り返すことができます。
また、配列を使って複数のオブジェクトの情報をまとめて管理することで、コードを簡略化できます。
Sub sample()
Dim buttonNames As Variant
Dim buttonTexts As Variant
Dim buttonActions As Variant
Dim positions As Variant
Dim i As Long
' 各ボタンの情報を配列に格納
buttonNames = Array("あいうえお", "かきこ")
buttonTexts = Array("不要行削除", "重複")
buttonActions = Array("copy", "かきくけこ")
positions = Array("d1", "h1")
' 繰り返し処理でボタンを作成
For i = 0 To UBound(buttonNames)
With ActiveSheet.Shapes.AddShape(msoShapeRectangle, 60, 60, 60, 60)
.Fill.ForeColor.RGB = RGB(220, 220, 220)
.Line.ForeColor.RGB = RGB(220, 220, 220)
.Name = buttonNames(i)
With .TextFrame.Characters
.Text = buttonTexts(i)
.Font.Size = 16
End With
.Top = Range(positions(i)).Top
.Left = Range(positions(i)).Left
End With
ActiveSheet.Shapes(buttonNames(i)).OnAction = buttonActions(i)
Next i
End Sub
このコードでは、ボタンの名前、テキスト、マクロ名、配置場所をそれぞれ配列に格納し、Forループを使ってまとめて処理しています。
これにより、ボタンの数が増えてもコードの変更箇所を最小限に抑えることができます。
2. 関数化
ボタンの作成処理を関数として独立させることで、コードの可読性を高めることができます。
Sub sample()
CreateButton "あいうえお", "不要行削除", "copy", "d1"
CreateButton "かきこ", "重複", "かきくけこ", "h1"
End Sub
Function CreateButton(name As String, text As String, action As String, position As String)
With ActiveSheet.Shapes.AddShape(msoShapeRectangle, 60, 60, 60, 60)
.Fill.ForeColor.RGB = RGB(220, 220, 220)
.Line.ForeColor.RGB = RGB(220, 220, 220)
.Name = name
With .TextFrame.Characters
.Text = text
.Font.Size = 16
End With
.Top = Range(position).Top
.Left = Range(position).Left
End With
ActiveSheet.Shapes(name).OnAction = action
End Function
このコードでは、CreateButtonという関数を作成し、ボタンの情報を引数として渡しています。
これにより、sampleマクロのコードが簡潔になり、処理の流れを把握しやすくなります。
3. クラスの活用 (応用)
より高度な方法として、クラスを使ってボタンオブジェクトを定義することもできます。
クラスを使うことで、ボタンのプロパティやメソッドをまとめて管理でき、コードの再利用性が高まります。
' クラスモジュール (ButtonClass)
Public name As String
Public text As String
Public action As String
Public position As String
Public Sub Create()
With ActiveSheet.Shapes.AddShape(msoShapeRectangle, 60, 60, 60, 60)
.Fill.ForeColor.RGB = RGB(220, 220, 220)
.Line.ForeColor.RGB = RGB(220, 220, 220)
.Name = name
With .TextFrame.Characters
.Text = text
.Font.Size = 16
End With
.Top = Range(position).Top
.Left = Range(position).Left
End With
ActiveSheet.Shapes(name).OnAction = action
End Sub
' 標準モジュール
Sub sample()
Dim button1 As ButtonClass
Set button1 = New ButtonClass
button1.name = "あいうえお"
button1.text = "不要行削除"
button1.action = "copy"
button1.position = "d1"
button1.Create
Dim button2 As ButtonClass
Set button2 = New ButtonClass
button2.name = "かきこ"
button2.text = "重複"
button2.action = "かきくけこ"
button2.position = "h1"
button2.Create
End Sub
このコードでは、ButtonClassというクラスを作成し、ボタンの情報をプロパティとして定義しています。
Createメソッドでボタンの作成処理を行い、sampleマクロでクラスのインスタンスを作成してボタンを生成しています。
これらの方法を組み合わせることで、より効率的で保守性の高いマクロを作成することができます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
45490がどうして
Excel(エクセル)
-
Excel いい方法教えてください。
Excel(エクセル)
-
エクスプローラーで見ることはできますか
Excel(エクセル)
-
-
4
エクセルの数式につきまして
Excel(エクセル)
-
5
【マクロ】Call関数で呼び出した場合、共通の変数宣言は、省略できますか?
Excel(エクセル)
-
6
excelVBAについて。
Excel(エクセル)
-
7
【マクロ】メッセージボックスにて、キャンセルをクリックしたら、マクロ終了。エクセルへ戻すには
Excel(エクセル)
-
8
excelVBAについて。
Excel(エクセル)
-
9
【マクロ】複数の日付データをYYYY/MM/DDに読替えて、別ブックへ転記したい
Excel(エクセル)
-
10
フィルター時の、別の列に書いてある数字の表に現れた個別の数字の数量のみを表す式を教えてください。
Excel(エクセル)
-
11
UNIQUE関数、配列数式を使わずに品名ごとの集計を求めたい
Excel(エクセル)
-
12
excelVBAについて。
Excel(エクセル)
-
13
Excelファイルを開くと私だけVALUEが表示されます。
Excel(エクセル)
-
14
Excelの関数を教えて下さい。
Excel(エクセル)
-
15
VBAの「To」という語句について
Visual Basic(VBA)
-
16
Excel 偶数月の15日(土日祝日には前日に更新)には自動でカウントアップする数式ができません。
Excel(エクセル)
-
17
【マクロ】参照渡しについて。受け取る変数の名前を変更すると、動かなくなる
Excel(エクセル)
-
18
VLOOKUP FALSEのこと
Excel(エクセル)
-
19
【マクロ】コードを少しでも、減らする為には
Excel(エクセル)
-
20
【マクロ】【相談】Excelブックとマクロを早く動くようにする為には?
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【画像あり】オートフィルター...
-
他のシートの検索
-
Office2021のエクセルで米国株...
-
vba テキストボックスとリフト...
-
【マクロ】元データと同じお客...
-
【マクロ】【相談】Excelブック...
-
【マクロ】実行時エラー '424':...
-
エクセルのVBAで集計をしたい
-
【マクロ】【配列】3つのシー...
-
エクセルシートの見出しの文字...
-
【関数】3つのセルの中で最新...
-
LibreOffice Clalc(またはエク...
-
【マクロ】excelファイルを開く...
-
【マクロ】【画像あり】❶ブック...
-
【マクロ】【画像あり】4つの...
-
Excelで4択問題を作成したい
-
【関数】=EXACT(a1,b1) a1とb1...
-
エクセルの複雑なシフト表から...
-
UNIQUE関数の代用
-
【関数】同じ関数なのに、エラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【マクロ】元データと同じお客...
-
エクセルの関数について
-
【画像あり】オートフィルター...
-
エクセルのVBAで集計をしたい
-
エクセルのリストについて
-
【マクロ】数式を入力したい。...
-
【マクロ】【相談】Excelブック...
-
Office2021のエクセルで米国株...
-
【マクロ】実行時エラー '424':...
-
他のシートの検索
-
エクセルの複雑なシフト表から...
-
【マクロ】【配列】3つのシー...
-
vba テキストボックスとリフト...
-
【マクロ】左のブックと右のブ...
-
【マクロ】変数に入れるコード...
-
エクセルシートの見出しの文字...
-
【マクロ】別ファイルへマクロ...
-
【関数】同じ関数なのに、エラ...
-
Amazonでマイクロソフトオフィ...
-
ページが変なふうに切れる
おすすめ情報