エクセルVBA初心者のための○をつけるプログラム改良方法

このQ&Aのポイント
  • エクセルVBA初心者の方がダブルクリックするとセルに○が入り、再びダブルクリックすると○が消えるプログラムの改良方法について教えてください。
  • 現在のプログラムは連続したセルに対する処理ですが、結合したセルにも適用したいです。具体的には、O24からT25まで、V24からAA25まで、AC24からAC25まで、AJ24からAO25まで、AQ24からAV25まで、AX24からBC25までの結合セルの6カ所に○をつけたり消したりする処理に改良したいです。
  • VBA初心者ですので、具体的な改良方法を教えていただけると助かります。お願いします。
回答を見る
  • ベストアンサー

エクセルvba初心者です。○をつけるプログラム

以前どなたかが質問していた際に、下記の様なコードで回答をていた方がいらっしゃいます。 これを流用させていただきたいと思っています。そこで、下記の通り2点ほど改良をくわえたいのですが、どうすればいいのでしょうか。 改良点1 現在は、このコードは1つ1つのセルに対しての処理になっています。(結合したセルではうまくいかない。)自分がやりたいのは、O24からT25までという感じに結合されたセルに対して、このようにダブルクリックすると○が入り、再びダブルクリックすると○が消える。ということをしたいのです。 改良点2 下記のコードだと、A1からA5のように連続したセルに対する処理になっていますが、自分としては、O24からT25までの結合したセルと、V24からAA25までの結合したセルと、AC24からAC25までの結合したセルと、AJ24からAO25までの結合したセルと、AQ24からAV25までの結合したセルと、AX24からBC25までの結合したセルの計6カ所に○をつけたり消したりするようにしたいです。 何とかならないものでしょうか。VBAはかなり初心者です。お願いします。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean) Dim Ad As String Dim Lp As Single, Tp As Single, Hp As Single Dim Ov As Oval If Intersect(Target, Range("A1:A5")) Is Nothing Then Exit Sub End If With Target Ad = .Address Hp = .Height Lp = .Left + ((.Width / 2) - (Hp / 2)) Tp = .Top End With Cancel = True With ActiveSheet .Unprotect '★ For Each Ov In .Ovals If Ov.TopLeftCell.Address = Ad Then Ov.Delete: Ad = "": Exit For End If Next If Ad <> "" Then .Ovals.Add(Lp, Tp, Hp, Hp) _ .Interior.ColorIndex = xlColorIndexNone End If .Protect , True, False, False '★ End With End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • at121
  • ベストアンサー率41% (85/206)
回答No.2

マークする範囲は  Set Mark = Range("A1:D5, A10:D15, E6:G9")  で複数範囲を 自分のシートに合わせて書き換えて応用してしてください。  備考: 赤○にして確認した。 Exit For は ○の重複◎がある場合に備え消し優先にするために外した。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'Mark の複数の範囲のセル/結合セルに Wクリックで 赤○ つける/消す Dim Ad As String Dim Lp As Single, Tp As Single, Hp As Single Dim Ov As Oval, Mark As Range Set Mark = Range("A1:D5, A10:D15, E6:G9") '範囲の複数指定 If Intersect(Target, Mark) Is Nothing Then Exit Sub '範囲外は無視 With Target Ad = .Address: Hp = .Height: Tp = .Top If .Height > .Width Then Hp = .Width '縦長結合の場合に備える Lp = .Left + ((.Width / 2) - (Hp / 2)) End With Cancel = True With ActiveSheet .Unprotect '★ For Each Ov In .Ovals If Not (Intersect(Target, Ov.TopLeftCell) Is Nothing) Then '既存○検出 Ov.Delete: Ad = "": ' Exit For '◎重複があるなら外し、削除優先する End If Next If Ad <> "" Then With .Ovals.Add(Lp, Tp, Hp, Hp) .Interior.ColorIndex = xlColorIndexNone .Border.Color = vbRed ' 赤○にする End With End If Protect , True, False, False '★ End With End Sub

pon10000
質問者

お礼

ありがとうございます。 思いっきりイメージ通りになりました! 本当に助かりました!すごいですね!

その他の回答 (1)

noname#146604
noname#146604
回答No.1

改良点2について何をしたいのか伝わらないので、1だけ Private Sub Worksheet_BeforeDoubleClick(ByVal mycell As Range, Cancel As Boolean) Select Case mycell.Text Case "○" mycell = "" Case "" mycell = "○" End Select End Sub

pon10000
質問者

補足

お返事本当にありがとうございます。 すみません。説明不足でした。書いてくださったプログラムを試してみたのですが、私が流用させていただいたプログラムはもともとセルの中にはテキストとして文字が入力されていても、その文字の上に丸をつけたり消したりするプログラムです。 できれば投稿したプログラムをなるべく生かす様にしたいです。 今のままだと、結合されたセルに対してはうまく動かないので、結合されたセルに対しても動くようにしたいのです。 改良点2の方はよくわからない言い方になってしまってすみません。 If Intersect(Target, Range("A1:A5")) Is Nothing Then の部分ですが、この場合はセルA1:A5に対してはダブルクリックすると○がついたり消えたりしますよね。 それを、たとえばA1とA2とB1とB2の4つのセルが1つに結合されたセルと、少し離れた場所にあるG1とG2とH1とH2の4つのセルが1つに結合されたセルのように、結合されたセルが連続してない離れた場所に存在する場合に、その離れた場所に複数ある結合されたセルを対象範囲にしたいと考えています。 VBAでは結合されたセルに対して何かするというのは難しいのでしょうか。

関連するQ&A

  • VBAで丸をつけたいです。

    VBAかなりの初心者です。 先日、画像に添付したように、あらかじめテキストが入力されているセルを、ダブルクリックすると丸が付いたり消えたりするプログラムを教えてもらいました。 これはこれで使う機会があるので活用させてもらっているのですが。 できれば、ダブルクリックではなく、シングルクリックで丸が付いたり消えたりしたいのですが、できるでしょうか? 丸を付けたり消したりするセルには文字が入力されています。 丸をつけたり消したりしたいセルは時に結合されています。 丸をつけたり消したりしたいセルは連続していることもあれば、とびとびになっていることもあります。 前回教えて頂いたコードは以下のとおりです。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'Mark の複数の範囲のセル/結合セルに Wクリックで 赤○ つける/消す Dim Ad As String Dim Lp As Single, Tp As Single, Hp As Single Dim Ov As Oval, Mark As Range Set Mark = Range("A5:b7, d5:e7, g5:h7,A1:B3") '範囲の複数指定 If Intersect(Target, Mark) Is Nothing Then Exit Sub '範囲外は無視 With Target Ad = .Address: Hp = .Height: Tp = .Top If .Height > .Width Then Hp = .Width '縦長結合の場合に備える Lp = .Left + ((.Width / 2) - (Hp / 2)) End With Cancel = True 7 With ActiveSheet .Unprotect '★ For Each Ov In .Ovals If Not (Intersect(Target, Ov.TopLeftCell) Is Nothing) Then '既存○検出 Ov.Delete: Ad = "": ' Exit For '◎重複があるなら外し、削除優先する End If Next If Ad <> "" Then With .Ovals.Add(Lp, Tp, Hp, Hp) .Interior.ColorIndex = xlColorIndexNone .Border.Color = vbRed ' 赤○にする End With End If Protect , True, False, False '★ End With End Sub

  • エクセル マクロ 初心者です

    エクセルマクロ初心者です。 以下の2つの Private Sub Worksheet_Change(ByVal Target As Range)を1つのシートで実行させたいのですが、 当方、初心者なので組み合わせ方が分かりません。 よろしくお願いします。 ===No1=== Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target = StrConv(Target, vbUpperCase) Application.EnableEvents = True End Sub ===No2=== Private Sub Worksheet_Change(ByVal Target As Range) Dim Ans As Integer If Target.Count = 1 Then Ans = MsgBox("コピーは禁止!!", vbCritical) MsgBox "データを消去します。" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If If Target.Count = 1 Then Exit Sub Else MsgBox “複数セルのコピー禁止!" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End Sub ------------ 上記の2つを1つのシートで動作させたいのですが、うまくいきません。 単体では、動作します。

  • Excel VBA 入力規則

    入力規則を利用して、3つのセルを連携させることを考えていますが、 不適合な値を張り付けらられた場合に拒否をする方法があるのでしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim ad As String Dim ma As Range Dim ma2 As Range Dim r As Range Dim r2 As Range Dim r3 As Range Dim r1 As Range Dim m As Long Dim m2 As Long Application.EnableEvents = False If Target = "" Then Range("F7").Validation.Delete Range("F7") = "" If Target.Address(0, 0) = "B7" Then Range("D7").Validation.Delete Range("D7") = "" End If GoTo EXIT_SUB End If With Worksheets("Sheet1") ad = "A4" Set r = .Range(ad) Set ma = r.MergeArea Set r1 = r.Offset(0, 1) m = Application.Match(Range("B7"), .Range(r1, .Cells(r.Row + ma.Count - 1, r1.Column)), 0) Set r2 = .Cells(r.Row + m - 1, r1.Column) Set ma2 = r2.MergeArea If Target.Address(0, 0) = "B7" Then If ma.MergeCells Then setValiS Target.Offset(0, 2), r2 Range("F7").Validation.Delete Target.Offset(0, 2) = "" Target.Offset(0, 4) = "" Else MsgBox "A列が連結されていません。" End If ElseIf Target.Address(0, 0) = "D7" Then Set r3 = r2.Offset(0, 1) m2 = Application.Match(Target, .Range(r3, .Cells(r2.Row + ma2.Count - 1, r3.Column)), 0) setValiS Target.Offset(0, 2), .Cells(r2.Row + m2 - 1, r3.Column) Target.Offset(0, 2) = "" End If End With EXIT_SUB: Application.EnableEvents = True End Sub Sub setVali2() Dim tc As Range Dim c As Range Set tc = Worksheets("登録").Range("D3") Set c = Worksheets("Sheet1").Range("C3") setValiS tc, c End Sub Sub setValiS(tc As Range, c As Range) Dim ss As String Debug.Print tc.Address, c.Address ss = getChildren(c) If ss > "" Then With tc.Validation .Delete .Add Type:=xlValidateList, Formula1:=getChildren(c) End With End If Worksheets("登録").Activate End Sub Function getChildren(c As Range) Dim c1 As Range Dim ss As String Dim s1 As String Worksheets("Sheet1").Activate ss = "" For Each c1 In c.MergeArea s1 = c1.Offset(0, 1) If s1 <> "" Then ss = ss & "," & s1 Next c1 If ss <> "" Then ss = Mid(ss, 2) Else MsgBox "データがありません!" End If getChildren = ss End Function Sub Outline() Dim CheckRow As Long Dim Moji As String Dim TopRow As Long Dim EndRow As Long With ActiveSheet .Range("A2").ClearOutline .Outline.SummaryRow = xlAbove CheckRow0 = .Range("A" & .Rows.Count).End(xlUp).Row CheckRow = CheckRow0 Do If Moji = "" Then Moji = .Cells(CheckRow, 1).Value EndRow = CheckRow ElseIf yy_mm(CDate(.Cells(CheckRow, 1).Value)) = yy_mm(CDate(Moji)) Then TopRow = CheckRow If TopRow = 1 Then .Rows(TopRow + 1 & ":" & EndRow).Rows.Group Exit Do End If Else .Rows(TopRow + 1 & ":" & EndRow).Rows.Group CheckRow = CheckRow + 1 Moji = "" End If CheckRow = CheckRow - 1 Loop Until CheckRow = 1 .Rows(CheckRow + 1 & ":" & EndRow).Rows.Group .Outline.ShowLevels RowLevels:=1 ExecuteExcel4Macro "SHOW.DETAIL(1," & CheckRow0 & ",TRUE)" End With End Sub Function yy_mm(d As Date) yy_mm = Format(d, "yy/mm") End Function

  • エクセル2007でのVBAについて

    このたび目的としては、エクセルで工事用写真をリサイズして挿入してエクセルデータを作りたいのです。 どのように進めたいかというと、一連の流れは以下の通りです。    (今とりあえず持っているエクセルデータの一部が添付画像です) 1.この画像の『余白』となっている部分をクリックする 2.写真の入っているフォルダを選択するウィンドウが出てくる 3.写真を選択 4.余白となっている部分にそのサイズでリサイズされた写真が自動的に挿入される この流れがVBAでは 『Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim dlgAnswer As Boolean, x As Object, MyWidth As Single, MyHeight As Single If Target.Columns.Count = 4 And Target.Rows.Count = 12 Then Application.ScreenUpdating = False MyWidth = Target.Width MyHeight = Target.Height dlgAnswer = Application.Dialogs(xlDialogInsertPicture).Show For Each x In ActiveSheet.Shapes With x If .Width > MyWidth Then .LockAspectRatio = msoTrue .Width = MyWidth .Line.ForeColor.SchemeColor = 64 .Line.Visible = msoTrue End If End With Next Application.ScreenUpdating = True End If End Sub 』 となっていました。 私は、VBAやマクロについて全く詳しくないのですが、このVBAを他のデータで使おうとするとただ単にコピーすればいいのでしょうか? 中身についても上のマクロは各シート毎に設定されているのは分かるのですが、こういった中身についても教えていただけるとありがたいです。 分かり難くて申し訳ないのですが、よろしくお願いします。

  • エクセルVBAについて

    エクセルVBAについて 下にある、1行目に入力された数値の、選択したセルの数値を、B5セルに表示させるマクロなのですが、1行目が結合していると、うまくB5セルに表示できません。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)  If Target.Count > 1 Then Exit Sub    '●複数セル選択は無視  If Target.Row <> 1 Then Exit Sub    '●1行目以外の選択は無視  If Target.Column > 6 Then Exit Sub   '●F列目以降の選択は無視  If Target.Value = "" Then Exit Sub   '●選択セルが未入力なら無視    Range("B5").Value = Target.Value End Sub このマクロで、結合しているセルをB5に表示させることはできますでしょうか? 1行目で選択するセルは、すべて2つのセルが結合しています。 よろしくお願いいたします。

  • 【VBA】初心者です セルの貼り付けについて

    VBAについてご質問です 以下のようなVBAを、こちらの質問等を参考に作成したのですが、 シートにそれぞれデータを貼り付ける際、値貼り付けになってしまいます 書式ごと貼り付けるようにしたのですが、どのように改良すればよいでしょか ご教示よろしくお願いいたします Sub ぶんるい() Dim r As Long Dim Target As Variant For r = 14 To 100 Select Case Cells(r, "D").Value Case "大阪" Target = "大阪" Case "名古屋" Target = "名古屋" Case Else Target = "" End Select If Target <> "" Then Worksheets(Target).Range("A65536").End(xlUp).Offset(1).Resize(1, 14).Value = _ Cells(r, "H").Resize(1, 14).Value End If Next r End Sub

  • マクロを使って結合セルに丸を付ける+αな難題。。

    エクセルのマクロについて エクセルでセルや結合セルに丸を付ける質問はどれも見ましたが私にとって難題なものがありましたので、教えて下さい。  結合セルをマクロを使用して丸を付けるものがありますが、どなたか教えては頂けないでしょうか。初心者です、すいません。 1、ダブルクリックで結合セルに文字上に丸(太さ0.75)がつく。 2、ダブルクリックでそのセルから丸が消える。 同じ操作で1,2が繰り返される。 さらにここでもう一つ。 同シート内の※別の場所の結合セルに【データ】の【入力規制】で(リスト)を選択し、リスト内に【■,○,空白,】等の内容を含んでいます。 この上の二つがどちらもちゃんと使える方法が分かりません。 教えては頂けないでしょうか。 ちなみに参考までにマクロはこれを使っています。 正しいマクロを教えて下さい。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim Shp As Shape Cancel = True If ActiveSheet.Shapes.Count <> 0 Then For Each Shp In ActiveSheet.Shapes If Target.Address = Shp.TopLeftCell.Address Then Select Case Shp.Line.DashStyle Case 1: Shp.Delete: Exit Sub Case 4: Shp.Delete: Exit Sub End Select End If Next End If With ActiveSheet.Shapes.AddShape(msoShapeOval, Target.Left, Target.Top, Target.Width, Target.Height) .Fill.Visible = msoFalse .Line.Weight = 0.75 End With End Sub これと入力規制を使おうとしたら、マクロがデバックになってしまい使用できません。 入力規制は残ったままですが、マクロが使えなくなってしまいました。 解決策、何か違うところ、教えて下さい。

  • VBA初心者です

    VBA初心者です。 同じセルに数字を入れて足し算して行きたいんですが! 下記のVBA見つけたのですが、A1に数字を入れて答えがE1に出るんですが、同じ事を A2、A3、A4、A5答えもE2、E3......で増やしたいのですが、どうするか分かりません。 どなたか教えてください。 宜しくお願いします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim inp, outp As String inp = "$A$1" outp = "E1" Application.EnableEvents = False If Target.Address = inp Then Range(outp).Value = Range(outp).Value + Target.Value If Target.Value <> "" Then ActiveCell.Offset(-1, 0).Select Else Range(outp).Value = 0 End If End If Application.EnableEvents = True End Sub

  • VBA シートプログラムでRangeエラー

    いつもお世話になっております。 Excel2003を使用しております。 シートに直接プログラムを書いています。 (例として、Sheet1とします) シートの内容が変わったときに、色々プログラムを実行していこうと思っているのですが、 Private Sub Worksheet_Change(ByVal Target As Range) のTargetが上手く取得できていない気がします。 今までは上手く動いていたのですが、 急にTargetの値に数値(セルに入力した値)が入ってしまうようになり 上手く組めなくて困っています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim 開始1 As Range Dim 終了1 As Range Dim 開始2 As Range Dim 終了2 As Range Set 開始1 = Range("D5:D63") Set 終了1 = Range("E5:E63") Set 開始2 = Range("F5:F63") Set 終了2 = Range("G5:G63") If ThisWorkbook.ActiveSheet.ProtectContents Then '保護かかってたら End '強制終了 End If If Not Application.Intersect(Target, 開始1) Or Application.Intersect(Target, 実績日開始2) Is Nothing Then Call 開始(Target, 開始1, 開始2) ElseIf Not Application.Intersect(Target, 終了1) Or Application.Intersect(Target, 終了2) Is Nothing Then Msgbox "テスト!" End If End Sub '----------------------------------------------- Sub 開始(ByVal Target As Range, 開始1 As Range, 開始2 As Range) If Not Application.Intersect(Target, 開始1) Is Nothing Then MsgBox Target.Row End If If Not Application.Intersect(Target, 開始2) Is Nothing Then MsgBox Target.Row + 1 End If End Sub 全部シートに書いています。 まだ、テスト段階のため適当なプログラムしか書いておりません。 (指定範囲が変更された場合に、Msgboxを出したりなど 単純なことしかしていません) どこが悪いのか、教えて頂けないでしょうか? よろしくお願い致します。

  • VBA教えてください

    VBA初心者です。 画像を添付します 赤く塗られているセルには C~Eまでセルを結合し なおかつ結合したセルの中に「停止」の文字をいれます。 これを手動で行うのではなく 自動で(VBAで) 赤く塗られているセルだけに反応し その行のセル(C~E)を結合し なおかつその結合されたセルの中に 「停止」の文字を中央添えにされた状態で 自動入力できるようにしたいです 教えてもらったコードでは Private sub worksheet_change(byval target as range) If target. Interior.colorindex=3 then Range(cells(target.row,3),cells(target.row,5)).merge Cells(target.row,3).value="停止" End if End sub でした。 これでは出来ませんでした 改善点か 新しくコードを書いてもらえると めちゃくちゃ助かります。 回答お願いします