`
tangleilei
  • 浏览: 13921 次
  • 来自: 上海
社区版块
存档分类
最新评论

vba 网络、XML、WMI以及API扩充

阅读更多
 前面我已经总结了VBA最常见的一些应用;相对来说,下面这几种应用都比较少见一点,这里就是做一个索引,当需要的时候可以直接查询需要的资源。经过前面的了解,大家肯定也猜到了,这些应用基本上都是通过调用COM实现的。所以只要系统底层COM能完成的功能,基本在VBA中都可以去完成。此外,除了调用COM对象完成相应的功能,扩充VBA的能力最纯粹的手段就是直接调用API了。这个已经超出了VBA的范围,这里就是简单提及一下。对于COM对象创建的时候是“前期绑定”还是“后期绑定”的区别也就不再重复了。每个对象,我就是简单总结一下常见的用法。

一、网络应用

直接使用Workbook对象获取网络内容

  在装有Frontpage Server Extension的服务器上,可以直接以Workbook的形式保存和打开Excel。除了分享这些Excel文档,直接使用Workbook也可以直接打开和使用网页上的内容。打开以后,基本上就当Sheet一样处理了。


复制代码

Dim oBk As Workbook
'打开远程Excel
Set oBk = Workbooks.Open("http://www.MySite.com/book1.xlsx")
'另存为
oBk.SaveAs "http://www.MySite.com/Book2.xlsx"

转自http://www.cnblogs.com/dxy1982/archive/2011/09/16/2159310.html

Dim oRng As Range
'打开网页
Set oBk = Workbooks.Open("http://www.x-rates.com/d/USD/table.html")
'查找内容
Set oRng = oBk.Worksheets(1).Cells.Find("British Pound")
'显示内容
MsgBox oRng.Offset(0, 1).Value

复制代码



使用Web Query获取网络数据

  从Excel97加入了Web Query的支持后,几乎在每个新的版本中,这个方面的内容都得到了强化。我们可以使用这个特性获取网络上一张表的数据。主要使用的是Application.QueryTables。例子如下:


复制代码

Sub GetRatesWithWebQuery()
  Dim oBk As Workbook
  Dim oQT As QueryTable
  '数字的格式设置
  Dim sDecimal As String
  Dim sThousand As String
  Dim bUseSystem As Boolean

  Set oBk = Workbooks.Add
  With oBk.Worksheets(1)
    Set oQT = .QueryTables.Add( _
                Connection:="URL;http://www.x-rates.com/d/USD/table.html", _
                Destination:=.Range("A1"))
  End With

  '设置QueryTable的相关属性
  With oQT
    .Name = "USD"
    '选中特定的表
    .WebSelectionType = xlSpecifiedTables
    '导入Page上第14个表
    .WebTables = "14"
    '忽略Page上的格式
    .WebFormatting = xlWebFormattingNone
    '不会尝试去识别日期
    .WebDisableDateRecognition = True
    '每次打开文件的时候不会刷新数据
    .RefreshOnFileOpen = False
    '等待查询结束
    .BackgroundQuery = True
    '伴随Workbook一起保存数据
    .SaveData = True
    '根据表中数据调整列宽度
    .AdjustColumnWidth = True
  End With
  With Application
    '保存当前文档的分隔符格式
    sDecimal = .DecimalSeparator
    sThousand = .ThousandsSeparator
    bUseSystem = .UseSystemSeparators
    '设置分隔符
    .DecimalSeparator = "."
    .ThousandsSeparator = ","
    .UseSystemSeparators = True
    '忽略任何错误
    On Error Resume Next
    '执行查询,等待结束
    oQT.Refresh BackgroundQuery:=False
    '恢复文档的分隔符格式
    .DecimalSeparator = sDecimal
    .ThousandsSeparator = sThousand
    .UseSystemSeparators = bUseSystem
  End With
End Sub

复制代码

这种方式十分依赖于页面中<table>节点的顺序,需要注意。



使用InternetExplorer对象操纵DOM模型

  使用前面的方法都有一定的局限性,如果我们关注的不是整个表,而只是页面的某些部分,这个时候使用InternetExplorer对象是最方便的。这个对象的Document属性代表了整个的页面,可以使用这Document的属性和方法获取页面的各个部分(就是常说的DOM操作)。使用这个对象处理页面内容是最强大,最直接的一种方式。InternetExplorer对象的使用示例:


复制代码

Sub GetUSDtoGBPRateUsingIE()
  Dim oIE As InternetExplorer
  Dim sPage As String
  Dim iGBP As Long, iDec As Long
  Dim iStart As Long, iEnd As Long
  Dim dRate As Double
  '创建隐藏的IE实例,可以通过设置Visible属性来显示IE
  Set oIE = New InternetExplorer
  '打开网页
  oIE.Navigate "http://www.x-rates.com/d/USD/table.html"

  '等待加载完毕,也可以使用下面的方式等待:
  'While obIE.Busy = True 
  'DoEventsWend
  Do Until oIE.readyState = 4
    DoEvents
  Loop

  'DOM操作
  sPage = oIE.Document.body.InnerText

  '查找目标
  iGBP = InStr(1, sPage, "British Pound")
  iDec = InStr(iGBP, sPage, ".")
 
  iStart = InStrRev(sPage, " ", iDec) + 1
  iEnd = InStr(iDec, sPage, " ")
  dRate = Val(Mid$(sPage, iStart, iEnd - iStart))
 
  MsgBox "The USD/GBP exchange rate is " & dRate
End Sub

复制代码

这种方式其实也是IE自动化的一种手段:http://www.excely.com/excel-vba/ie-automation.shtml

IE文档对象资料:http://club.excelhome.net/forum.php?mod=viewthread&tid=263887

网页分析资料:http://club.excelhome.net/thread-377077-1-1.html

邮箱登陆问题:http://club.excelhome.net/thread-357475-1-1.html



使用XmlHttp获取网页内容

  XmlHttp是一套可以在Javascript、VbScript、Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API。XmlHttp最大的用处是可以更新网页的部分内容而不需要刷新整个页面。来自MSDN的解释:XmlHttp提供客户端同http服务器通讯的协议。客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用微软XML文档对象模型Microsoft® XML Document Object Model (DOM)处理回应。现在的绝对多数浏览器都增加了对XmlHttp的支持,IE中使用ActiveXObject方式创建XmlHttp对象,其他浏览器如:Firefox、Opera等通过window.XMLHttpRequest来创建xmlhttp对象。 使用这种方式访问网页内容比较快一点,但是兼容性不如使用IE对象的方式。

  VBA从网络下载文件是可以通过XmlHttp对象实现的,例子如下:


复制代码

Set http = CreateObject("Microsoft.XmlHttp")
  
http.Open "GET", url, True
http.send

If http.ReadyState <> 4 Then
   DoEvents
Else
  
   Set oStream = CreateObject("ADODB.Stream")
   oStream.Type = 1
   oStream.Open
   oStream.Write http.responsebody
   sFile = Replace(Mid(url, InStrRev(url, "/") + 1), "?", "-")
   oStream.SaveToFile "C:" & "\" & sFile, 2 '本地保存文件名
   oStream.Close
End if

复制代码

其它小例子:http://www.excelpx.com/thread-163323-1-1.html。

XmlHttp对象参考:http://blog.csdn.net/tfgdd/article/details/5062767。



VBA调用WebService

这个在VBA中也可以实现的,一般需要类库辅助,其实与XML操作还是有关系的,可以参看下面链接:

从Office调用Web Service:http://www.excely.com/excel-vba/ie-automation.shtml

如何调用Web Service:http://msdn.microsoft.com/en-us/magazine/cc163837.aspx



二、XML操作

  在VBA中处理XML文档在前面的文件系统中其实已经介绍过最简单的打开和保存了。下面综合总结一下:

当做普通文本文档处理或者打开放到Workbook中处理

  使用这种方式,辅助正则表达式,再加上一大把处理字符串的方法,是可以完成任务的,只不过XML的结构优势一点都没用上。



使用ADO处理XML文档

  这里充分体现了ADO的强大,配合SQL几乎可以完成任何的任务。别忘了添加MS ADO Library引用。

生成XML的操作示例:


复制代码

Sub Create_XML_Recordset()
    Const stSQL As String = "SELECT * FROM [Report]"
    Dim stCon As String     
    stCon = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & ThisWorkbook.FullName & ";" & _
    "Extended Properties=""Excel 8.0;HDR=Yes"";"
    
    Dim rst As New ADODB.Recordset
    Dim str As New ADODB.Stream
    
    With rst
        .CursorLocation = adUseClient
        .Open stSQL, stCon, adOpenStatic, adLockReadOnly, adCmdText
        .Save str, adPersistXML
        .Close
        With str
            .SaveToFile "C:\Report.xml", adSaveCreateOverWrite
            .Close
        End With
    End With
    
    Set str = Nothing
    Set rst = Nothing
End Sub

复制代码

读取XML的操作示例:


复制代码

Sub Read_XML_Data()
    Dim rst As ADODB.Recordset
    Dim stCon As String, stFile As String
    Dim i As Long, j As Long
    
    Set rst = New ADODB.Recordset
    
    stFile = "C:\Report.xml"
    stCon = "Provider=MSPersist;"
    
    With rst
        .CursorLocation = adUseClient
        .Open stFile, stCon, adOpenStatic, adLockReadOnly, adCmdFile
        Set .ActiveConnection = Nothing
    End With
    
    With ActiveSheet
        For j = 0 To i - 1
            .Cells(1, j + 1).Value = rst.Fields(j).Name
        Next j

        .Range("A2").CopyFromRecordset rst
    End With
    
    rst.Close
    Set rst = Nothing     
End Sub

复制代码



使用MSXML处理XML文档

  这应该是处理XML文档的首选策略了,它提供了XML DOM的所有方法和属性,使用起来很顺手。使用这个对象需要添加“Microsoft XML,v6.0”引用。


复制代码

Sub ReadXML()
    Dim xmlDom As MSXML2.DOMDocument
    Dim xmlPlaceMark As MSXML2.IXMLDOMNode
    Dim xmlPolygon As MSXML2.IXMLDOMNode
    Dim xmlCoord As MSXML2.IXMLDOMNode
    Dim sName As String
    Dim vaSpace As Variant, vaComma As Variant
    Dim i As Long, j As Long
   
    Set xmlDom = New MSXML2.DOMDocument   
    xmlDom.Load "C:\Downloads\overlay_1198.kml"
   
    For i = 0 To xmlDom.childNodes(1).childNodes(0).childNodes.Length - 1
        If xmlDom.childNodes(1).childNodes(0).childNodes.Item(i).nodeName = "Placemark" Then
            Set xmlPlaceMark = xmlDom.childNodes(1).childNodes(0).childNodes.Item(i)
            Set xmlPolygon = xmlPlaceMark.childNodes(2).childNodes(0)
            Set xmlCoord = xmlPolygon.childNodes(0).childNodes(0).childNodes(0)
            sName = xmlPlaceMark.childNodes(1).childNodes(5).nodeTypedValue               

            With Sheet4.Cells(Sheet2.Rows.Count, 1).End(xlUp).Offset(1, 0)
                .Value = sName
                vaSpace = Split(xmlCoord.childNodes(0).Text, " ")
                For j = LBound(vaSpace) To UBound(vaSpace)
                    vaComma = Split(vaSpace(j), ",")
                    .Offset(0, 1).Value = vaComma(0)
                    .Offset(0, 2).Value = vaComma(1)
                Next j
            End With
        End If
    Next i
End Sub

复制代码

XML DOM的方法和属性:http://msdn.microsoft.com/en-us/library/ms764730



三、WMI信息

  WMI是内置在Windows 2000、 Windows XP和Windows Server 2003 系列操作系统中核心的管理支持技术。基于由 Distributed Management Task Force (DMTF) 所监督的业界标准,WMI是一种规范和基础结构,通过它可以访问、配置、管理和监视几乎所有的Windows资源。大多用户习惯于使用众多的图形化管理工具来管理Windows资源,在WMI之前这些工具都是通过Win32应用程序编程接口(Application ProgrammingInterfaces,API)来访问和管理Windows资源的。只要你熟悉系统编程你就知道API有多么重要。但是大多数脚本语言都不能直接调用Win32 API,WMI的出现使得系统管理员可以通过一种简便的方法即利用常见的脚本语言实现常用的系统管理任务。 利用WMI需要和脚本如WSH和VBScript结合起来,可以实现的功能大家可以看微软的MSDN文档。

(介绍比较全)VBA中使用WMI:http://club.excelhome.net/thread-733445-1-1.html。

WMI中的Class介绍:http://msdn.microsoft.com/en-us/library/aa394554(v=VS.85).aspx



四、API扩充

  在VBA中使用API,理论上可以完成任何操作系统提供的功能。但是实际上,除非万不得已,一般使用VBA或者其他COM提供的功能就足够了,真的算是价格便宜量又足。当上述这些功能不符合我们的需求的时候(特别是需要使用VBA中那纤弱的UserForm的时候),那就使用API吧。使用API需要先声明,再使用;声明过程中还涉及到类型的转化。如果想了解更多的内容,可以参考相关的资料。下面是质量比较高的一些资料:

VBA与API:http://blog.imwebs.com/article.asp?id=469

VBA调用API:http://www.excelperfect.com/index.php/2009/07/15/usewindowsapi/

VBA中API的函数集锦:http://www.cnblogs.com/james.wong/articles/93942.html

窗体API:http://www.vbafan.com/2009/07/19/excel-userform-api-tricks/

CreateObject与GetObject的不同:前面我已经多次使用CreateObject去创建COM的实例了,这里简单介绍一下另外一个相关的函数。

  如果存在对象的当前实例,或者您希望使用已加载的文件创建对象,请使用 GetObject 函数,只要把COM组件的路径传给这个函数即可。如果不存在当前实例,并且不希望使用已加载的文件启动对象,那么使用 CreateObject 函数。这里最常见的一个用法是把Excel文件的路径传给GetObject,这个时候方法就返回这个文件对应的Workbook对象,但是并不会显式打开文件。这个时候就可以在后台处理文件的内容,比如拷贝Sheet到当前打开的Excel文件中。

注意:如果对象本身已经注册为 ActiveX 单实例对象,则无论调用多少次 CreateObject,都只会创建对象的一个实例。不能使用 GetObject 获取对用 Visual Basic 创建的类的引用。

GetObject方法的详细说明:http://msdn.microsoft.com/zh-cn/library/e9waz863(v=vs.80).aspx
分享到:
评论

相关推荐

    Excel_VBA网络、XML、WMI以及API扩充.docx

    Excel VBA 在网络、XML、WMI 和 API 扩展方面提供了丰富的功能,使得VBA开发者可以实现更多高级和复杂的任务。以下是对这些知识点的详细解释: 1. **网络应用**: - **Workbook对象获取网络内容**:通过 `...

    wmi api可用信息大全

    ### WMI API可用信息大全 #### 概述 WMI(Windows Management Instrumentation)是Microsoft提供的用于管理系统资源的标准接口,可以获取系统上各种硬件设备、软件配置和运行状态的信息。本文将详细介绍WMI API中...

    通过 WMI 或 API 方法读取U盘序列号

    WMI是微软提供的一个接口,用于管理系统资源,它提供了对操作系统、硬件设备、网络配置等信息的访问。通过WMI,开发者可以编写脚本或应用程序来查询和操作系统级别的数据,包括硬件设备的详细信息。 使用WMI读取U盘...

    CC++通过WMI和系统API函数获取获取系统硬件配置信息

    标题和描述均指向了一个核心议题,即如何使用C/C++结合Windows Management Instrumentation (WMI)和系统API函数来获取系统的硬件配置信息。这不仅包括常见的性能监控指标如CPU使用率、内存使用情况和网络利用率,还...

    VBA通过WMI技术获取网卡当前设置的IP地址

    VBA通过WMI技术获取网卡当前设置的IP地址 GetObject("winmgmts:\\" & "." & "\root\cimv2").ExecQuery("Select * from Win32_NetworkAdapterConfiguration")

    学习使用WMI管理网络

    ### 学习使用WMI管理网络 #### 关键知识点概览 - **WMI简介**:Windows Management Instrumentation(WMI)是一种内置在Windows操作系统中的技术,用于远程管理和监控Windows设备的状态。 - **命名空间的理解**:...

    WMI获取远程服务器CPU,内存使用率函数源代码

    WMI是基于Common Information Model (CIM) 的,它为系统、网络和应用程序提供了一个统一的接口,以便于管理。在C#中,我们可以使用System.Management命名空间下的类来访问WMI信息。 对于CPU使用率的获取,通常我们...

    WMI.rar_wmi

    1. **系统监控**:WMI可以收集系统性能数据,如CPU使用率、内存占用、网络流量等,这对于系统性能分析和故障排查非常有用。 2. **配置管理**:通过WMI,你可以更改系统设置,例如添加、删除或更新驱动程序,管理用户...

    WmiTools(windows系统工具)

    WMI是微软提供的一个核心组件,用于管理系统配置、监控性能以及执行远程管理任务。通过WmiTools,用户可以方便地查询和操作系统的各种属性、事件和服务。 ### 1. WMI基础概念 **WMI是什么?** WMI是Windows ...

    wmi.zip_java wmi_wmi

    本文将深入探讨如何使用Java与WMI进行交互,以及如何通过WMI.js这个工具来读取设备信息。 首先,我们需要了解Java中的WMI接口。Java中没有内置对WMI的直接支持,但可以通过JMI(Java Management Extensions)或第三...

    获取 硬盘物理序列号 获得唯一硬盘序列号 唯一标识 纯API方法,没有DLL,没有控件,另外给出了WMI方法的结果作为比较

    1.VB.NET 2008开发环境的工程文件,纯API方法获取硬盘物理序列号,也就是所谓全球唯一标识的号,通常用这个号作为软件注册的唯一标识;写到一个函数中,非常方便移植代码! 2.使用说明:打开程序后,点按钮后,三个...

    WMI Tools (wmitools)

    官方版WMI tools,系统检测工具。

    wmi.rar_C# WMI_windows wmi_wmi_wmi proerties

    它允许应用程序通过标准接口访问系统信息,如硬件状态、软件设置、网络配置等。C#作为.NET框架的一部分,提供了强大的支持来与WMI进行交互。下面将详细探讨C#中使用WMI的相关知识点。 首先,要使用C#进行WMI查询,...

    Hyper-V-WMI-v2:主要使用Hyper-V WMI v2 API的脚本(Windows Server 2012及更高版本)

    Hyper-V WMI v2 API是Hyper-V管理工具的核心,它提供了对虚拟机、虚拟网络设备、存储和其他关键组件的编程访问。 这篇文章将深入探讨Hyper-V WMI v2的关键特性和使用方法,特别是在PowerShell中的应用。PowerShell...

    非常好用的WMI编程工具(WMITools)

    本文将深入探讨WMI的基础概念、重要性以及WMITools如何帮助我们更高效地进行WMI编程。** **一、WMI概述** WMI是微软提供的一个系统管理接口,它允许开发者和系统管理员通过标准的脚本语言(如VBScript和PowerShell...

    WmiExplorer.rar

    WMIExplorer是一款用户友好的图形界面应用,它允许开发者、系统管理员以及技术爱好者以直观的方式探索和交互WMI命名空间、类、实例和方法。通过这个工具,你可以: 1. **浏览WMI命名空间**: WMI数据结构组织成多个...

    WMI 代码生成器

    通过WMI,开发者可以获取硬件配置、系统性能数据、网络状态等多种信息,甚至进行系统配置和控制。 C#、VB(Visual Basic)和VB.NET是三种支持与WMI交互的编程语言。在这些语言中,你可以使用WMI的.NET Framework...

    怎样使用WMI查询

    WMI是基于WBEM(Web-Based Enterprise Management)标准的,使得在Windows环境中获取硬件、软件状态以及系统配置等信息变得方便快捷。 使用WMI查询,你可以获取诸如系统硬件信息(如CPU、内存、硬盘)、操作系统...

    WMITools 查看工具

    WMITools能够帮助用户深入洞察系统状态,包括硬件资源、性能指标、网络连接、进程和服务信息等。对于IT专业人员来说,这是一款不可或缺的诊断和故障排除工具。 该压缩包中的"Windows Management Instrumentation v...

Global site tag (gtag.js) - Google Analytics