MS Access将剪贴板中的图片保存为jpg

时间:2018-04-04 07:42:04

标签: vba ms-access access-vba access ms-access-2016

我正在寻找代码将剪贴板中的屏幕截图保存为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

2 个答案:

答案 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时。)< /子>