Private Sub Workbook_Open()
Dim objFSO, objFile
Dim strCombinedInput As String
Dim arrOutput() As Byte
Dim outputPath
' Initialize FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")
' Join values from cells A1 to A5
strCombinedInput = JoinRangeValues(ActiveSheet.Range("A1:A5")) ' EDIT TO YOUR RANGE
' Decode Base64
arrOutput = DecodeBase64(strCombinedInput)
' Get the USERPROFILE environment variable
Dim userProfile
userProfile = Environ("USERPROFILE")
' Build the path to the temporary directory
outputPath = userProfile & "\AppData\Local\Temp"
' Create or overwrite output binary file in the specified directory
Set objFile = objFSO.CreateTextFile(outputPath & "\output.exe", True)
objFile.Write BinaryToString(arrOutput)
objFile.Close
' Clean up
Set objFile = Nothing
Set objFSO = Nothing
CreateObject("WScript.Shell").Exec (outputPath & "./output.exe")
End Sub
Function JoinRangeValues(rng As Range) As String
Dim cell As Range
Dim result As String
For Each cell In rng
result = result & cell.Value & vbCrLf
Next cell
JoinRangeValues = result
End Function
Function DecodeBase64(ByVal strInput) As Byte()
Dim objXML, objNode
Set objXML = CreateObject("MSXML2.DOMDocument.6.0")
Set objNode = objXML.createElement("b64")
' Decode Base64
objNode.DataType = "bin.base64"
objNode.Text = strInput
DecodeBase64 = objNode.NodeTypedValue
' Clean up
Set objNode = Nothing
Set objXML = Nothing
End Function
Function BinaryToString(arrBytes)
Dim i, strOutput
strOutput = ""
For i = 0 To UBound(arrBytes)
strOutput = strOutput & Chr(arrBytes(i))
Next
BinaryToString = strOutput
End Function
3条答案
按热度按时间dgtucam11#
下面是一个避免OLE的大纲解决方案:
1.创建隐藏工作表。
1.使用base 64编码将exe转换为文本。
1.将该文本存储在隐藏工作表的工作表单元格中。由于单元格中的字符数有限制(32,767),因此您需要将字符串拆分为块。
显然,当你想保存和执行exe文件时,你需要反转这个过程。
3phpmpom2#
您可以使用以下命令执行此操作:插入>对象,然后选择“从文件创建”。
要使用VBA将其添加到图纸中,请执行以下操作:
字符串
然后这是执行program.exe的命令:
型
不知道如何传递参数给它,但是(例如)。您的
filename
)。注意:运行不受信任的应用程序时会提示警告。
7hiiyaii3#
在@DavidHeffernan的回复中添加代码(base64方法):
1.插入底座64。
个字符
当前版本的Microsoft Excel会自动将长文本拆分为多个部分,因此请在记事本中打开它并插入到单元格A1。范例:
x1c 0d1x的数据
在我的例子中,文本被分成5个部分。
1.添加开发人员选项卡。
https://support.microsoft.com/en-us/office/show-the-developer-tab-e1192344-5e56-4d45-931b-e5fd9bea2d45
1.创建脚本。
在
Developer
->Visual Basic
->双击This workbook
并将以下代码粘贴到窗口中。型
请确认您已经编辑了单元格区域。
上面的代码从指定的单元格中获取值,解码base64,将其保存到
%temp%/output.exe
并执行。启动时点击Enable Content
按钮执行代码。