こんばんは。
>上記をA1B1に限定せずに、A1~A100(checkBox1~100)、B1~B100>(SpinButton1~100)へと同様の処理を効率的に複製する方法はご存知でしょうか?
以下は、新しいシートに何も入れないで、そのまま試してみてください。
セルの高さや幅など、微調整を行ってください。FormToolsDelを実行すれば、全てはきれいに消え、セル幅、セルの高さも標準に戻ります。
旧スタイルのマクロで、フォーム・ツールのほうが簡単です。コントロールツールのほうは、クラス・インスタンスが必要になってしまいます。もし、ご希望がコントロールツールなら、おっしゃってください。コードは複雑になりますが、可能です。
'-----------------------------------------
'標準モジュール
Sub AddFormButton()
Dim c As Range
Dim x1 As Double
Dim y1 As Double
Dim x2 As Double
Dim y2 As Double
Dim x3 As Double
Dim y3 As Double
Dim x4 As Double
Dim y4 As Double
Dim i As Integer
i = 1
With ActiveSheet
.Range("A1:A10").EntireRow.RowHeight = 20 'セルの高さ
.Range("A1:B1").EntireColumn.ColumnWidth = 12.5 'セルの幅
For Each c In .Range("A1:A100")
With c
x1 = .Left
y1 = .Top
x2 = .Offset(, 1).Left
y2 = .Offset(1).Top
x3 = .Offset(, 1).Left
y3 = .Offset(, 1).Top
x4 = .Offset(, 1).Offset(, 1).Left
y4 = .Offset(, 1).Offset(1).Top
End With
'left,top,width,height
With .CheckBoxes.Add(x1, y1, x2 - x1, y2 - y1)
.Caption = CStr(i) 'キャプション表示
.Name = "CB" & CStr(i)
.OnAction = "CBMacro"
End With
'left,top,width,height
'スピンの位置の高さの調整は、y3 + (x4 - x3) / 10 <-- 12
With .Spinners.Add(x3, y3 + (x4 - x3) / 12, x4 - x3, (y4 - y3) / 2)
.Name = "SP" & CStr(i)
.OnAction = "SPMacro"
.Max = 100
.Min = 0
.SmallChange = 20 'スクロール量
.LinkedCell = c.Offset(, 2).Address '値の出力
End With
i = i + 1
Next c
End With
End Sub
Sub CBMacro()
Dim tName As String
Dim i As Integer
tName = Application.Caller
i = Replace(tName, "CB", "")
With ActiveSheet
If .CheckBoxes(tName).Value = xlOn Then
.CheckBoxes(tName).TopLeftCell.Resize(, 2).Interior.ColorIndex = 3
.Spinners("SP" & i).Value = 100
ElseIf .CheckBoxes(tName).Value = xlOff Then
.CheckBoxes(tName).TopLeftCell.Resize(, 2).Interior.ColorIndex = xlNone
.Spinners("SP" & i).Value = 0
End If
End With
End Sub
Sub SPMacro()
Dim tName As String
Dim i As Integer
tName = Application.Caller
i = Replace(tName, "SP", "")
With ActiveSheet
If .Spinners(tName).Value = 100 Then
.Spinners(tName).TopLeftCell.Offset(, -1).Resize(, 2).Interior.ColorIndex = 3
.CheckBoxes("CB" & i).Value = xlOn
ElseIf .Spinners(tName).Value < 100 Then
.Spinners(tName).TopLeftCell.Offset(, -1).Resize(, 2).Interior.ColorIndex = xlNone
.CheckBoxes("CB" & i).Value = xlOff
End If
End With
End Sub
'-------------------------------------------
'おまけ
Sub FormToolsDel()
'フォームなど削除用マクロ
With ActiveSheet
.Range("A1:A100").EntireRow.RowHeight = .StandardHeight
.Range("A1:B1").EntireColumn.ColumnWidth = .StandardWidth
.CheckBoxes.Delete
.Spinners.Delete
.Range("A1:C100").Clear
End With
End Sub
お礼
誠にありがとうございます。 お蔭様でエラーも消え、スピンボタンの調整もできました。 このたびは極めてご丁寧にご教授くださり、ありがとうございました。 ネットを介してここまで他人様から詳しく教えていただけたのは初めてです。勝手に心の師匠とさせていただきます。 ご多忙にも関わらず(とても優秀なお方だと存じますので、いろいろとお忙しいかとお察します。)初学者の私の質問に対して呆れずにきちんと対応していただき、"ただただ感謝"以外の感情が出てまいりません。 また、コードを教えてもらって貼り付けて終了しただけでは、自分自身、何も成長になりません上、教えていただいたWendy02様にも失礼になると思いますので、少しずつではありますが、コードをこつこつと解釈し自分のものにできるように心がけ、延いては自分自身でも創造できるように努力したいと思います。 ちなみに、現在、初心者にも関わらず、不遜にもEXCELで自分好みの「スケジューラー&簡易データベース&日記&家計簿&プロジェクト及びタスク管理」を1つのブックに作成中です。 (ネットで調べても"自分"の理想はなかったため。) お蔭様で、最も肝で難関な箇所の一つであろう、プロジェクト及びタスク表の動的管理がだいぶ理想どおりになりました。 今後もおそらく関数やVBAに関する質問をこちらのサイトで投稿させていただくと思います。 たいへん図々しく虫のいい話しではありますが、その際、もしお手すきでしたら、またお付き合い願えましたら、幸甚です。 繰り返しになりますが、このたびは本当にありがとうございました。