- 締切済み
EXCELの更新された部分だけリストしたい
2つのEXCELファイルがあって、片方のシートの中のどこかのセル(複数)を更新して保管しただけのファイルが残った方です。 この2つのファイルを後から比較して、更新されたセルだけ、更新前の値と更新後の値を添えて自動的に拾いたいのですが、便利な方法はありますか? 関数を使ってもよいのですが、たとえば更新前と更新後(ファイル名も変更)のファイルを同一フォルダに入れて、何か実行ファイルを起動すると差分リストが即座にできるようなのも理想です。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Chiquilin
- ベストアンサー率30% (94/306)
「差分リスト」がどんなものかよく分かりません。 とりあえず編集する前に ファイルに[変更履歴の記録]を付けとい たらどうですか?
- HohoPapa
- ベストアンサー率65% (455/693)
>このVBAを実行する方法を知らず、 >もし可能でしたらそれが簡単にわかるようなサイトでも >ご紹介いただけないでしょうか。 https://excel-ubara.com/excelvba1/ これがいいと思います。 この第7回までを学習すれば 今回提示したコードを標準モジュールに貼り付け 実行することができるようになります。 個人差があるかもしれませんが おそらく、30分を超えることはありません。 第8回以降は、後でゆっくり取り組むこととし、 躓いたら、 okwaveで都度聞いてしまうというのもアリだろうと思います。
- HohoPapa
- ベストアンサー率65% (455/693)
>片方のシートの中のどこかのセル(複数)を更新して という作業には、 ・セルの値を書き換える ・計算式を修正する。 ・罫線など書式を変える などいろいろと考えられますが ・セルの値を書き換える ・計算式を修正する。 この2つに限定してよければ かつ、VBAでよければ 以下のようなコードはいかがでしょうか。 よかったら参考にしてください。 Sub sample() '2つのブックを比較し、差分を自ブックのシート1枚目に列挙する。 Dim BefBook As String Dim AftBook As String Dim BefSheet As Worksheet Dim AftSheet As Worksheet Dim wkCol As Integer Dim wkRow As Integer Dim wkRange As Range Dim PutLineNum As Integer Dim SheetNum As Integer Dim BefFile As String Dim AftFile As String Const intvalCols = 5 BefFile = Application.GetOpenFilename("Microsoft Excelブック,*.xlsx") If BefFile <> "False" Then Workbooks.Open BefFile BefBook = ActiveWorkbook.Name Else Exit Sub 'ファイルを指定しなかったら抜ける End If AftFile = Application.GetOpenFilename("Microsoft Excelブック,*.xlsx") If AftFile <> "False" Then Workbooks.Open AftFile AftBook = ActiveWorkbook.Name Else Workbooks(BefBook).Close Exit Sub 'ファイルを指定しなかったら抜ける End If If Workbooks(BefBook).Sheets.Count <> Workbooks(AftBook).Sheets.Count Then MsgBox ("シート数が不一致") Workbooks(BefBook).Close Workbooks(AftBook).Close Exit Sub End If ThisWorkbook.Sheets(1).Cells.ClearContents For SheetNum = 1 To Workbooks(BefBook).Sheets.Count Set BefSheet = Workbooks(BefBook).Sheets(SheetNum) Set AftSheet = Workbooks(AftBook).Sheets(SheetNum) If BefSheet.Name <> AftSheet.Name Then MsgBox ("シート名不一致 " & BefSheet.Name & "/" & AftSheet.Name) Workbooks(BefBook).Close Workbooks(AftBook).Close Exit Sub End If With ThisWorkbook.Sheets(1) .Cells(1, ((SheetNum - 1) * intvalCols) + 1).Value = BefSheet.Name .Cells(2, ((SheetNum - 1) * intvalCols) + 1).Value = "行番号" .Cells(2, ((SheetNum - 1) * intvalCols) + 2).Value = "列番号" .Cells(2, ((SheetNum - 1) * intvalCols) + 3).Value = "値Bif" .Cells(2, ((SheetNum - 1) * intvalCols) + 4).Value = "値Aft" PutLineNum = 3 For Each wkRange In BefSheet.UsedRange wkCol = wkRange.Column wkRow = wkRange.Row If wkRange.Formula <> AftSheet.Cells(wkRow, wkCol).Formula Then .Cells(PutLineNum, ((SheetNum - 1) * intvalCols) + 1).Value = wkRow .Cells(PutLineNum, ((SheetNum - 1) * intvalCols) + 2).Value = wkCol If wkRange.HasFormula = True Then .Cells(PutLineNum, ((SheetNum - 1) * intvalCols) + 3).Value = "'" & wkRange.Formula Else .Cells(PutLineNum, ((SheetNum - 1) * intvalCols) + 3).Value = wkRange.Formula End If If AftSheet.Cells(wkRow, wkCol).HasFormula = True Then .Cells(PutLineNum, ((SheetNum - 1) * intvalCols) + 4).Value = _ "'" & AftSheet.Cells(wkRow, wkCol).Formula Else .Cells(PutLineNum, ((SheetNum - 1) * intvalCols) + 4).Value = _ AftSheet.Cells(wkRow, wkCol).Formula End If PutLineNum = PutLineNum + 1 End If Next wkRange End With Next SheetNum Workbooks(BefBook).Close Workbooks(AftBook).Close End Sub
- imogasi
- ベストアンサー率27% (4737/17069)
以下は、シートのセルの文字・数値の情報に限って議論する。 (1)VBAなどのプログラムを組めること。 (2)シートにキー情報(何に関して情報を集めているか=>キー、及びユニークであるか=>別物・別人に同じキーが振られてないこと。氏名とか社員番号とか商品コードなどは別物や別人には同じもの(コード、固有名称)を振らないはず。)があること。 (1)(2)の条件を満たせば、初歩的なプログラムで(マッチングのプログラムで)変わった項目と変更後の内容をリスト(列挙)できる。その際、並び順を、両シートで、上記キー順に並べて比較する。 その後当初のデータ順に戻すことも、工夫すれば簡単。 ーー これを「既製ソフト」にしたものも、探せば出てくる可能性が多い。 ーー この方法は、キーというものを考えにくいところの、ワードで作る文章などでは、比較位置を決めることが、原理的にむつかしい。2文書の中対比する箇所や・変更箇所を見つける箇所をどう決めるか、がはっきりしておれば、役立つ資料(2文書)比較表が作れるだろう。
- msMike
- ベストアンサー率20% (364/1804)
ひょっとして下記が参考になるかも。 https://oshiete.goo.ne.jp/qa/2075852.html それ、12年前の投稿ですが、私の[回答2]に本日現在で「good 47件」が付いてます。 また、質問と[No.1]の間の[このQ&Aに関連する最新のQ&A]も見落としなく。
お礼
まことにありがとうございます。もともと計算式は入っていないシートなので、値がかわっているところだけ知りたいので、これを使ってみようと思います。情けないことに、このVBAを実行する方法を知らず、もし可能でしたらそれが簡単にわかるようなサイトでもご紹介いただけないでしょうか。