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

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

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

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

Q&A

解決済

4回答

1004閲覧

データファイルと印刷したハードの内容をチェックする機能

maguzo

総合スコア57

VBA

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

0グッド

0クリップ

投稿2018/11/09 02:40

現在、社内でエクセルデータと紙面双方を提出する書類を求めており
これらの2つの内容が一致することをチェックする機能を検討しておりました。

そこでファイルの最終更新日に着目して、

Vba

1Application.Volatile 2Cells(1,1).value= ThisWorkbook.BuiltinDocumentProperties("Last save time").Value

で書類を受取った担当者が受取ったエクセルデータの最終保存日とこれを出力した紙面のA1に記載されているYYYYDDMM 時間:分
が一致していれば同じものとみなす(秒単位はあきらめる)方法を想定したいたのですが
ユーザーが印刷してから時間を空けて保存する可能性もあるため、有効な手段ではないとわかりました。

目的としては
データと紙面が一致して(であろう可能性が高い)いることを目視できることです。
*もちろん完全にはできないので、ある程度の確からしさを得たいということになります。
上記の方法は、印刷してから保存するまで間が空くことは一般的に想定されるため
ある程度の確からしさが得られないだろうという結論でした。

これは無理だろうとは思ってはいるのですが、、
なにか、一般的によく使われる方法やアドバイスがあればうれしいです。

宜しくお願い申し上げます。

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

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

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

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

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

guest

回答4

0

ベストアンサー

案1
ファイル更新日だけでなく、印刷日も埋め込むようにする。
印刷前にWorkbook_BeforePrintイベントが発生するので、そのタイミングでセルに日時を書き込む。
そうすると、Excelと書面で印刷日は一致していないといけないのは当然で、更新日はずれます(Excelの方が新しくなる)。
この差が極端に空いていれば印刷後何か改ざんしたとみなすとか。

案2
更新日ではなくハッシュ値を埋め込む。
図形や装飾などは対象外になってしまいますが、特定のセル範囲の値のハッシュ値を求めて更新日の代わりに埋め込みます。

標準モジュールに以下のハッシュ値計算処理を追加。

VBA

1Function SHA1(r As Range) As String 2 Dim Enc As Object, Prov As Object 3 Dim Hash() As Byte, i As Integer 4 Dim s As String 5 Dim c As Range 6 7 s = "" 8 For Each c In r 9 s = s & c.Text 10 Next 11 12 Set Enc = CreateObject("System.Text.UTF8Encoding") 13 Set Prov = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider") 14 15 Hash = Prov.ComputeHash_2(Enc.GetBytes_4(s)) 16 17 SHA1 = "" 18 For i = LBound(Hash) To UBound(Hash) 19 SHA1 = SHA1 + Hex(Hash(i) \ 16) + Hex(Hash(i) Mod 16) 20 Next 21End Function

印刷前と保存前のイベントで上記処理を使ってハッシュ値を埋め込む。

VBA

1Private Sub Workbook_BeforePrint(Cancel As Boolean) 2 With Worksheets("Sheet1") 3 .Cells(1, 1).Value = SHA1(.Range("A2:Z100")) 4 End With 5End Sub 6 7Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 8 With Worksheets("Sheet1") 9 .Cells(1, 1).Value = SHA1(.Range("A2:Z100")) 10 End With 11End Sub

投稿2018/11/09 04:44

ttyp03

総合スコア16996

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

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

maguzo

2018/11/09 05:27

コメント有難うございます。 Workbook_BeforePrintイベントがあることを初めて知ったので非常に勉強になりましたが、なによりハッシュ値で比較する発想に脱帽です。 もちろん、何回も印刷されて、どのバージョンが紙で提出されたかわからなないという、ケースもなくはないですが、かなり高い確からしさが得られそうです! 是非、採用してみたいと思います
guest

0

使ったことはありませんが、エクセルには「署名」の機能があります

署名はある時点の文書内容を保証するもので、署名をセットすると、その後なにか編集しようとすると署名削除を要求されます

編集そのものを防ぐことはできませんが、署名が有効であればある時点から誰も手を加えていないということをある程度は保証できそうです
(「なりすまし」ができてしまう場合はどうにもならないですが、、、)

一案としてご検討されてみてはいかがでしょうか

投稿2018/11/09 03:23

takito

総合スコア3111

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

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

maguzo

2018/11/09 05:31

コメント有難うございます。 Workbook_BeforePrintイベントと署名の組み合わせで、解決策があるかもしれません。私も署名機能を使ったことがないため、この機会に調べてみようと思います
guest

0

紙での提出を止めて、Excelファイルのみの提出にすればチェック自体が不要じゃないでしょうか?
印刷は受け取った時点もしくは必要な時に行います。
場合によっては複合機などを増やす必要があると思いますが、人件費よりはよっぽど安いはずです。

投稿2018/11/09 04:12

hihijiji

総合スコア4150

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

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

maguzo

2018/11/09 05:29

コメント有難うございます。 ご指摘は最もですが、現況の運用上両者の提出は避けられない状況です。もちろん。運用自体の変更がベストではございます
guest

0

ユーザーが印刷してから時間を空けて保存する可能性もあるため

保存してから印刷するルールに徹底すればどうですか。
若しくは保存時に自動で印刷するとか、印刷したら編集ロックするとか。

社内でエクセルデータと紙面双方を提出する書類

単に電子データと紙面という事ならPDFにするという事では駄目なんでしょうか。

一致させる事を厳密にするためには、それなりのプログラムによる制御がどうしても必要だと思います。
そうしないなら、運用ルールを徹底するしかないのではないでしょうか。
※エクセルデータだけ提出して、受領側で印刷するとか。

投稿2018/11/09 03:07

編集2018/11/09 12:42
sazi

総合スコア25138

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

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

maguzo

2018/11/09 05:35

コメント有難うございます。紙面出力者の直筆署名が必要等事情があり、作成者本人以外が出力する運用は煩雑さが伴う問題があります。 ご指摘のとおり、運用上解決すべき問題点も多分にあるので、アドバイスに基づき検討をしたいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問