VBA 代码打开不需要的浏览器 window
VBA code opens an unwanted browser window
我在 VBA 中的代码在下载图像并将图像插入到我的 Excel 文档时遇到了一些问题。
我在循环中有以下代码:
Set theShape = ws.Shapes.AddPicture( _
Filename:=myurl, _
linktofile:=msoFalse, _
savewithdocument:=msoCTrue, _
left:=left, _
top:=top, _
Width:=-1, _
Height:=-1)
其中 "myurl" 包含图像的 link,它可以工作并且图像被下载和插入,但每次代码运行时它都会打开浏览器 window 并且不会'直到 window 被手动关闭。
我以以下方式启动 Sub:
With Application
.Cursor = xlWait
.DisplayStatusBar = True
.WindowState = xlMaximized
.EnableEvents = False
.DisplayAlerts = False
.ScreenUpdating = False
.Calculation = xlCalculationManual
.Interactive = False
.AskToUpdateLinks = False
.IgnoreRemoteRequests = False
End With
浏览器window不显示图像,而是显示实际站点的登录信息。该图像无需登录即可访问,通过 powershell 查看 headers 我可以看到以下内容:
PS C:\WINDOWS\system32> (wget https://www.deltaco.se/sites/cdn/PublishingImages/Products/hdmi-1022.jpg?width=80).Headers
Key Value
--- -----
SPRequestGuid 1042979e-00c5-c079-20f9-7d4f1f0a2f25
request-id 1042979e-00c5-c079-20f9-7d4f1f0a2f25
X-FRAME-OPTIONS SAMEORIGIN
MicrosoftSharePointTeamServices 15.0.0.4569
X-Content-Type-Options nosniff
X-MS-InvokeApp 1; RequireReadOnly
Access-Control-Allow-Origin *
Accept-Ranges bytes
Content-Length 1669
Cache-Control public, max-age=86400
Content-Type image/jpeg
Date Thu, 11 Oct 2018 07:08:06 GMT
ETag "{73EDFF3E-4289-4D00-A2E8-B3D5C0E3565A},4rend79_1"
Last-Modified Tue, 09 Oct 2018 06:45:17 GMT
Server Microsoft-IIS/8.5
X-AspNet-Version 4.0.30319
X-Powered-By ASP.NET
并且:
PS C:\WINDOWS\system32> wget https://www.deltaco.se/sites/cdn/PublishingImages/Products/hdmi-1022.jpg?width=80
StatusCode : 200
StatusDescription : OK
Content : {255, 216, 255, 224...}
RawContent : HTTP/1.1 200 OK
SPRequestGuid: a942979e-a0b5-c079-20f9-788e9a1abf7c
request-id: a942979e-a0b5-c079-20f9-788e9a1abf7c
X-FRAME-OPTIONS: SAMEORIGIN
MicrosoftSharePointTeamServices: 15.0.0.4569
X-Con...
Headers : {[SPRequestGuid, a942979e-a0b5-c079-20f9-788e9a1abf7c], [request-id, a942979e-a0b5-c079-20f9-788e9a1abf7c], [X-FRAME-OPTIONS, SAMEORIGIN], [MicrosoftSharePointTeamServices, 15.0.0.4569]...}
RawContentLength : 1669
(Powershell 与此问题无关,只是用它来检查 headers)
我看不到代码打开浏览器的任何重定向或其他原因 window。
如何完全阻止浏览器 window 打开?
欢迎来到 Whosebug Anders
如果没有 url 也可以访问图像,那么您可以使用 API URLDownloadToFile
看这个例子。我已经评论了代码。如果您仍然无法理解它,请告诉我。
Option Explicit
Private Declare Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" (ByVal pCaller As Long, _
ByVal szURL As String, ByVal szFileName As String, _
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Const MAX_PATH As Long = 260
Sub Sample()
Dim myurl As String, tempFilePath As String
Dim Ret As Variant
Dim theShape As Shape
Dim ws As Worksheet
'~~> Set this to the relevant sheet
Set ws = Sheet1
'~~> Img URL
myurl = "https://www.deltaco.se/sites/cdn/PublishingImages/Products/hdmi-1022.jpg"
'~~> Get user temp path and the image name from the above url
'~~> For exmaple C:\Users\xxxxx\AppData\Local\Temp\hdmi-1022.jpg
tempFilePath = TempPath & GetFilenameFromURL(myurl)
'~~> Download the image and save it as tempFilePath
Ret = URLDownloadToFile(0, myurl, tempFilePath, 0, 0)
If Ret = 0 Then
'~~> File successfully downloaded
'~~> Add the shape
Set theShape = ws.Shapes.AddPicture( _
Filename:=tempFilePath, _
linktofile:=msoFalse, _
savewithdocument:=msoCTrue, _
Left:=10, _
Top:=10, _
Width:=-1, _
Height:=-1)
DoEvents
'~~> Delete the img file in the temp directory
Kill tempFilePath
Else
MsgBox "Unable to download the file"
End If
End Sub
'~~> Function to get user temp directory
Function TempPath() As String
TempPath = String$(MAX_PATH, Chr$(0))
GetTempPath MAX_PATH, TempPath
TempPath = Replace(TempPath, Chr$(0), "")
End Function
'~~> Function to get Image name from URL
Function GetFilenameFromURL(ByVal strPath As String) As String
If Right$(strPath, 1) <> "/" And Len(strPath) > 0 Then
GetFilenameFromURL = GetFilenameFromURL(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1)
End If
End Function
我在 VBA 中的代码在下载图像并将图像插入到我的 Excel 文档时遇到了一些问题。
我在循环中有以下代码:
Set theShape = ws.Shapes.AddPicture( _
Filename:=myurl, _
linktofile:=msoFalse, _
savewithdocument:=msoCTrue, _
left:=left, _
top:=top, _
Width:=-1, _
Height:=-1)
其中 "myurl" 包含图像的 link,它可以工作并且图像被下载和插入,但每次代码运行时它都会打开浏览器 window 并且不会'直到 window 被手动关闭。
我以以下方式启动 Sub:
With Application
.Cursor = xlWait
.DisplayStatusBar = True
.WindowState = xlMaximized
.EnableEvents = False
.DisplayAlerts = False
.ScreenUpdating = False
.Calculation = xlCalculationManual
.Interactive = False
.AskToUpdateLinks = False
.IgnoreRemoteRequests = False
End With
浏览器window不显示图像,而是显示实际站点的登录信息。该图像无需登录即可访问,通过 powershell 查看 headers 我可以看到以下内容:
PS C:\WINDOWS\system32> (wget https://www.deltaco.se/sites/cdn/PublishingImages/Products/hdmi-1022.jpg?width=80).Headers
Key Value
--- -----
SPRequestGuid 1042979e-00c5-c079-20f9-7d4f1f0a2f25
request-id 1042979e-00c5-c079-20f9-7d4f1f0a2f25
X-FRAME-OPTIONS SAMEORIGIN
MicrosoftSharePointTeamServices 15.0.0.4569
X-Content-Type-Options nosniff
X-MS-InvokeApp 1; RequireReadOnly
Access-Control-Allow-Origin *
Accept-Ranges bytes
Content-Length 1669
Cache-Control public, max-age=86400
Content-Type image/jpeg
Date Thu, 11 Oct 2018 07:08:06 GMT
ETag "{73EDFF3E-4289-4D00-A2E8-B3D5C0E3565A},4rend79_1"
Last-Modified Tue, 09 Oct 2018 06:45:17 GMT
Server Microsoft-IIS/8.5
X-AspNet-Version 4.0.30319
X-Powered-By ASP.NET
并且:
PS C:\WINDOWS\system32> wget https://www.deltaco.se/sites/cdn/PublishingImages/Products/hdmi-1022.jpg?width=80
StatusCode : 200
StatusDescription : OK
Content : {255, 216, 255, 224...}
RawContent : HTTP/1.1 200 OK
SPRequestGuid: a942979e-a0b5-c079-20f9-788e9a1abf7c
request-id: a942979e-a0b5-c079-20f9-788e9a1abf7c
X-FRAME-OPTIONS: SAMEORIGIN
MicrosoftSharePointTeamServices: 15.0.0.4569
X-Con...
Headers : {[SPRequestGuid, a942979e-a0b5-c079-20f9-788e9a1abf7c], [request-id, a942979e-a0b5-c079-20f9-788e9a1abf7c], [X-FRAME-OPTIONS, SAMEORIGIN], [MicrosoftSharePointTeamServices, 15.0.0.4569]...}
RawContentLength : 1669
(Powershell 与此问题无关,只是用它来检查 headers)
我看不到代码打开浏览器的任何重定向或其他原因 window。
如何完全阻止浏览器 window 打开?
欢迎来到 Whosebug Anders
如果没有 url 也可以访问图像,那么您可以使用 API URLDownloadToFile
看这个例子。我已经评论了代码。如果您仍然无法理解它,请告诉我。
Option Explicit
Private Declare Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" (ByVal pCaller As Long, _
ByVal szURL As String, ByVal szFileName As String, _
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Const MAX_PATH As Long = 260
Sub Sample()
Dim myurl As String, tempFilePath As String
Dim Ret As Variant
Dim theShape As Shape
Dim ws As Worksheet
'~~> Set this to the relevant sheet
Set ws = Sheet1
'~~> Img URL
myurl = "https://www.deltaco.se/sites/cdn/PublishingImages/Products/hdmi-1022.jpg"
'~~> Get user temp path and the image name from the above url
'~~> For exmaple C:\Users\xxxxx\AppData\Local\Temp\hdmi-1022.jpg
tempFilePath = TempPath & GetFilenameFromURL(myurl)
'~~> Download the image and save it as tempFilePath
Ret = URLDownloadToFile(0, myurl, tempFilePath, 0, 0)
If Ret = 0 Then
'~~> File successfully downloaded
'~~> Add the shape
Set theShape = ws.Shapes.AddPicture( _
Filename:=tempFilePath, _
linktofile:=msoFalse, _
savewithdocument:=msoCTrue, _
Left:=10, _
Top:=10, _
Width:=-1, _
Height:=-1)
DoEvents
'~~> Delete the img file in the temp directory
Kill tempFilePath
Else
MsgBox "Unable to download the file"
End If
End Sub
'~~> Function to get user temp directory
Function TempPath() As String
TempPath = String$(MAX_PATH, Chr$(0))
GetTempPath MAX_PATH, TempPath
TempPath = Replace(TempPath, Chr$(0), "")
End Function
'~~> Function to get Image name from URL
Function GetFilenameFromURL(ByVal strPath As String) As String
If Right$(strPath, 1) <> "/" And Len(strPath) > 0 Then
GetFilenameFromURL = GetFilenameFromURL(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1)
End If
End Function