質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2137閲覧

VBAでセルをクリアする場合

shinyakita

総合スコア39

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/07/16 04:10

編集2019/07/17 00:30

Excel VBAでデータシートから納品日、納品先毎に発注明細を1票にし印刷するマクロを作成中です。

印刷シート(Dim ResulSheet)は罫線等で印刷フォームを作っております。
改ページ時に明細行をクリアして、ヘッダーを書き換える処理を行っております。
クリアする理由はヘッダー情報により明細行数(可変)が異なる為、前情報が残らないようにしております。

次のマクロを実行すると罫線も消えてしまいました。
数値だけクリアすることはできないのでしょうか?

For i = 2 To LastCell If ResultSheet.Range("B3") = DataSheet.Range("E" & i) And _ ResultSheet.Range("B1") = DataSheet.Range("G" & i) Then 'オーダーフォームに明細コピー 'ロット番号 DataSheet.Range("H" & i).Copy ResultSheet.Range("C" & Copy).PasteSpecial '商品名 DataSheet.Range("L" & i).Copy ResultSheet.Range("F" & Copy).PasteSpecial '規格 DataSheet.Range("M" & i).Copy ResultSheet.Range("G" & Copy).PasteSpecial '入数 DataSheet.Range("N" & i).Copy ResultSheet.Range("H" & Copy).PasteSpecial '賞味期限 DataSheet.Range("J" & i).Copy ResultSheet.Range("I" & Copy).PasteSpecial '出荷数(ケース) DataSheet.Range("O" & i).Copy ResultSheet.Range("J" & Copy).PasteSpecial '出荷数(バラ) DataSheet.Range("P" & i).Copy ResultSheet.Range("K" & Copy).PasteSpecial Copy = Copy + 1 'コピー明細改行 Else '印刷 'Out.Activate 'Out.PrintOut Copies:=1, Collate:=True, _ ' IgnorePrintAreas:=False 'ヘッダー情報更新 '納品日 DataSheet.Range("G" & i).Copy ResultSheet.Range("B1").PasteSpecial '納品日先コード DataSheet.Range("E" & i).Copy ResultSheet.Range("B3").PasteSpecial '納品日先 DataSheet.Range("F" & i).Copy ResultSheet.Range("D3").PasteSpecial 'ループ処理1回戻す i = i - 1 'コピー開始明細行リセット Copy = 7 '明細行クリア ResultSheet.Activate Range("C7").Select Range(Selection, Selection.End(xlDown)).Select Selection.ClearContents Range("F7:K7").Select Range(Selection, Selection.End(xlDown)).Select Selection.ClearContents End If Next

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Secret

2019/07/16 05:20

質問者さんが掲載されているコードを実行しても罫線は消えないと思います。 別の部分で怪しいところはないですか?
shinyakita

2019/07/16 07:06

返信ありがとうございます。 この箇所がと思いこんでました。 別の怪しいところを探してみます。
guest

回答2

0

ベストアンサー

vba

1DataSheet.Range("G" & i).Copy 2ResultSheet.Range("C" & Copy).PasteSpecial

のように PasteSpecial の引数を省略すると、既定値の XlPasteAll(書式も含めてすべてコピー)になりますのでコピー元に罫線がなければペースト先の罫線も消えてしまいますね。
値のみの貼り付けなら、xlPasteValues を指定してください。

vba

1DataSheet.Range("G" & i).Copy 2ResultSheet.Range("C" & Copy).PasteSpecial xlPasteValues

参考リンク
形式を選択して貼り付ける(PasteSpecialメソッド):Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

改善案

値だけのコピー&ペーストでいいのなら、Copy、PasteSpecial を使うより、Valueの代入を使った方がシンプルかつ高速です。

vba

1ResultSheet.Range("C" & Copy).Value = DataSheet.Range("G" & i).Value

さらに、コードを読んでみると、連続したセル範囲のコピぺのようなので、For...Next で1セルずつコピぺせずに、 セル範囲をまとめて代入することもできます。こちらの方がさらにシンプルかつ高速です。

vba

1ResultSheet.Range("C" & Copy & ":C" & LastCell + Copy - 2).Value _ 2= DataSheet.Range("G2:G" & i).Value

投稿2019/07/16 17:34

編集2019/07/17 00:18
hatena19

総合スコア34343

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinyakita

2019/07/17 00:01

hatena19様 丁寧なご回答ありがとうございます。 コピー部分についてもご指摘頂きありがとうございます。 罫線が解決した後、動作が遅いコピー部分に改良を考えておりました。 コピーではなくvalueでセル内容を取得し書き込むことができるのですね。 valueはセルにエクセル関数等をセルに書き込む場合に使うものかと思っておりましたが、取得することも可能なのですね。 大変助かりました。
hatena19

2019/07/17 00:19

解決できてなによりです。 後から見た人のために、コメントのコードを質問の方に追記しておいてください。
shinyakita

2019/07/17 00:26

ありがとうございました。 本当に助かりました。 コードもコピーしておきます。
guest

0

Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents

これだと指定範囲のもの全てをクリアしてしまうかとおもわれます。

セル/行/列を挿入する(Insertメソッド)
対象セル範囲と同じサイズの空白セルを挿入します。
構文 Object.Insert(Shift, CopyOrigin)

.Insert Shift:=xlDownで空白を挿入してみては
いかがでしょう?

投稿2019/07/16 06:10

nanami12

総合スコア1015

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinyakita

2019/07/16 07:10

返信ありがとうございます。 私の持っている書籍だと「値のクリア」にSelection.ClearContentsを使うと記載されておりました。 これだと罫線も消えてしまうのですね。 空白で埋める手がありましたね。 書き換えてみます。
hatena19

2019/07/16 10:20

ClearContents で値は消えますが、罫線は消えません。Clear なら罫線も消えますが。 Insert は空白行または空白列の挿入ですので、質問者さんのやりたいこととは違うように思います。
nanami12

2019/07/16 11:36

お役に立てずしつれいしました
shinyakita

2019/07/16 12:18

hatena19さん ありがとうございます。 やはり別のところに問題がありそうですね。 一つ一つ動きを確認しながら探してみます。 nanami12さん ありがとうございます。 これはこれは他に使えると思います。
shinyakita

2019/07/16 12:32

元データを印刷フォームにコピーするコードですが 元データ(CSV)には罫線がないのでその為クリア時でなく コピー時に消えていた可能性があります。 まだ、検証はできておりませんのでお知恵をお貸し下さい。 今更ですが、作成している間に行数が不定なので、印刷する手前で罫線を入れないと、空白ページが出てきてしまうことに気が付きました。新たな問題が発生してしまいました。 ----コピーのコード---- For i = 2 To LastCell If ResultSheet.Range("B3") = DataSheet.Range("E" & i) And _ ResultSheet.Range("B1") = DataSheet.Range("G" & i) Then 'オーダーフォームに明細コピー 'ロット番号 DataSheet.Range("H" & i).Copy ResultSheet.Range("C" & Copy).PasteSpecial '商品名 DataSheet.Range("L" & i).Copy ResultSheet.Range("F" & Copy).PasteSpecial '規格 DataSheet.Range("M" & i).Copy ResultSheet.Range("G" & Copy).PasteSpecial '入数 DataSheet.Range("N" & i).Copy ResultSheet.Range("H" & Copy).PasteSpecial '賞味期限 DataSheet.Range("J" & i).Copy ResultSheet.Range("I" & Copy).PasteSpecial '出荷数(ケース) DataSheet.Range("O" & i).Copy ResultSheet.Range("J" & Copy).PasteSpecial '出荷数(バラ) DataSheet.Range("P" & i).Copy ResultSheet.Range("K" & Copy).PasteSpecial Copy = Copy + 1 'コピー明細改行 Else '印刷 'Out.Activate 'Out.PrintOut Copies:=1, Collate:=True, _ ' IgnorePrintAreas:=False 'ヘッダー情報更新 '納品日 DataSheet.Range("G" & i).Copy ResultSheet.Range("B1").PasteSpecial '納品日先コード DataSheet.Range("E" & i).Copy ResultSheet.Range("B3").PasteSpecial '納品日先 DataSheet.Range("F" & i).Copy ResultSheet.Range("D3").PasteSpecial 'ループ処理1回戻す i = i - 1 'コピー開始明細行リセット Copy = 7 '明細行クリア ResultSheet.Activate Range("C7").Select Range(Selection, Selection.End(xlDown)).Select Selection.ClearContents Range("F7:K7").Select Range(Selection, Selection.End(xlDown)).Select Selection.ClearContents End If Next
hatena19

2019/07/16 16:55

質問は編集することができますので、そのコードを質問の方に追記してください。
shinyakita

2019/07/16 23:52

hatena19様 大変失礼致しました。 気をつけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問