excel - 有没有办法在发送之前对 Excel 文件进行加密?

标签 excel vba

我正在寻求帮助,以便在通过电子邮件发送 Excel 工作簿之前自动对其进行加密。同事之前写过脚本,但已经离职了,因为我对此一无所知,我正在寻求帮助,看看是否有人可以指出在附加之前加密 Excel 文件的代码行的位置在我发送之前先查看草稿电子邮件。任何指示都会很好,谢谢!

我这里有代码

Sub Send_Row_Or_Rows_Attachment_2()
Working in 2000-2016
Dim OutApp As Object
Dim OutMail As Object
Dim rng As Range
Dim Ash As Worksheet
Dim Cws As Worksheet
Dim Rcount As Long
Dim Rnum As Long
Dim FilterRange As Range
Dim FieldNum As Integer
Dim NewWB As Workbook
Dim TempFilePath As String
Dim TempFileName As String
Dim FileExtStr As String
Dim FileFormatNum As Long

On Error GoTo cleanup
Set OutApp = CreateObject("Outlook.Application")

With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With

'Set filter sheet, you can also use Sheets("MySheet")
Set Ash = ActiveSheet

'Set filter range and filter column (column with e-mail addresses)
Set FilterRange = Ash.Range("A1:N" & Ash.Rows.Count)
FieldNum = 2    'Filter column = B because the filter range start in column A

'Add a worksheet for the unique list and copy the unique list in A1
Set Cws = Worksheets.Add
FilterRange.Columns(FieldNum).AdvancedFilter _
        Action:=xlFilterCopy, _
        CopyToRange:=Cws.Range("A1"), _
        CriteriaRange:="", Unique:=True

'Count of the unique values + the header cell
Rcount = Application.WorksheetFunction.CountA(Cws.Columns(1))

'If there are unique values start the loop
If Rcount >= 2 Then
    For Rnum = 2 To Rcount

        'If the unique value is a mail address create a mail
        If Cws.Cells(Rnum, 1).Value Like "?*@?*.?*" Then

            'Filter the FilterRange on the FieldNum column
            FilterRange.AutoFilter Field:=FieldNum, _
                                   Criteria1:=Cws.Cells(Rnum, 1).Value

            'Copy the visible data in a new workbook
            With Ash.AutoFilter.Range
                On Error Resume Next
                Set rng = .SpecialCells(xlCellTypeVisible)
                On Error GoTo 0
            End With

            Set NewWB = Workbooks.Add(xlWBATWorksheet)

            rng.Copy
            With NewWB.Sheets(1)
                .Cells(1).PasteSpecial Paste:=8
                .Cells(1).PasteSpecial Paste:=xlPasteValues
                .Cells(1).PasteSpecial Paste:=xlPasteFormats
                .Cells(1).Select
                Application.CutCopyMode = False
            End With

            'Create a file name
            TempFilePath = Environ$("temp") & "\"
            TempFileName = "(for info, pls) " & Ash.Parent.Name _
                         & " " & Format(Now, "dd-mmm-yy")

            If Val(Application.Version) < 12 Then
                'You use Excel 97-2003
                FileExtStr = ".xls": FileFormatNum = -4143
            Else
                'You use Excel 2007-2016
                FileExtStr = ".xlsx": FileFormatNum = 51
            End If

            'Save, Mail, Close and Delete the file
            Set OutMail = OutApp.CreateItem(0)

            With NewWB
                .SaveAs TempFilePath & TempFileName _
                      & FileExtStr, FileFormat:=FileFormatNum
                On Error Resume Next
                With OutMail
                    .SentOnBehalfOfNAme = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="89eefce7e7ecfbc9ece4e8e0e5a7eae6e4" rel="noreferrer noopener nofollow">[email protected]</a>"
                    .to = Cws.Cells(Rnum, 1).Value
                    .Subject = "[FOR INFO ONLY][" & Format(Now, "dd-mmm-yy") & "]" & Space(1) & "<" & Range("E2").Value & ">"
                    .Attachments.Add NewWB.FullName
                    .Body = GetBoiler("C:\Users\Gunner\Desktop\bunny\bunny.txt")
                    .Display 'Or use .Sendcv
                End With
                On Error GoTo 0
                .Close savechanges:=False
            End With

            Set OutMail = Nothing
            Kill TempFilePath & TempFileName & FileExtStr
        End If

        'Close AutoFilter
        Ash.AutoFilterMode = False

    Next Rnum
End If

cleanup:
Set OutApp = Nothing
Application.DisplayAlerts = False
Cws.Delete
Application.DisplayAlerts = True

With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With
End Sub

Function GetBoiler(ByVal sFile As String) As String
'Dick Kusleika
Dim fso As Object
Dim ts As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
GetBoiler = ts.readall
ts.Close
End Function

最佳答案

保存文件时可以使用密码保护。这将加密文件,并且只有在提供正确的密码时才会解密。

    With NewWB
        .SaveAs TempFilePath & TempFileName _
              & FileExtStr, FileFormat:=FileFormatNum, _
              Password:="yourpassword", _                                
              WriteResPassword:="yourreadonlypassword"

请参阅documentation用于“另存为”命令。

关于excel - 有没有办法在发送之前对 Excel 文件进行加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72179888/

相关文章:

python - 从工作簿复制列,粘贴到第二个工作簿的第二张工作表中,openPyXL

vba - 用于分析两个 bool 条件的最简洁的 ElseIf 逻辑是什么?

vba - 是否有 VBA 命令导致此时开始调试?

c++ - 当我将一个字符串数组从 VBA 传递到 C++ 并将它们用作 map 中的键时,为什么我无法从 map 中检索数据(使用键)?

string - 用于在句点之间获取字符串中特定值的公式

sql - PowerQuery 条件最大值

excel - 如何将多个 Range 对象合并为一个,用作图表源

arrays - 循环并将单元格值放入其中后,VBA数组为空

vba - 如何使用VBA编写VBA代码

vba - 根据单元格值在 VBA 中复制和粘贴循环