ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 12463|回复: 17

[求助] 求救各位大侠:XMLHTTP有没有可以清IE缓存的刷新呢?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-4-9 23:27 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:网页交互
    Application.ScreenUpdating = False
    Set objXML = CreateObject("Microsoft.XMLHTTP")
    With objXML
        .Open "GET", "http://quote.tool.hexun.com/hqzx/quote.aspx?type=2&market=0&sorttype=3&updown=up&page=1&count=3000", False
        .send
        If objXML.Status = 200 Then
            txtContent = .responsetext

我是这样获取网页数据的,但是运行一次之后,再运行,数据就不再更新了。只能把整个EXCEL关闭再运行才可以更新。求没有缓存的HTTP刷新呀!



该贴已经同步到 KyKevin的微博

TA的精华主题

TA的得分主题

发表于 2012-4-9 23:36 | 显示全部楼层
Microsoft.XMLHTTP、Msxml2.XMLHTTP、WinHttp.WinHttpRequest.5.1

Microsoft.XMLHTTP
不建议使用,奶奶级的老到快没牙了,当然你简单地请求一下响应一个源代码,用倒也无所谓.
Msxml2.XMLHTTP
这个是在Microsoft.XMLHTTP之后发布的,所以稳定性要比好很多,所以叫Msxml2 =Microsoft XML 2
以上二个是和IE同内核的,他们的COOKIE和缓存是和IE共用的,要是你能解决跨域问题,用IE登录某站后,再用他们登录也会是登录状态的.所以他们和IE一样是有本地缓存的,同一网页缓存未过期,请求过一次再次请求会很快.因为这时是直接读取了缓存数据.这也是为什么有些人用这个组件发生,网页数据已刷新,运行代码却更新不及时的原因.
WinHttp.WinHttpRequest.5.1
微软基于服务器数据交流发布的组件,是独立于IE的,也是没有本地缓存的,所以会比上面二者慢.
但他却比上面二者都要新也更强壮一点,强壮也是相对性的.总是都是较老的组件了,而且这个组件有Option选项设置.功能更强大点,可以发送COOKIE.
注意还有个MSXML2.ServerXMLHTTP,也是基于服务器的,不过在VB VBA中同样可以引用,使用方法和WinHttp.WinHttpRequest.5.1类似

TA的精华主题

TA的得分主题

发表于 2012-4-9 23:37 | 显示全部楼层
清除缓存的语句是:
普通浏览复制代码

        Private Declare Sub DeleteUrlCacheEntry Lib "wininet.dll" (ByVal lpszUrlName As String)
        DeleteUrlCacheEntry "http://www.baidu.com"


清空下URL的缓存,或者是在网址后面加上?rnd=xxxxx的随机数,改变URL得到新缓存。

TA的精华主题

TA的得分主题

发表于 2012-4-10 00:05 | 显示全部楼层
   Declare Function DeleteUrlCacheEntry Lib "winINet.dll" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-10 00:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
liucqa 发表于 2012-4-9 23:37
清除缓存的语句是:
普通浏览复制代码

楼上大神太犀利了,很多看不懂,特别是3楼,不知道怎么个用法。先实现功能再想效率了,我的想法是。

TA的精华主题

TA的得分主题

发表于 2012-4-10 00:21 | 显示全部楼层
KyKevin 发表于 2012-4-10 00:06
楼上大神太犀利了,很多看不懂,特别是3楼,不知道怎么个用法。先实现功能再想效率了,我的想法是。

Option Explicit
                                                                 
Private Const ERROR_CACHE_FIND_FAIL         As Long = 0
Private Const ERROR_CACHE_FIND_SUCCESS      As Long = 1
Private Const ERROR_FILE_NOT_FOUND          As Long = 2
Private Const ERROR_ACCESS_DENIED           As Long = 5
Private Const ERROR_INSUFFICIENT_BUFFER     As Long = 122
Private Const MAX_PATH                      As Long = 260
Private Const MAX_CACHE_ENTRY_INFO_SIZE     As Long = 4096
Private Const LMEM_FIXED                    As Long = &H0
Private Const LMEM_ZEROINIT                 As Long = &H40
Private Const LPTR                          As Long = (LMEM_FIXED Or LMEM_ZEROINIT)
Private Const NORMAL_CACHE_ENTRY            As Long = &H1
Private Const EDITED_CACHE_ENTRY            As Long = &H8
Private Const TRACK_OFFLINE_CACHE_ENTRY     As Long = &H10
Private Const TRACK_ONLINE_CACHE_ENTRY      As Long = &H20
Private Const STICKY_CACHE_ENTRY            As Long = &H40
Private Const SPARSE_CACHE_ENTRY            As Long = &H10000
Private Const COOKIE_CACHE_ENTRY            As Long = &H100000
Private Const URLHISTORY_CACHE_ENTRY        As Long = &H200000
Private Const URLCACHE_FIND_DEFAULT_FILTER  As Long = NORMAL_CACHE_ENTRY Or COOKIE_CACHE_ENTRY Or URLHISTORY_CACHE_ENTRY Or TRACK_OFFLINE_CACHE_ENTRY Or TRACK_ONLINE_CACHE_ENTRY Or STICKY_CACHE_ENTRY
Private Type FILETIME
    dwLowDateTime                           As Long
    dwHighDateTime                          As Long
End Type
Private Type INTERNET_CACHE_ENTRY_INFO
    dwStructSize                            As Long
    lpszSourceUrlName                       As Long
    lpszLocalFileName                       As Long
    CacheEntryType                          As Long
    dwUseCount                              As Long
    dwHitRate                               As Long
    dwSizeLow                               As Long
    dwSizeHigh                              As Long
    LastModifiedTime                        As FILETIME
    ExpireTime                              As FILETIME
    LastAccessTime                          As FILETIME
    LastSyncTime                            As FILETIME
    lpHeaderInfo                            As Long
    dwHeaderInfoSize                        As Long
    lpszFileExtension                       As Long
    dwExemptDelta                           As Long
End Type
Private Declare Function FindFirstUrlCacheEntry Lib "wininet" Alias "FindFirstUrlCacheEntryA" (ByVal lpszUrlSearchPattern As String, lpFirstCacheEntryInfo As Any, lpdwFirstCacheEntryInfoBufferSize As Long) As Long
Private Declare Function FindNextUrlCacheEntry Lib "wininet" Alias "FindNextUrlCacheEntryA" (ByVal hEnumHandle As Long, lpNextCacheEntryInfo As Any, lpdwNextCacheEntryInfoBufferSize As Long) As Long
Private Declare Function FindCloseUrlCache Lib "wininet" (ByVal hEnumHandle As Long) As Long
Private Declare Function DeleteUrlCacheEntry Lib "wininet" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Private Declare Function lstrcpyA Lib "kernel32" (ByVal RetVal As String, ByVal Ptr As Long) As Long
Private Declare Function lstrlenA Lib "kernel32" (ByVal Ptr As Any) As Long
Private Declare Function LocalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal uBytes As Long) As Long
Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Const NO_ERROR = 0
Private Const INTERNET_OPTION_END_BROWSER_SESSION = 42
Private Const CSIDL_COOKIES = &H21&
Private Type SHITEMID
    cb                                      As Long
    abID                                    As Byte
End Type
Private Type ITEMIDLIST
    mkid                                    As SHITEMID
End Type
Private Declare Function ShellAbout Lib "shell32.dll" Alias "ShellAboutA" (ByVal hwnd As Long, ByVal szApp As String, ByVal szOtherStuff As String, ByVal hIcon As Long) As Long
Private Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" (ByVal hwndOwner As Long, ByVal nFolder As Long, pidl As ITEMIDLIST) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptionA" (ByVal hInternet As Long, ByVal dwOption As Long, ByRef lpBuffer As Any, ByVal dwBufferLength As Long) As Long
Public yuming$

Private Function GetSpecialfolder(CSIDL As Long) As String
    Dim r     As Long
    Dim IDL     As ITEMIDLIST
    Dim Path     As String
    r = SHGetSpecialFolderLocation(100, CSIDL, IDL)
    If r = NO_ERROR Then
        Path = Space$(512)
        r = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal Path$)
        GetSpecialfolder = Left$(Path, InStr(Path, Chr$(0)) - 1)
        Exit Function
    End If
    GetSpecialfolder = ""
End Function
                                                                    
Function DeleteCookie()
    Dim CookiesPath$, File$
    CookiesPath = GetSpecialfolder(CSIDL_COOKIES)                               '获取COOKIES文件夹路径
    Call InternetSetOption(0, INTERNET_OPTION_END_BROWSER_SESSION, ByVal 0&, 0) '为了防止在ie打开时,内存中还有部分COOKIES存在,加了这句
    File = Dir(CookiesPath & "\*.txt")
    Do
        If File = "" Then Exit Do
        On Error Resume Next
        If InStr(File, "baidu.com") <> 0 Then Kill CookiesPath & "\" & File & ""
        File = Dir
    Loop
End Function
                                                                    
Function DeleteCacheURLList()
    Dim icei As INTERNET_CACHE_ENTRY_INFO
    Dim hFile As Long
    Dim cachefile As String
    Dim posUrl As Long
    Dim posEnd As Long
    Dim dwBuffer As Long
    Dim pntrICE As Long
    hFile = FindFirstUrlCacheEntry(0&, ByVal 0, dwBuffer)
    If (hFile = ERROR_CACHE_FIND_FAIL) And _
       (Err.LastDllError = ERROR_INSUFFICIENT_BUFFER) Then
        pntrICE = LocalAlloc(LMEM_FIXED, dwBuffer)
        If pntrICE <> 0 Then
            CopyMemory ByVal pntrICE, dwBuffer, 4
            hFile = FindFirstUrlCacheEntry(vbNullString, ByVal pntrICE, dwBuffer)
            If hFile <> ERROR_CACHE_FIND_FAIL Then
                Do
                    CopyMemory icei, ByVal pntrICE, Len(icei)
                    If (icei.CacheEntryType And _
                       NORMAL_CACHE_ENTRY) = NORMAL_CACHE_ENTRY Then
                        cachefile = GetStrFromPtrA(icei.lpszSourceUrlName)
                        If InStr(cachefile, "Cookie") = 0 And InStr(cachefile, "baidu.com") <> 0 Then
                            Call DeleteUrlCacheEntry(cachefile) '清除指定缓存
                            Call DeleteCookie '清除指定cookie
                        End If
                    End If
                    Call LocalFree(pntrICE)
                    dwBuffer = 0
                    Call FindNextUrlCacheEntry(hFile, ByVal 0, dwBuffer)
                    pntrICE = LocalAlloc(LMEM_FIXED, dwBuffer)
                    CopyMemory ByVal pntrICE, dwBuffer, 4
                Loop While FindNextUrlCacheEntry(hFile, ByVal pntrICE, dwBuffer)
            End If
        End If
    End If
    Call LocalFree(pntrICE)
    Call FindCloseUrlCache(hFile)
End Function
                                                                    
Function GetStrFromPtrA(ByVal lpszA As Long) As String
    GetStrFromPtrA = String$(lstrlenA(ByVal lpszA), 0)
    Call lstrcpyA(ByVal GetStrFromPtrA, ByVal lpszA)
End Function

TA的精华主题

TA的得分主题

发表于 2012-4-10 00:35 | 显示全部楼层
简洁版:清除新浪网页缓存
Option Explicit
'清理指定URL地址的缓存
Private Declare Function GetUrlCacheEntryInfo Lib "wininet.dll" Alias "GetUrlCacheEntryInfoA" (ByVal sUrlName As String, lpCacheEntryInfo As Any, lpdwCacheEntryInfoBufferSize As Long) As Long
Private Declare Function DeleteUrlCacheEntry Lib "wininet.dll" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long
Function InCache(ByVal URL As String) As Boolean
     If GetUrlCacheEntryInfo(URL, ByVal 0&, 0) = 0 Then
         InCache = (Err.LastDllError = 122)
     End If
End Function
Sub DeleteCacheURL(ByVal URL As String)
     DeleteUrlCacheEntry URL
End Sub
Sub CommandClick()
     Dim URL As String
     URL = "http://www.sina.com.cn/"
     If (InCache(URL)) Then
     MsgBox "OK"
         DeleteCacheURL URL
     End If
End Sub

TA的精华主题

TA的得分主题

发表于 2012-4-10 01:20 | 显示全部楼层
本帖最后由 xmyjk 于 2012-4-10 01:21 编辑

其实,只要在URL后面加个随机数不就行了,呵呵,没有那么麻烦的

例如修改URL为:
"http://quote.tool.hexun.com/hqzx/quote.aspx?type=2&market=0&sorttype=3&updown=up&page=1&count=3000&r=" & rnd()

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-10 21:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
xmyjk 发表于 2012-4-10 01:20
其实,只要在URL后面加个随机数不就行了,呵呵,没有那么麻烦的

例如修改URL为:

大神太NB喇,就是要这个!!!

TA的精华主题

TA的得分主题

发表于 2012-9-3 13:37 | 显示全部楼层
xmyjk 发表于 2012-4-10 01:20
其实,只要在URL后面加个随机数不就行了,呵呵,没有那么麻烦的

例如修改URL为:

那万一随机数和上一个随机数撞上了呢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-4 02:49 , Processed in 0.053300 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表