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

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

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

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

Q&A

解決済

4回答

16656閲覧

VBA セルの初期状態を保持して置いて、処理後にその情報をもとにセルデータを元に戻したいです。

King_of_Flies

総合スコア382

VBA

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

0グッド

0クリップ

投稿2018/01/29 05:34

編集2018/01/29 05:35

現在VBAにて下記のような処理を考えています。

前提 Excelの数式タブ>名前の管理にて、
Range("A1:D3")を"InitDataRange"と命名していることとします。

今回の処理としてテンプレートシートを起点に下記のような処理がループで行われます。

1、テンプレートシートの初期状態を回避
2、テンプレートシートのデータを編集(ここの処理ではいろいろやっていますが、割愛)
3、テンプレートシートを別Bookに出力
4、テンプレートシートを初期状態に戻す

ここで今悩んでいるところが、1の処理と4の処理のところです。

以下、プログラムを見ていただきたく思います。

VBA

1Sub test() 2 '初期状態のRangeを回避します。 3 Dim initRange As Range 4 Set initRange = Range("InitDataRange") 5 '2の処理の代わりに内部データをいじっています。出力処理は割愛。 6 Range("A1").Value = "a" 7 Range("A2").Value = "b" 8 Range("D3").Value = "c" 9  '初期状態に戻します。 10  Range("InitDataRange") = initRange 11End Sub

ここでできていないのが、最終行のRange~の部分です。
もともとデータが入っているのにもかかわらず、この処理を走らせると最終的に
Range("InitDataRange")の範囲は空になってしまします。

Excelの背景色の設定も含めて初期状態を回避し、
最後に戻すという処理を組み込みたいのですが、
簡単なやり方はありますでしょうか。

よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

使える場面が限られますが、以下のようにValueを取得・適用すると、書式データ込みで情報を取得・適用することが出来ます。

XlRangeValueDataTypeは省略できます。

vba

1'保存 2Dim rngDataXML As String 3rngDataXML = initRange.Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet) 4 5'復帰 6initRange.Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet) = rngDataXML

投稿2018/01/29 15:21

imihito

総合スコア2166

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

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

King_of_Flies

2018/01/30 02:49

こちらは便利ですね! 書式コピーも考えていたので助かります。
guest

0

ベストアンサー

テンプレートって?

「テンプレートに直接書き込む」ということ自体に抵抗を感じるので、私もttyp03さんの考え方の方がしっくりきます。

「変更したあと初期状態に戻したい。そのために初期状態を退避しておきたい。」
テンプレートとは、もともとそのために用意するものではないでしょうか。

せっかくテンプレートを用意しているのに、直接書き込んでテンプレートとしては使えなくなってしまうから、書き換える前に退避しておくって、ちょっと無駄を感じます。

テンプレートは参照するだけ

「テンプレートを変更しない」方針で考えると、以下のような処理になると思います。

1、出力用シートを作成する
2、テンプレートシートの内容を出力用シートにコピーする(出力シートの初期化処理)
3、出力用シートのデータを編集(ここの処理ではいろいろやっていますが、割愛)
4、出力用シートを別Bookに出力
5、出力用シートを初期化する(つまり2に戻る)

テンプレートシートの内容は終始参照されるだけで、変更はしません。

出力シートは毎回作成した方がきれいな状態ではじめられそうですが、速度を懸念されるようなら最初に作ったものを使いまわして、毎回テンプレートからのコピペでリセットだけすればよいと思います。

シートをキレイにするという意味で、対象範囲だけでなく以下のようにシート全体のコピペでまるごとリセットしてしまうのも手です。

Dim shTmpl As WorkSheet Dim shOutput As WorkSheet Set shTmpl = Sheets("Template") 'テンプレートシート ※シート名は適当 Set shOutput = Sheets("Output") '出力用シート ※シート名は適当 'シート全体のコピペ shTmpl.Copy shOutput

参考になれば幸いです。

投稿2018/01/29 08:15

編集2018/01/29 08:17
jawa

総合スコア3013

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

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

rinren

2018/01/29 13:13

おっしゃる通りだと思います。テンプレートをコピーして、複製に対して目的の処理をするべきです。 もう少し大きなプログラムになると、やってるうちに、「あれ?どっちがテンプレート」なんて初歩的なミスが生じてくるはずです。(私がそうでした) ちなみに技術的な問題として、ブックを跨ぐ処理を考えておられる場合、ブックオブジェクトも捕捉して、明示してrangeを指定してやらないと、意図しない動作になります。 こんな感じがいいと思います ```vba Set NewBook = Workbooks.Add(xlWBATWorksheet) BaseSheet.Copy After:=NewBook.Worksheets(1) Set TargetWS = NewBook.ActiveSheet ``` 質問者様が、別ブックへの出力を考えておられようでしたので、この形にさせていただきました。
guest

0

範囲をコピーしておいて何やかんやするよりも次のようにしてみてはいかがでしょうか。
0. テンプレートシートを別名で複製
0. 複製したシートを編集
0. 編集したシートを別ブックに移動(コピー?)
0. コピーした場合は複製したシートを削除

投稿2018/01/29 06:11

ttyp03

総合スコア17000

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

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

King_of_Flies

2018/01/29 06:16

出力されるファイルが数百という場合における処理速度が、 シート複製、シート削除の処理分余計にかかってしまうということで、 その方法では行わないという方針になっています。 記述漏れ申し訳ありません。
ttyp03

2018/01/29 07:31

方針でそうなっているのであれば仕方ないですが、画面の更新をオフにして処理すればそれほど時間的な負担にはならないと思いますけどね。 一番いいのは、両方のパターンを作ってどちらがよいかを決めることです。 私が提案した方がそうでない場合に比べて数秒程度の遅れであるなら、作りこみがシンプルな方を採用したほうが余計なバグを仕込む可能性が少なくなるというメリットがあります。 圧倒的な速度差があるなら私の案は却下ですがw
guest

0

VBA

1Range("InitDataRange") = initRange

これだと書式などは対象にならなかったと思います。

コピーメソッドならどうでしょう。

VBA

1initRange.Copy Range("InitDataRange")

投稿2018/01/29 05:49

sazi

総合スコア25300

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

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

King_of_Flies

2018/01/29 05:53

さっそくありがとうございます。 Contentsのコピーはできましたが 罫線のコピーが行われていないという状態です。 これはCopyプロパティで解決できないようです。
King_of_Flies

2018/01/29 06:09

ありがとうございます。 罫線に関しては、参考のURLのようにコピーするよりは、 罫線を再設定するほうが楽そうなので、対処方法としては自前のプログラムで罫線設定することにしました。 ちなみになのですが、セルの条件書式について、 削除方法と、初期状態のセル書式を再設定というような方法はありますでしょうか。
King_of_Flies

2018/01/29 06:11

それとも .Copyは[書式のコピー]なので、セルの条件付き書式についてもコピーされるのでしょうか。
sazi

2018/01/29 06:20

条件付き書式もコピーされたはずです。 条件付き書式の設定については、以下参考に https://www.tipsfound.com/vba/07020 まあ、楽なのはテンプレート作っておいてコピーでしょうけど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問