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

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

ただいまの
回答率

89.05%

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 380

maguzo

score 57

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

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

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


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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+3

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

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

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

Function SHA1(r As Range) As String
    Dim Enc As Object, Prov As Object
    Dim Hash() As Byte, i As Integer
    Dim s As String
    Dim c As Range

    s = ""
    For Each c In r
        s = s & c.Text
    Next

    Set Enc = CreateObject("System.Text.UTF8Encoding")
    Set Prov = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider")

    Hash = Prov.ComputeHash_2(Enc.GetBytes_4(s))

    SHA1 = ""
    For i = LBound(Hash) To UBound(Hash)
        SHA1 = SHA1 + Hex(Hash(i) \ 16) + Hex(Hash(i) Mod 16)
    Next
End Function


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

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    With Worksheets("Sheet1")
        .Cells(1, 1).Value = SHA1(.Range("A2:Z100"))
    End With
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    With Worksheets("Sheet1")
        .Cells(1, 1).Value = SHA1(.Range("A2:Z100"))
    End With
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/09 14:27

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

    キャンセル

+1

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/09 14:31

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

    キャンセル

0

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/09 14:35

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/09 14:29

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

    キャンセル

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

  • ただいまの回答率 89.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る