• 締切済み

VBA 数式を残して値をクリアについて

VBA初心者です。 数式の入った表で、数式を消さずに値のみクリアしたいのですが、、、 Sub 指定のセル範囲の値だけをクリアする() Range("A1:C5").SpecialCells(xlConstants, 23).ClearContents Sheets("Sheet1").Range("A1:C5").SpecialCells(xlConstants, 23).ClearContents End Sub とやってもうまくいきません。 どこか間違っていますか?

みんなの回答

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

こんにちは。 >入力のしかたが間違っているのか、値は消えませんでした。 私は、以下のような書き方をします。 Sub Tests() On Error Resume Next With ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants, 23)  .ClearContents End With End Sub UsedRange は、シートのデータある範囲すべてをカバーします。 しかし、SpecialCells の不思議なところは、1つのセルを対象にして以下のようにしても同じになります。 On Error Resume Next With ActiveSheet.Range("A1").SpecialCells(xlCellTypeConstants, 23)   .ClearContents End With そこで、 With ActiveSheet.Range("A:Z").SpecialCells(... とすると、A列からZ列までの対象とすることも出来ます。 ちなみに、SpecialCells の中の 23 の意味はご存知ですか? XlSpecialCellsValues クラスの   1 xlNumbers  ←引数は、Integer型   2 xlTextValues   4 xlLogical   16 xlErrors ----------------- 合計:23 Dim arg As Integer arg = xlErrors Or xlLogical Or xlNumbers Or xlTextValues とすると、ビット演算で、arg =23 となります。

ryuko0916
質問者

お礼

教えて頂いたとおりにやったらうまくいきました!!! ありがとうございました。(^0^) せっかく教えて頂いた、23の意味はちょっと理解できませんが、、 まだ、基本も分っていない状態ですのでもっと勉強します!

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

こんにちは。 >どこか間違っていますか? 間違ってはいないはずですが、おそらくは、Range("A1:C5") の範囲内に、該当する「値のみ」のデータがないからだと思います。 >Range("A1:C5").SpecialCells(xlConstants, 23).ClearContents 一般的には、こうした狭い範囲ではなく、Cells や Range("A1").CurrentRegion や UsedRange という広範囲にしたほうが良いのですが、それでも、見つからないことがありますから、その場合に備えて、#1 さんのおっしゃる On Error トラップを設けます。

ryuko0916
質問者

お礼

ちゃんと動きました。 確かに、今は勉強のためにやっているので狭い範囲でやっていました。 実際の仕事では、もっと広い範囲を使ってデータの範囲は常に変わったりします。 教えていただいている、 Range("A1").CurrentRegion や UsedRange で試しましたが、入力のしかたが間違っているのか、値は消えませんでした。もし、お願いできるようでしたら#1の方の、 On Error Resume Next Range("A1:C5").SpecialCells(xlCellTypeConstants, "23").ClearContents End Sub でどのように変えたらいいか教えていただけないでしょうか...??? よろしくお願いいたします。m(_ _)m

回答No.1

テストしてみました。 Sub 指定のセル範囲の値だけをクリアする() On Error Resume Next Range("A1:C5").SpecialCells(xlCellTypeConstants, "23").ClearContents End Sub ちゃんと動きます。 うまくいきません。は具体的にどのようになるのですか? エラーになる?クリアされない? A1:C5に入っている数式は、A1:C5の範囲外を参照していませんか? 範囲外の参照されるセルもクリアしないとだめです。 範囲内のセルに値が入っていないと、(クリアした直後など) 「該当するセルが見つかりません。」 のエラーが出ますので、 On Error Resume Next を付けました。 expression.SpecialCells(Type, Value) のTypeにxlConstants でも動きましたが、 ヘルプで説明されているように、xlCellTypeConstants にしました。

ryuko0916
質問者

お礼

教えていただいたとおりにやったところ ちゃんと動きました!!! どうもありがとうございました!助かりました。

関連するQ&A

  • アクティブでない複数のシートのセルのコンテンツを一度でクリアしたい

    エクセルVBAで、アクティブでない複数のシートの所定のセルのコンテンツを一度でクリアしたいのですが、 現在アクティブではないシートをアクティブにしないでclearcontentsするとアプリ定義、オブジェクト定義エラーになってしまいます。 それぞれのシートをアクティブにしないとclearcontentsできないのでしょうか? どなたか教えてください。よろしくお願いします。 ------------------------------------------------------------------------------- Sub CLEAR_CONTENTS() Sheets(\"1\").Range(Cells(6, 3), Cells(6, 8)).ClearContents Sheets(\"2\").Range(Cells(6, 3), Cells(6, 8)).ClearContents Sheets(\"3\").Range(Cells(6, 3), Cells(6, 7)).ClearContents End Sub

  • 特定の文字(値)だけをクリアしたい

    現在、以下のようなVBAコードを使ってシート内にクリアボタンを作っています。(先日こちらでご教授いただきました) Sub クリア() ActiveSheet.Cells.SpecialCells(xlCellTypeConstants, 23).ClearContents End Sub このコードはシート内のすべての文字(値)を削除します。 管理番号   ←セルの保護をしています ****  ←保護していません 型番     ←保護をしています ****  ←保護していません ****の部分だけを削除したい場合、似たようなやり方では可能でしょうか? ちなみにこの時点で上記コードのクリアボタンを押すと、保護を解除しなさいという、メッセージが出てきます。 保護をしつつ、クリアしたいのですが恐縮ですがご教授ください。

  • シートの移動又はコピー したシートの値のクリアー

    WINDOWS XP EXCELL 2003です。 「値のクリァー」のマクロはすでに、 ここで御指導いただいたマクロは下記です。 http://okwave.jp/qa/q6663748.html Sub Clear() On Error Resume Next range("H2,G4,C10,C15,F15,G15").SpecialCells(xlCellTypeConstants).ClearContents End Sub 上記マクロは「納請書3」にそうにして「シート追加」で「納請書4」作成したところ下記のマクロを実行すると「納請書3」のシートの値がクリアーになります。 御指導いただきたいのは既に「納請書3」値が有りこれはクリアーしたくありません。 新たにシートを追加してゆくと前のシートの値か残り追加シートの値をクリアーするにはクリアーは可能でしょうか。 もし可能ならば「値のクリアー」のマクロをどう変更すればいいのかご教授いただけないでしょうか。 よろしく御願いします。 ※ 参考で既に「納請書3」のシートには下記マクロの2点が登録しています。 1  「シートの追加」のマクロが下記です。 Sub シートの追加()    Dim NewNo As Integer   NewNo = Sheets("月請求書").Index Sheets("納請書3").Copy Before:=Sheets("月請求書")   ActiveSheet.Name = "納請書" & NewNo   ActiveSheet.Range("G4").Value = "" End Sub 2  日付とシート表示の色付け    Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$10" Then Target.Offset(-6, 2).Value = Date End If If Target.Address = "$G$15" Then ActiveSheet.Tab.ColorIndex = 49 End If End Sub

  • オールクリアボタン VBA どこが間違ってるの?

    VBA初心者です。 設定、部品1、部品2、部品3、部品4と4つのシートがあります。 設定シートにオールクリアボタンを設置し各シートの値だけをクリアする ようにしたいのですが、「subまたはfunctionが定義されていません」という エラーが出てしまいます。 間違ってる箇所とうまくいく方法を教えていただけませんでしょうか? 記述は以下のとうりです。 ちなみにエクセルを開くと全シート保護という設定にしているので まずその解除をしてオールクリアしてまた保護といううふうにしたいです。 Private Sub CommandButton1_Click() '全シート保護解除 Dim sh As Worksheet For Each sh In Worksheets sh.Unprotect Next sh '範囲選択 With Worksheet("部品1").Select Cells.Select 'シートの値だけをクリアする Selection.SpecialCells(xlConstants, 23).ClearContents End With '範囲選択 With Worksheet("部品2").Select Cells.Select 'シートの値だけをクリアする Selection.SpecialCells(xlConstants, 23).ClearContents End With '範囲選択 With Worksheet("部品3").Select Cells.Select 'シートの値だけをクリアする Selection.SpecialCells(xlConstants, 23).ClearContents End With '範囲選択 With Worksheet("部品4").Select Cells.Select 'シートの値だけをクリアする Selection.SpecialCells(xlConstants, 23).ClearContents End With '全シート保護 For Each sh In Worksheets sh.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True Next sh End Sub 以上です、よろしくお願いします。

  • VBAのセルのClearについて

    VBA超初心者で、困っていることがあります;; たとえば、プログラムを実行したら、セルの「A1~D3」の範囲をクリアするという物があったとして、 その他の条件が以下のようになっています。 (1)クリアしても、セル内の数式を保持 (2)クリア対象のセルの罫線は残す 私は、以下のように記述したのですが、数式は残るのですが罫線が残りませんでした。 Sheets("シート名").Range("A1:D3").ClearFormats 数式を保持し、罫線を残すようにするには、どのような記述をすれば良いのでしょうか。 以上、よろしくお願いいたします。

  • エクセルVBAで保護シートの数式取得

    ワークシートが保護されていても、そのセルA1にある数式をVBAで取得する場合 Sub test01() MsgBox Sheets("Sheet1").Range("A1").Formula End Sub でできます。 しかし、このセルが書式設定で、「保護」→「表示しない」にチェックをいれられていると「実行時エラー1004」となり取得できません。 パスワードがわかっていれば保護を解除して問題はないのですが、わからない場合、数式を取得する方法はないでしょうか?

  • ExcelでVBAで選択範囲の値のみを挿入

    始めて質問いたします。よろしくお願いします。 Excel2010にて作成された選択範囲(Sheet1)のセルを同じブックの別シート(Sheet2"A1:AB20")で参照しています。その参照部分をVBAにてコピーして、そのすぐ下("A21:AB40")に挿入していきます。自分で作成したコードでは、数式もコピーするので当然参照しているセルからずれてしまいます。(Sheet1)の数値はその度に変わりますので絶対参照にすることもできません。 作成したVBAに値のみをコピーするコードを追加したいので教えて下さい。 Private Sub CommandButton1_Click() Sheets("Sheet2").Range("A1:AB20").Copy Sheets("Sheet2").Range("A21:AB40").Insert Shift:=xlDown Application.CutCopyMode = False End Sub このコードだと、参照している "A1:AB20" がテキストなどの場合はうまくいきます。数式が入っていると当然ですが、数式をコピーしてしまいます。 いろいろなサイトを見ていると Paste:=xlPasteValues  が、値のみペーストだと書いてありますが、適応の仕方がわかりません。 Insert の場合はどうなるのかもわかりません。 同じような質問も探しましたが見つからなくて困っています。 よろしくお願いいたします。

  • VBA複数シート選択で数式以外削除

    Excel2013です。 下記コードのように、シートを何枚か選択して、セルを削除するのですが、セルに打ってある、('最初の数式以外を削除)するコードでは1ページ目しか削除されません。その下に書いてある('セルクリア)のコードだときれいに消えるのですが、数式を追加した時見直さないといけないのと、指定まちがいで数式まで消してしまう可能性が高くなります。 グループ化した状態でも選択しているシートの数式以外を削除する方法がありますか? Sub データ消去() 'Sheets(Array("Sheet1", "Sheet2", "Sheet3)).Select ' 数式以外は削除(グループ化した時1ページしか削除できない?) Range("C8:Z85,AC8:AF85,Q1:X3").SpecialCells(xlCellTypeConstants, xlNumbers + xlTextValues). 'セルクリア 'Range("C8:E85,G8:I85,K8:M85,O8:Q85,S8:U85,W8:Y85,AC8:AE85,Q1:X3").Select 'Selection.ClearContents End Sub

  • Excel 関数を残したままクリアしたい VBA

    セルA3からP34の範囲をクリアしたいのですが、関数までクリアしてしまっています。 Sub CellClear() Range("A3:P34").ClearContents End Sub 関数を残したまま数値だけクリアしたいのです。

  • VBAで列全てに式を入れたいんです。

    エクセルで 例えばセルA1,B1,C1を選択して 3つのセルの値をD1に値としてコピーする事は出来ませんか? A1,B1,C1はVBAで得た値です。 関数で1つにすると、もう一度コピーして値として 貼り付けなけねばなりませんので・・・ VBAは他の方に作成して頂いたので、 知識としてはありません。 VBAでの追加の仕方があればお教え下さい。 下記の回答を頂きまして 上手くいったのですが、 その式を、列全てで行うのはどうすればいいのでしょうか? 「 次のコードをEnd Subの上の行に挿入してください With Sheets("シート名") .Range("D1") = .Range("A1") & .Range("B1") & .Range("C1") End with 」 すみません。誰かお教え下さい。

専門家に質問してみよう