
以下コードは、以下の内容のマクロを、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も見ています
-
考えた式の戻り値が期待通りにならない
Excel(エクセル)
-
45490がどうして
Excel(エクセル)
-
(マクロ)値を返す時は subでもfunctionでもどちらでも良いのでしょうか?
Excel(エクセル)
-
-
4
Excel いい方法教えてください。
Excel(エクセル)
-
5
エクセルの数式につきまして
Excel(エクセル)
-
6
エクスプローラーで見ることはできますか
Excel(エクセル)
-
7
【マクロ】Call関数で呼び出した場合、共通の変数宣言は、省略できますか?
Excel(エクセル)
-
8
【マクロ】functionプロシージャの、変数について
Excel(エクセル)
-
9
Excelの時刻の不思議
Excel(エクセル)
-
10
フィルター時の、別の列に書いてある数字の表に現れた個別の数字の数量のみを表す式を教えてください。
Excel(エクセル)
-
11
UNIQUE関数、配列数式を使わずに品名ごとの集計を求めたい
Excel(エクセル)
-
12
excelVBAについて。
Excel(エクセル)
-
13
【マクロ】メッセージボックスにて、キャンセルをクリックしたら、マクロ終了。エクセルへ戻すには
Excel(エクセル)
-
14
excelVBAについて。
Excel(エクセル)
-
15
【マクロ】複数の日付データをYYYY/MM/DDに読替えて、別ブックへ転記したい
Excel(エクセル)
-
16
excelVBAについて。
Excel(エクセル)
-
17
【マクロ】参照渡しについて。受け取る変数の名前を変更すると、動かなくなる
Excel(エクセル)
-
18
Excelファイルを開くと私だけVALUEが表示されます。
Excel(エクセル)
-
19
VLOOKUP FALSEのこと
Excel(エクセル)
-
20
VBAの「To」という語句について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
9月17日でサービス終了らし...
-
エクセル
-
エクセルのdatedif関数を使って...
-
エクセル ドロップダウンリスト...
-
エクセルの循環参照、?
-
【マクロ】WEBシステムから保存...
-
【マクロ】A列にある、日付(本...
-
【マクロ】EXCELで読込したCSV...
-
【マクロ】別のブックから、フ...
-
特定のセルだけ結果がおかしい...
-
VBA チェックボックスをオーバ...
-
iPhoneのExcelアプリで、別のシ...
-
【エクセル】期限アラートについて
-
【マクロ】アクティブセルの時...
-
Excelの新しい空白のブックを開...
-
【マクロ】3行に上から下に並...
-
Excelについての質問です 並べ...
-
【関数】同じ関数なのに、エラ...
-
マクロ・VBAで、当該ファイルの...
-
Excelファイルを開くと私だけVA...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelファイルを開くと私だけVA...
-
エクセルについてどう関数を使...
-
マクロ・VBAで、当該ファイルの...
-
エクセルのセルに画像は埋め込...
-
エクセルで、一部のセルだけ固...
-
【マクロ、画像あり】A表かB表...
-
エクセルでカウントする
-
【マクロ】コードを少しでも、...
-
VBA_日時のソート
-
エクセルで教えてください。 例...
-
エクセル 月間シフト表で曜日ご...
-
セルの左に余白を付ける
-
エクセル
-
エクセルについて教えてください
-
2枚のエクセル表で数字をマッチ...
-
ExcelのIF関数との組み合わせの...
-
エクセルのファイルのコピーを...
-
エクセルで二つのブックの違い...
-
空白処理を空白に
-
Excelのチェックボックスについ...
おすすめ情報