• ベストアンサー

結合セルを含むロックしていないセルの値の削除を複数シートで行いたい

エクセルのマクロ(VBA)に関して、ご質問いたします。 私のレベルは入門編で、いろんなサイトや本を見て、そのまま利用しているくらいのものです。 次のコードは、他人様のサイトで見つけたものです。 Sub 結合セルを含むロックしていないセルの値の削除() Dim c As Range With ActiveSheet .Unprotect For Each c In .UsedRange If Not (c.Locked) Then c.MergeArea.ClearContents Next .Protect UserInterfaceOnly:=True End With End Sub この処理を複数シートに行いたいので、次のコードを(これも他人様のサイトからお借りしています)、上のコードの「Dim c As Range」の後に追加しましたが、アクティブシートは処理されましたが、全部のシートとはいきませんでした。 Dim Sh As Object For Each Sh In Sheets 単純に足しただけでは、だめなのでしょうか。 参考になるかどうかわかりませんが、シートの中には、値を削除しなくてもいいものも含まれています。 シートが全部で40枚弱あるので、全部のシートをチェックして、ロックされていないセル(結合セル含む)に値が入っていたら、値を削除する処理を、マクロ(VBA)で出来たらいいなっと思っております。 教えていただけますでしょうか。 どうぞよろしくお願いいたします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 For Each Sh In Sheets Next にして、 With ActiveSheet  を With Sh に変えればよいわけです。 「シートの中には、値を削除しなくてもいいものも含まれています。」 消されていけないものはロック設定してあると考えてよいなら、以下のようなコードはいかがでしょうか?ただし、ワークシート自体を保護してある必要はないです。セルのプロパティ自体が、ロック設定してあればよいわけですから。 以下のようにすれば、UsedRangeの中を全部、しらみつぶしにアクセスする必要はなくなると思いますね。それと、結合セルは、もともと、Area なのですから、Area を単位とすれば、セルひとつと関係なくなります。ちょっと範囲の選択が変わってくるわけです。 また、元のコードでは、 .Protect UserInterFaceOnly:=True と、意味が分かりませんね。マクロ処理が過ぎ去った後では、マクロのアクセス許可は、あまり役には立たないだろうと思います。 今は、消す対象とする「値」は、定数の文字列と数字になっています。 他の定数(論理値とエラー値)も含めるなら、  .UsedRange.SpecialCells(xlCellTypeConstants, 23).Areas になります。 -------------------------------------------------------------- Sub ClearValueMacro()   Dim a As Range 'エリア   Dim ws As Variant 'シート   On Error Resume Next   Application.ScreenUpdating = False   For Each ws In ActiveWorkbook.Worksheets     With ws       .Unprotect       For Each a In .UsedRange.SpecialCells(xlCellTypeConstants, _         xlNumbers + xlTextValues).Areas         If a.Locked = False Then           a.ClearContents         End If       Next a       .Protect     End With   Next ws   Application.ScreenUpdating = True   On Error GoTo 0 End Sub

hotcoco
質問者

お礼

ご回答およびご説明、ありがとうございます。 ご説明文を参考にして、今後の作成に役立てたいと思います。 教えてくださり、ありがとうございました。

その他の回答 (1)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

検証してないのですが。 Sub 結合セルを含むロックしていないセルの値の削除()   Dim Sh As Worksheet   Dim c As Range   For Each Sh In Worksheets       With Sh            .Unprotect                        For Each c In .UsedRange                If Not (c.Locked) Then c.MergeArea.ClearContents            Next            .Protect UserInterfaceOnly:=True       End With   Next End Sub こちらで、どうでしょうか?

hotcoco
質問者

お礼

ご回答、ありがとうございます。 私も今は確認ができないので、大丈夫かどうかわからないのですが、試してみます。 教えてくださり、ありがとうございました。

関連するQ&A

  • エクセルVBA 別シートの複数のセルの値をコピーする方法

    いつもお世話になります。 Dim sh1, sh2 As Worksheet Set sh1 = Worksheets("sheet1") Set sh2 = Worksheets("sheet2") sh1.Range("C6").Value = sh2.Range("F5").Value として、1つのセルの値ならコピーできるのですが、 sh1.Range("C6:C10").Value = sh2.Range("F5;F9").Value としても、セルの値を持ってくることができません。 どのように書けば良いのでしょうか? ちなみに今は、 sh2.Range("F5:F9").Copy sh1.Range("C5:C9").PasteSpecial Paste:=xlValues としているのですが、上記だとセルを範囲指定してしまって作業が見えるのでカッコ悪いのです。

  • セル解除後、各行に値をコピーし結合するマクロ

    A1からC3のセルが結合しており、 そのセル結合を解除すると、A列のみ値がコピーされる。 コピーした後、各行ごとにセルを結合していく…… という処理をしたいと思い、 調べて下記のマクロまでなんとかこぎつけました。 Sub セル結合() Dim date1 As Variant Dim range1 As Range Application.DisplayAlerts = False For Each range1 In Selection.Rows If range1(1).MergeCells = False Then range1(1).Merge Else date1 = Selection.Rows(1).Value With range1 .UnMerge .WrapText = False .ShrinkToFit = False Selection.Value = date1 End With End If Next range1 End Sub ※実行範囲に関しては、  任意選択をした範囲にしたいため、  range(1)にて処理を行いました。 困っているのは、上記のマクロを実行すると、 最初の行のみ結合できないということ。 もうひとつが、 セル結合をしない時に値を左端にコピーすると、 文字が自動縮小されてしまいます。 縮小しないようにするには、 どのような処理を入れたら良いでしょうか? お力添え頂けますと幸いです。 よろしくおねがいします。

  • VBAでの背景色分岐後の結合セルの処理について

    VBAで対象範囲の背景色が黒の部分のみ"-"をいれるという処理をしたいのですが、ループがうまく動いておらず最初のセルのみ"-"が入った状態です。 ※対象範囲のセルは3列ずつ結合されています コードは以下になります。VBA初心者のため、初歩的な質問かもしれませんがご回答よろしくお願いいたします。 Private Sub CommandButton1_Click() Dim C As Range Sheets("sheet1").Select T33:BA74 の範囲を1セルずつ繰り返す For Each C In Range("T33:BA74") セルが黒のとき If C.Interior.ColorIndex = 1 Then C.Value = "-" end If '次のセルへ Next End Sub

  • 指定した背景色のセルの値を削除するVBAを作りたい

    ご覧いただきありがとうございます。 VBA初心者です。 VBAを用いて指定し背景色のセルの値を全て削除したいと考えています。 シートには別の背景色のセルもあるため色のあるセルの値をすべて削除などは使えません。 For Eachを用いて以下のような数式を用いようと思ったのですが、Ineriorはセルを対象としていないといけないようで、シート全体を対象としたい場合どうしたらよいか分かりません。 また終わりのところもよくわかっていません。 ご教授よろしくお願い致します。 Dim ws As warksheet For Each ws In ActiveSheet If ws.Interior.ColorIndex = RGB(252, 228, 214) Then ws.ClearContents Next End Sub

  • Excelでの複数シートへの値の入力

    おはようございます。 Excel2000で複数のシートを選択した状態でセルに値を入力すると、他のシートの同じセルに内容が入力されますよね。 この機能の名称はわかりませんが・・・(^_^;) これをヒントに「フォーム内にあるTextBoxに入力された値を各シートのセルに入力しよう」というVBAのソースを作ってみましたが、 実行してみると選択されている1枚目のシートにしか値が入力されません。 汚いソースをみなさんに見せるのは恥ずかしいのですが、 是非実現したいので、どこが間違っているか指摘をいただけると幸いです。 やろうとしていること: フォームのテキストボックスに値を入力し、 コマンドボタンを押すとシートを複数枚選択し、 各シートのセル”A1”(AからDまでを結合)に値を入力する。 ******************************************* Private Sub CommandButton1_Click() 'テキストボックスの値取得と、店名の合成 Dim myTmei As String Dim myTmei2 As String myTmei = TextBox1.Text myTmei2 = "店名" & myTmei 'シートの選択 Sheets(Array(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46)).Select '値の入力 Range("A1").Select Range("A1").Value = myTmei2 End Sub ****************************************** 結果を見ると、シート自体は選択できているのですが、 その中でも「アクティブになっている(?)シート(1枚目)のセルだけに値を入力しなさいよ。」と書いてしまったようで、 「全てのシートのセル”A1”に入力しなさい。」という部分が書けていないのだと思うのです。 Selectだけじゃ、ダメなのかな・・・ どうかよろしくお願いします。

  • 結合セルの値取得について

    お世話になります、 (環境、VISTA&EXCEL2000) 結合セルに名前をつけて その値をマクロで取得したいのですが エラーになります。 結合セルには結合する前に名前をつけてから 結合してあります。 Dim ws As Worksheet ' On Error GoTo errTrap Set ws = Worksheets("xxxxx") '(1) ws.Range("DenDate").Value = Date '(2) MsgBox ws.Range("DenDate").Value (2)で「型が一致しません」になります。 宜しくお願いいたします。

  • 結合セルに結合していないセルの値を貼り付けたいです。

    結合セルに結合していないセルの値を貼り付けたいです。 シート1の1行目の[A1-B1-C1-D1]を結合しています。以下同じように[E1-F1-G1-H1]…のように4つづつ結合しています。 この行に、シート2のA1→B1→C1と続く結合していないセルのデータを貼り付けたいのですが、やりかたがわかりません。色々やってみたのですが、うまくゆきません。ご教授お願いいたします。

  • マクロ 結合セルへ値のみ貼り付けるにはどうしたらよいでしょうか。

    マクロは初心者で、まだまだ勉強しているところです。 シート名「入出金履歴」のデータを顧客コードごとに分かれている別シートへデータを振り分けて貼り付ける、もしくは反映させたいのですが、貼り付け先のセルがシートの都合上、結合セルになっており、下記のマクロだと当然ながらエラーになってしまいます。結合セルをまず、解除してから貼り付けようと思ったのですが、うまくいかず、困っています。 コピー先の結合状態は、7行目から、列A:C、列D:E、列F:H と、3列になるように結合されています。結合されている行の終わりは、A:C(結合されている)列に「合計」の値が入っているセルの行、H列まで、3列になるよう結合されています。 解除する以外に、良い方法があれば是非教えていただきたいです。 よろしくお願いします。 Sub samplea() r1 = ActiveCell.Row r2 = r1 + Selection.Rows.Count - 1 Dim myRange As Range Dim s_no As String For i = r1 To r2 s_no = Cells(i, 2) Range(Cells(i, 4), Cells(i, 9)).Select Selection.Copy Sheets(Format(s_no)).Select Set myRange = Columns("a:c").Find(what:="合計") If myRange Is Nothing Then Debug.Print "Not Fount" Else myRange.Select Selection.End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlValues Application.CutCopyMode = False Sheets("入出金履歴").Select End If Next End Sub

  • Excel VBAで結合セルの扱いが失敗します。

    KenKen_SPさんの素晴らしいコードを参考に、特定の色のセルにおいてのみ、テキストを削除するマクロが以下です。このままでは結合セルのあるエクセルシートでエラーになってしまいます。 これを解決できませんでしょうか。よろしくお願いします。 For i = 1 To ThisWorkbook.Worksheets.Count ThisWorkbook.Worksheets(i).Select Dim C As Range For Each C In ActiveSheet.Range("A1:M55") If C.Interior.ColorIndex = 6 Then '6 - YELLOW C.ClearContents End If Next Next

  • VBA 結合セルの値を削除

    マクロ超初心者です。 C7~K7が結合されたセルの値を削除したいです。(値はC7に入力されています) Range("C7").MergeArea.ClearContents で実行してみたところ 実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーです。 と出てきます。 セルの書式設定をみてみると、保護/ロックにチェックが入っておりました。もしかしたらこれが悪さをしているのでしょうか。 分かりにくくて申し訳ありませんが、知恵を貸していただけたら助かります。よろしくお願いいたします。

専門家に質問してみよう