我正在寻找代码将剪贴板中的屏幕截图保存为jpg文件直接在MS访问或VBA方法中将bmp转换为jpg。我找到了解决方法,但我对它的速度并不满意。 (我使用MS Access打开excel文件,运行代码粘贴并将图片保存为jpg,代码如下)。
我找到了working code,但它将图片保存为* .bmp。
我正在使用MS Access 2016
MS Access文件中的代码:
Sub Copy_screenshot_to_file()
Dim db As Database
Set db = CurrentDb()
Dim qSQL As String
Dim xl As Object
Dim xlApp As Object
Dim xlPath As String
Dim fPath As String
fPath = "\\XXX\" 'New file location
xlPath = "\\XXX...\Export to JPG tool.xlsm" 'excel file location
Dim dwg_nr As String
Dim row_nr As Long
Dim fName As String
Dim lName As String
Dim Date1 As Date
dwg_nr = Screen.ActiveForm![PID_nr].Value
row_nr = Screen.ActiveForm![ID_num].Value
'file name gen
Date1 = Now()
fName = dwg_nr & " " & Format(Date1, "yyyy.dd.mm hh-mm")
lName = fPath & fName & ".jpg"
'generate screenshot
Set xl = CreateObject("Excel.Application")
xl.Workbooks.Open (xlPath)
xl.Visible = True '
xl.Run "RunCodeFromAccess", fName, fPath
xl.ActiveWorkbook.Close (False)
xl.Quit
Set xl = Nothing
If Dir(lName) = "" Then
MsgBox "JPG file not created, please make new screenshot"
Exit Sub
End If
'add link to DB
qSQL = "UPDATE tblXXX SET Field12 = '" & lName & "' WHERE ID_num = " & row_nr
db.Execute qSQL, dbFailOnError
End Sub
excel文件中的代码:
Sub RunCodeFromAccess(Fname As String, fPath As String)
Dim ws As Worksheet
Set ws = Sheets("Sheet1")
ws.Paste
'Range("A1").Paste
Dim oDia As Object
Dim oChartArea
Dim sh As Shape
Dim PicName As String
For Each sh In ws.Shapes
PicName = Fname
sh.CopyPicture
Set oDia = ws.ChartObjects.Add(0, 0, sh.Width, sh.Height)
Set oChartArea = oDia.Chart
oDia.Activate
With oChartArea
.ChartArea.Select
.Paste
.Export (fPath & PicName & ".jpg")
End With
oDia.Delete
sh.Delete
Next
End Sub
答案 0 :(得分:1)
迟到但如果你仍然对这个功能感兴趣的话。您可以查看我的VBA Tools Dll,它允许将clipbord图像保存到您提供的位置。有一个带有vba包装器的示例accdb文件,可以在示例文件夹中下载。
使用示例文件中的vba wapper:
SaveClipboardToImage()
或
SaveClipboardToImage(Optional Path As String = "", Optional FileNAme As String = "", Optional FileType As String = "jpeg")
将返回保存文件的完整文件路径或""如果在剪贴板中找不到图像。
请在使用任何dll之前随意使用在线防病毒扫描程序。
答案 1 :(得分:0)
任何可能但(由于缺乏进一步的信息)我怀疑在这种情况下合适的答案是它不可能。至少没有第三方实用程序或其他编程语言的帮助。
要了解原因,您需要了解剪贴板的工作原理。这里有一些.NET documentation about the Clipboard Class,但她的简短版本是:并非所有内容都以相同的方式存储在剪贴板上。
当剪贴板存储复制的图像时,它总是存储为Bitmap。
当剪贴板存储文件(如JPG)时,它不存储实际数据;它存储了一个"指针"到文件。如果将JPG文件复制到剪贴板并删除该文件,则无法从剪贴板中检索该文件。
根据您的代码,我怀疑您尝试做的事情是将图表从Excel(或类似的东西)复制到剪贴板并且想要将其保存到文件中,作为将对象直接保存到文件的解决方法。
如果您尝试将Excel对象(如图表)另存为JPG文件,请直接执行:
ActiveChart.Export "c:\outputPath\outputFileName.jpg", "JPG"
也可以使用其他图形过滤器,具体取决于您计算机上安装的内容。
(我怀疑这是一个常见问题的例子:XY Problem:程序员Bob坚持问题X,他不知道如何解决。他想出了潜在的解决方案Y,但并不确切知道如何解决这个问题,因此Bob要求帮助解决问题Y,这几乎总是会导致所有相关人员不必要的工作,当Bob应该刚刚询问问题X时。)< /子>