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

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

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

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

Q&A

解決済

1回答

421閲覧

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

maguzo

総合スコア57

VBA

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

0グッド

0クリップ

投稿2018/11/12 03:03

度々恐れ入ります、
先日掲題の件について、以下のとおり質問させて頂きました。

前回の質問内容

ご意見を活かしつつ

  1. 印刷直前のハッシュ値を取得する(Workbook_BeforePrint)
  2. ブックを閉じる直前のハッシュ値を取得する(Workbook_BeforeClose)

3)2)のCloseイベント時にハッシュ値に相違があればMsgBoxで確認という流れを想定しているのですが、

  1. について以下のコードを作成したのですが

正しく処理されません(ws.Cells(1, 1).Value = SHA1/MsgBox SHA1が印刷時にいずれも出力されない)

どこに問題点があるか分からなかったため、ご質問させて頂きました。
アドバイスを頂ければ幸いです。

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

vba

1Private Sub Workbook_BeforePrint(Cancel As Boolean) 2 3Dim wb As Workbook 4Dim ws As Worksheet 5 6Set wb = Workbooks("申請書") 7Set ws = wb.Worksheets("入力") 8 9Dim Enc As Object, Prov As Object 10Dim Hash() As Byte, i As Long 11Dim s As String 12Dim c As Range 13Dim dc As Range 14Dim SHA1 As String 15 16c = ws.Range("C:CE") 17s = "" 18 19For Each dc In c 20s = s & dc.Text 21Next 22 23 Set Enc = CreateObject("System.Text.UTF8Encoding") 24 Set Prov = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider") 25 26 Hash = Prov.ComputeHash_2(Enc.GetBytes_4(s)) 27 28 SHA1 = "" 29 For i = LBound(Hash) To UBound(Hash) 30 SHA1 = SHA1 + Hex(Hash(i) \ 16) + Hex(Hash(i) Mod 16) 31 Next 32 33 ws.Cells(1, 1).Value = SHA1 34 MsgBox SHA1 35 36 37End Sub 38

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

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

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

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

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

guest

回答1

0

ベストアンサー

VBA

1Private Sub Workbook_BeforePrint(Cancel As Boolean) 2 Dim prom As Long 3 4 With ThisWorkbook 5 If .Saved = False Then 6 prom = MsgBox("変更があります。上書き保存しますか?", vbOKCancel) 7 If prom = vbOK Then 8 .Save 9 End If 10 Cancel = True 11 End If 12 End With 13End Sub

ハッシュ値という用語が解りませんが、こういうことですか?
参考まで。

投稿2018/11/12 05:53

mattuwan

総合スコア2136

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

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

maguzo

2018/11/12 06:19

コメント有難うございます。 ご指摘の方法でも動作しました、大変たすかりました、有難うございます! 一方で、自身のコードがどこに誤りがあるか分からずにこの点も解決したく、考えておりました。 c = ws.Range("C:CE")の箇所が 「オブジェクト偏すまたはwith ブック変数がせっていされていません。」 とエラーが出力されるのですが、cやwb wsを適切に設定していると思うのですが、どこか問題がありますでしょうか、もし、お気づきになる箇所があればアドバイスを頂戴できるとうれしいです。 何時間考えてもわからず、どつぼにはまってきました。。。
mattuwan

2018/11/12 06:40

> c = ws.Range("C:CE")の箇所が オブジェクトを変数に代入するときは、 Setステートメントを使います。 ちなみに、値の時はLet(省略可)です。
maguzo

2018/11/12 07:56

有難うございます!無事解決いたしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問