Excel VBAで売上データをクリアして再表示

このQ&Aのポイント
  • Excel VBAのコードを使用して、売上データをクリアして再表示する方法について教えてください。
  • 特定のデータを除外した後、必要な売上データを印刷するために、Excel VBAの範囲クリアと印刷の処理を行いたいです。また、印刷後にクリアしたデータを再表示する方法も知りたいです。
  • Excel VBAを使用して、売上データをクリアして印刷する際に、必要なデータと除外するデータを選択し、印刷後にクリアしたデータを再表示する方法について教えてください。
回答を見る
  • ベストアンサー

excel vba 範囲をクリアーして再度表示

お世話になります。 シートに縦方向に売上の数字が並んでいます 必要な売り上げと除外する売上をそれぞれ選択し、 まず除外する売上を消去して 必要な売り上げのみ存在している状況で印刷をかけ。 今度は 必要な売上を消去して 除外する売上のみ存在している状況で印刷をかけたく思います。 消去するのはそれぞれ myRng2.ClearContents myRng1.ClearContentsとコードを記載すると できるのですが 印刷をかけた後で 復活させる方法がわかりません。 どうやって記載したらよろしいのでしょうか? お力をお貸しください。 Dim myRng1 As Range '必要売上 Dim myRng2 As Range '除外売上 On Error Resume Next Set myRng2 = Application.InputBox("除外売上を選択して下さい", "セル選択", Selection.Address, Type:=8) If myRng2 Is Nothing Then Exit Sub  myRng2.ClearContents  印刷の処理。   myRng2を復活の処理・・・ここがわかりません     On Error Resume Next Set myRng1 = Application.InputBox("必要売上を選択して下さい", "セル選択", Selection.Address, Type:=8) If myRng1 Is Nothing Then Exit Sub  myRng1.ClearContents   印刷の処理 myRng1を復活の処理・・・ここがわかりません

  • ennkai
  • お礼率54% (284/525)

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

  • ベストアンサー
回答No.5

消去する前に適当な変数に入れて、印刷後に入れておいた値を同じセルに戻すとかで良いんじゃないでしょうか。 strRng2 = Cells(x, y) myRng2.ClearContents 印刷の処理 Cells(x, y) = strRng2

ennkai
質問者

お礼

ご回答ありがとうございました、 教えてくださった内容でうまくいきました。 勉強になりました、感謝です

その他の回答 (5)

回答No.6

んー。 簡単に簡単に済ませようとするなら、 始めに基のシートを複製しておいて、 処理終了のタイミングで戻してやる、 という方法もありますね。 具体的には・・ ・基のシートをCopy ・印刷まで処理 ・基のシートを削除 ・Copyしたシートの名前を基のシートの名前に直す な感じでしょうか。 ただこれだとシートをまたぐ計算をさせているとエラーが出ますので、 後半は ・Copyのデータをコピー、元のデータに貼り付け ・Copyシートを削除 の方が良い可能性もありますね。

ennkai
質問者

お礼

ご回答ありがとうございました。 シートをまたぐ計算式の場合にまで 配慮してくださり感謝です 勉強になりました、感謝です

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

必要とする売上行と必要としない売上行はどのようにしてプログラムで判別するのか。文章にできない判別ルールがあって、人がシートを見て総合的に判断しないとならないのか。 >必要売上を・・はプログラムで指定できるのでは? そういうことが書いてないこの質問は、不完全ではないか。 全データ復活とも関係しているのではないか。 Range1やRange2は人が指定するのか。 セルに覚えておく手もあるが。 質問にデータ例も挙げず、仕組みの解説もなく、プログラムをやる人らしからぬ、おそまつな質問と思う。 もしフィルタでやれる問題なら、 フィルタ1-表示分印刷ー全データ表示ーフィルタ2ー表示分印刷 で仕舞だろう。 >Application.InputBox をなぜ、利用者にさせる必要があるのか? たまたま最近覚えて、使ってみただけではないか?

ennkai
質問者

お礼

「必要とする売上行」と「必要としない売上行」は 人間の判断必要でプログラムでは指定できないので Application.InputBoxを選択いたしました。 (未熟ゆえに、もっと別の素晴らしい方法が おもいつきませんで、申し訳ございません) 回答者様からしたら 「たまたま最近覚えて、使ってみただけではないか? 」 「おそまつな質問と思う。」 とのお叱りを受けるかもしれませんが 日々勉強中でありますので。 質問分に不足している内容がございました点については 率直にお詫びいたしますが、 初心者の頓珍漢な疑問を切り捨てるかのような お言葉を回答に添えて投げかけていただくのは いささか辛く感じてしまいます。

  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.3

追記。 オートフィルタを使うと、表の見た目の大きさが変化してしまうから、表の見た目を変化させたくないので、どうしても、削除と復活でやりたい、と言う場合は、以下のようにして下さい。 1.印刷するシートを「シート丸ごと」、別シートにコピーする。 2.質問者さんのプログラムのように、除外売上で選んだ場所をClearContentsで削除する。 3.印刷する。 4.最初の「1.」でコピーしておいたシートを「シート丸ごと」、元の印刷するシートにコピーする(つまり、2で削除したデータが復活する) 5.質問者さんのプログラムのように、必要売上で選んだ場所をClearContentsで削除する。 6.印刷する。 7.最初の「1.」でコピーしておいたシートを「シート丸ごと」、元の印刷するシートにコピーする(つまり、2で削除したデータが復活する) この処理の「1.」が「復活の為の準備」で、「4.」と「7.」が「復活の処理」になります。

  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.2

>復活させる方法がわかりません。 「復活は不可能」なので、通常、こういうのは「オートフィルター」を用います。 印刷範囲外の表の外に「印刷条件」を書きます。 つまり「条件に合えばTrueに、条件に合わなければFalseになる」ように、値を書き込むのです。 そして、その列を、オートフィルタで隠したり、表示したりするのです。 添付画像のような表で、VBでオートフィルターの表示、非表示を切り替える場合、以下のようにします。 TRUEの物だけ表示する Selection.AutoFilter Field:=1, Criteria1:="TRUE" FLASEの物だけ表示する Selection.AutoFilter Field:=1, Criteria1:="FALSE" それを踏まえて、以下のように書き換えます。 Sub Macro4() Dim myRng1 As Range '必要売上 Dim myRng2 As Range '除外売上 Dim myRng3 As Range '作業用 On Error Resume Next ’オートフィルタで全件表示にする。 Selection.AutoFilter Field:=1 '2~10行目の「I列」をすべてFALSEにする。 Range("I2:I10").Value = False Set myRng2 = Application.InputBox("除外売上を選択して下さい", "セル選択", Selection.Address, Type:=8) If myRng2 Is Nothing Then Exit Sub For Each myRng3 In myRng2 '選択した範囲の「I列」のセルをTRUEにする Cells(myRng3.Row, 9).Value = True Next 'オートフィルタで「I列がTRUEの行」のみを表示する Selection.AutoFilter Field:=1, Criteria1:="TRUE" '除外分の印刷の処理。 ’オートフィルタで全件表示にする。 Selection.AutoFilter Field:=1 '2~10行目の「I列」をすべてFALSEにする。 Range("I2:I10").Value = False Set myRng1 = Application.InputBox("必要売上を選択して下さい", "セル選択", Selection.Address, Type:=8) If myRng1 Is Nothing Then Exit Sub For Each myRng3 In myRng1 '選択した範囲の「I列」のセルをTRUEにする Cells(myRng3.Row, 9).Value = True Next 'オートフィルタで「I列がTRUEの行」のみを表示する Selection.AutoFilter Field:=1, Criteria1:="TRUE" '必要分の印刷の処理。 ’オートフィルタで全件表示にする。 Selection.AutoFilter Field:=1 '念の為2~10行目の「I列」をすべてTRUEにする。 Range("I2:I10").Value = True End Sub この例では、表は「2行目から10行目の範囲」にあり、I列にオートフィルタを設定してあって、I列を「印刷範囲の外」にしてあります。お使いの表の大きさに合わせ、変更して使用して下さい。

ennkai
質問者

お礼

サンプル画像まで添えて詳細な記述を教えて下さり 大変勉強になっております。 オートフィルタを使うと 私が考えているような結果が導きだせるのですね。 つたない質問文の中から 丁寧に教えてくださり 大変感謝です。 今回の件で調べている中で 普通のSUMとは別にSUBTOTALを 初めて知りました。 いろいろと組み合わせて頑張っていきたいと思います。 ありがとうございました

  • dark1983
  • ベストアンサー率44% (30/67)
回答No.1

単純に印刷しないとか表示しないであれば、色を変える方法ではどうですか? 文字色を背景と同じ色にすればいいのではないでしょうか。 背景が白の場合白、表示する場合には黒など Cells(?,?).Font.Color = RGB(255, 255, 255) Cells(?,?).Font.Color = RGB(0,0,0)

ennkai
質問者

お礼

さっそくのご回答ありがとうございます 計算式などが存在しているので 今回は教えてくださった方法は 使えなかったのですが 別件で使わせていただきます 本当にありがとうございました

関連するQ&A

  • EXCEL VBAで空白削除のマクロを作りましたが

    削除されません。 下記のとおりですが、どう考えても動きません、どなたか修正をお願いします。 初心者です。宜しくお願いします。 Sub Ksakujyo() Dim ObjRange As Range On Error Resume Next Set ObjRange = Application.InputBox("削除範囲を選択して下さい。", "印刷範囲", Type:=8) On Error GoTo 0 If ObjRange Is Nothing Then MsgBox "キャンセルされました。" End If If Selection.Count = 1 Then Exit Sub On Error Resume Next Selection.SpecialCells(xlCellTypeBlanks).Delete shift:=xlShiftUp Exit Sub End Sub

  • Excel VBA 実行されないのはなぜ

    いつもお世話になっております。 VBAの練習で以下のような構文を作成し実行すると 構文のサンプルを並べているシートでのみエラーが表示されます。 新規シートでは実行されるので、なぜなのかと思います。 変数名が重複しているということもありません。 思い当たる点がありましたら教えてください。 よろしくお願いいたします。 Sub InputBoxメソッドで選択した範囲を取得する() Dim myselect As Range 'On Error Resume Next Set myselect = Application.InputBox("セル範囲を選択します。", Type:=8) If myselect Is Nothing Then Exit Sub myselect.Value = "test" End Sub

  • VBAで指定したブックを前面に表示するには

    ブックAとブックBがあります。 ブックAのマクロの途中、InputBoxでブックBのセルを選択させて 処理終了後に再びブックAを前面に表示するには どうしたら良いでしょうか? 下記コードを実行したところ、 ブックBが前面になって終了してしまいます。 InputBoxの挙動が関係している気がするのですが、原因がわかりませんでした。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Sub テスト() '※このマクロはブックAに書かれてます Dim rng As Range On Error Resume Next Set rng = Application.InputBox( _ Prompt:="ブックBのセルを選択してください。", _ Type:=8) On Error GoTo 0 If rng Is Nothing Then Exit Sub '~ '~ ここで処理をする '~ MsgBox "処理完了" ThisWorkbook.Activate 'ここでブックAを前面に出したい End Sub ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ExcelはOffice365(バージョン 1902)です。 よろしくお願いします。

  • excelvbaでセルの範囲について

    Sub Macro2() Sheets("売上まとめ").Select '選べる範囲を指定  Set myRng9 = Range("B2:B15") '選択した範囲を myRng1に割り当てる Set myRng1 = Application.InputBox("全部は選択しないで下さい", "必要売上を「B2:B15」から選択", Selection.Address, Type:=8) myRng1.Resize(1, 2).Offset(0, -1).Select  皆様どうかよろしくお願いいたします。 まずB2セルからB15セルの間に数字が入力されています。 上から下に向けて続けて数字が入力されていますが 下の方は空白の場合があります。 (例 B2からB10は入力あり。B11からB15は空白) まず、インプットボックスで数字が入力されている範囲を B2セルから下方向に操作者に選択させます。 (例えばB2からB7まで。) この範囲をmyRng1としています。 目標として選んだ範囲を1列左に拡張させて 選択させたいのですが、 (例 B2だけ    を選択していたらA2からB2まで    B2からB8まで を選択していたらA2からB8まで) その部分を現在 こう記述しております。 myRng1.Resize(1, 2).Offset(0, -1).Select  単一セルだけを選択している場合は キチンと左方向に拡張させて選択できるのですが (例 B2だけ    を選択していたらA2からB2まで) 複数範囲を選択している場合でも同じ結果になってしまいます。 例 B2からB8まで を選択していてもA2からB2まで) どうかよろしくご指導お願いいたします。

  • エクセルVBA/Intersect(Target,~について

    ワークシート上の名前を定義された特定の個所(結合セル)を選択すると、その部分が黄色く変わるマクロです。 一応、動くのですが、例えば印刷範囲を選択などしてしまうと印刷範囲すべてが黄色くなってしまいます。 If Target.Count >1 then Exit Sub だと、結合セルに名前を定義しているので、一ヶ所だけ選択しても色が変わらなくなります。    If Selection.Areas.Count >1 then Exit Sub だと、一遍に連続した範囲を選択してもAreasは1ですからだめです。    Range( "会社名,日付,物件,電話番号,売上高,店名,担当者")の6つの名前を定義された結合セル範囲のなかのどれか一ヶ所だけが選択された場合のみ作動するようにするにはどう書けばよいのでしょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) Set Rng = Range( "会社名,日付,物件,電話番号,売上高,店名,担当者") If Intersect(Target, Rng) Is Nothing Then Exit Sub Rng.Interior.ColorIndex = 2 Selection.Interior.ColorIndex = 6 End Sub

  • 図形のクリアで入力規則の▼が消える

     図形のクリアでG1の入力規則の▼まで一時的に消えてしまいます。コード文でShapesを 用いているのではないかと思いますが、▼で消去を回避する方法が ありましたらお教え願え ますでしょうか? Windows7・SP1 Office2010 Sub 図形のクリア() Dim myRng As Range Dim sp As Variant Set myRng = Range("I10:CW60") For Each sp In ActiveSheet.Shapes If Not Intersect(Range(sp.TopLeftCell, sp.BottomRightCell), myRng) Is Nothing Then On Error Resume Next sp.Delete End If Next Set myRng = Nothing End Sub

  • VBAのinputboxで何もいれずに[OK]を押した時エラーになります

    よろしくお願い致します。 EXCELのVBAで「inputbox」を使ってセルを選択させたいと考えております。 下記のコードだと「キャンセル」や「×」で閉じられた時はmsgbox「キャンセル」が出てExit subするのですが、何も入力しないで「OK」を押した場合がどうしてもエラー(入力した数式は正しくありません)になります。 いろいろ調べて試したのですがどうしてもできず困っています。 どなたか教えてください。 Sub test() Dim myAns As Range On Error Resume Next Set myAns = Application.InputBox(Prompt:="セルを選択してください。", Title:="セル選択", Type:=8) On Error GoTo 0 If myAns Is Nothing Then MsgBox "キャンセル" Exit Sub ElseIf myAns = "" Then MsgBox "最低1つは選択してください" Exit Sub Else MsgBox myAns.Address(0, 0) End If End sub

  • エクセルのマクロ

    セルの値が変わったら動くマクロですが、2つ書くとエラーが出ます。 どのように直したらいいでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address If Intersect(Target, Range("EK22")) Is Nothing Then Exit Sub Else Range("EK24:EM28").Select Selection.ClearContents End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("EK24")) Is Nothing Then Exit Sub Else Range("EK27:EM28").Select Selection.ClearContents End If End Sub

  • ブック全体の検索の次へは?

    ブック全体を検索するマクロ作ったのですが、 ブックの最初にあるものしか見つけられません。 見つかった時に、次の検索を行うにはどのようなVBAになるのでしょうか? よろしくお願いもうしあげます。 Sub KensakuAll() 'ブック内の全シートを検索   Dim myWb As Workbook   Dim mySht As Worksheet   Dim myRng As Range   Dim Key1 As String   Key1 = InputBox("検索キーを入力しなさい")   If Key1 = "" Then Exit Sub   For Each mySht In Sheets     Set myRng = mySht.Cells.Find(what:=Key1)     If Not myRng Is Nothing Then       mySht.Activate       myRng.Activate       Set mySht = Nothing       Set myRng = Nothing       Exit Sub     End If   Next   MsgBox "該当するセルは見つかりませんでした"   Set mySht = Nothing   Set myRng = Nothing End Sub

  • ExcelVBA With~End With構文でまとめられない??

    すみませんがご教示いただければ幸いです。 セル範囲を選択させ、情報を得てから作業するのですが、コードにたくさんSelection(すべて同じ選択範囲)が出てくるのでWith~End Withでまとめようと思いました。 ところが、まとめてもSelectionという表記を省略できたのはほんのわずかです。 ご覧の通り、TypeName(Selection) をはじめIntersect(Selection(1), 等々省略できないのがほとんどです。 Set myRng=Selection でやったとしても、SelectionがmyRngに変わるだけでぜんぜん省略にならないですよね? こんな場合は何か別の省略した書き方があるのでしょうか? Sub test() With Selection If TypeName(Selection) <> "Range" Then 'セル以外をセレクトしてたら MsgBox "セル範囲を選択してください。", vbCritical, " Σ( ̄ロ ̄lll)" Exit Sub End If If Intersect(Selection(1), Range("D4:AY65")) Is Nothing _ Or Intersect(Selection(.Count), Range("D4:AY65")) Is Nothing Then '指定のセル範囲をはみ出てたら ans = MsgBox("はみ出してますがいいんですか?", vbYesNo + vbQuestion, " ( ̄□ ̄; ? ") If ans = vbNo Then Exit Sub End If End If For Each Ln In ActiveSheet.Lines '配置された各直線につき If Not Intersect(Range(Ln.TopLeftCell, Ln.BottomRightCell.Offset(0, -1)), Selection) Is Nothing Then '選択範囲とかぶってたら MsgBox "重複してます!", vbCritical, " ( ̄□ ̄;)!! " Exit Sub End If Next End With '以下、無関係なので略します。 End Sub

専門家に質問してみよう