以前有过一个VB用户他想知道如何能在一个Excel电子数据表中自动打开一个URL链接以及怎样才能在其中复制信息。他注意到在他的应用程序有一些特征可以使这个问题简单化,“当我在Excel中打开URL链接的时候,我所需要提取的信息通常都位于相同的单元格中。例如,Sheet3中的单元格G13将会总是显示客户的名字”。同时他也注意到他的应用程序可能引用了数以千计的WEB页面,所以,性能也是一个值得关注的问题。
注意:上面实例中的图片是以Excel 2003中的VBA开发的。在VB 6中实现,使用VB的三层架构而不是VB.NET。测试工作已经完成以确保程序代码能够兼容于Excel 2003中的VBA,但是仍然可能有一些兼容性的BUG存在。
准备开始实现这个项目的一个方法就是在Excel中记录几个宏(Macro)并且查看Excel生成的这些代码是如何来解决这些问题的。所以,为了这样做,我首先创建一个Excel电子数据表格并且其中包含有一些测试用的实例数据,而且需要手工完成选择这些实例数据的操作。以下这段代码就是被Excel所记录下来的:
Sub Macro1()
Range("A2").Select
Selection.Hyperlinks(1).Follow _
NewWindow:=False, AddHistory:=True
Sheets("ResultsReports").Select
Range("A2").Select
ActiveSheet.Paste
End Sub
这看起来很好,除了我们在这段代码里面还没有加入从Web页面选择文本的操作之外。当然,这个操作不会被记录,这是因为Excel它只能记录数据表的操作。所以,通常我们没有办法直接从Web页面上查找我们所需要的数据。但就象我们在文章以后部分将要看到的那样,这事实上是可以的。为了完成这件事,你可以将Internet Explorer浏览器载入成为一个对象,然后查找在Web页面上你所需要的任何文本。在开始阅读后面部分的文章之前,我们假设你还不知道有关使用这个方法的一些事情。我们需要一个更好的方法来完成这个任务。
如果你将Web页面打开为一个数据表的形式,Excel它将会自动的将Web页面导入到你的本地工作簿中,然后你就可以查找其中的内容,并且甚至可以记录在其中的操作。让我们来尝试做一下。这里有一个窍门就是在你尝试打开Web页面之前,你要记住将URL复制到剪贴板中的名字。Excel它没有一个直接的方法可以将Web页面打开成为一个文件。所以你必须首先将Web页面的URL地址复制到剪贴板中,然后将其粘贴到Excel的打开对话框中。
第二个窍门是你要意识到Excel它会自动的将我们所查找的Web页面中的文章名字复制到数据表格中的单元格中。Excel它会通过复制在HTML文档中表格的格式来完成这件事。所以我们需要分离这些单元格并且通过重新选择真正位于这些单元格中的数据来复制我们想要的数据。
一旦我们注意到以上这些窍门后,我们就可以得到以下所列出的这些结果:
Sub Macro1()
Range("A2").Select
Selection.Copy
Application.CutCopyMode = False
Workbooks.Open Filename:= _
"http://visualbasic.about.com/library/bldykblkscpa.htm"
Range("B10:C10").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 1
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
Selection.UnMerge
Range("B10").Select
Selection.Copy
ActiveWorkbook.Close
Sheets("ResultsReports").Select
Range("A2").Select
ActiveSheet.Paste
End Sub
这样看起来更好了。我们就可以使用这个来完成工作。现在我们就可以在其中加入某些所需要的循环逻辑来完成这个程序了。最后我们所看到的结果已经展示在文章最前面的图片中了。下面就是生成这些结果的一些代码:
Sub CopyWebData()
'
' CopyWebData Macro
'
Dim InCellLoc As String
Dim InCellCol As String
Dim InCellRow As String
Dim NameValue As String
Dim AddressValue As String
Dim OutCellLoc As String
Dim OutCellCol As String
Dim OutCellRow As String
InCellCol = "B"
InCellRow = "2"
OutCellRow = "1"
InCellLoc = InCellCol & InCellRow
Sheets("WebAddresses").Select
Do While Range(InCellLoc).Value <> ""
Sheets("WebAddresses").Select
Workbooks.Open Range(InCellLoc).Value
Range("B10:C10").Select
Selection.UnMerge
ArticleNameValue = Range("B10").Value
ActiveWorkbook.Close (False)
Windows("Start.xls").Activate
Sheets("ResultsReports").Select
OutCellRow = CStr(CInt(OutCellRow) + 1)
OutCellCol = "A"
OutCellLoc = OutCellCol & OutCellRow
Range(OutCellLoc).Value = ArticleNameValue
Sheets("WebAddresses").Select
InCellRow = CStr(CInt(InCellRow) + 1)
InCellLoc = InCellCol & InCellRow
Loop
End Sub