用户需求用Excel宏直接上传其中的数据导数据库中,于是我花了一个礼拜的时间对VBA的基础知识进行了解。当然只是关注于此次需求相关的部分,所以只能算是浅习(粗浅的学习)。 VBA数据上传代码 Sub UpLoadData() IsLogon = False Dim DataTable(59, 5) As String Dim WB As SHDocVw.InternetExplorer LoginForm.Show (1) '在上传数据时,需要进行身份验证 If Range('Z100').Value = '1' Then '在登录窗口函数中设置一个特殊的单元格的值来判定身份是否正确。 IsLogon = True End If If IsLogon = True Then Set WB = New SHDocVw.InternetExplorer WB.Visible = True WB.navigate '*********************.aspx' '需要完整URL,*号是为了隐去一些细节。 loading = True 'IE浏览器网页未显示完全时不进行任何操作,在For循环中用while ...DoEvents...Wend会出现预料之外的结果。 While loading If (Not WB.Busy) And WB.readyState = READYSTATE_COMPLETE Then loading = False End If Wend 'MsgBox (Range(Chr(69) & '' & 4)) '建立映射1列为E,2F,3G,4H For i = 0 To 4 For j = 0 To 59 If Application.WorksheetFunction.IsNumber(Range(Chr(69 + i) & '' & (j + 4)).Value) Then DataTable(j, i) = Range(Chr(69 + i) & '' & (j + 4)).Value Else DataTable(j, i) = 0 End If Next j Next i On Error Resume Next For i = 0 To 3 For j = 0 To 57 'MsgBox (DataTable(j, i)) WB.document.all('c' & (j + 1) & (i + 1)).Value = DataTable(j, i) '访问打开的页面中的DOM元素并赋值。 Next j Next i End If '以下获取页面控件对象txt_no1_bl 'WB.Application.Quit 'Application.ScreenUpdating = True End Sub 宏里面的2维数组,循环体结构与其他编程语言区别不大。需要说明的是这里用的SHDocVw.InternetExplorer对象,需要在vba工程中加入Microsoft Internet Controls这个引用。另外在使用VBA访问已打开的网页的dom的时候,使用的是document.all数组,这里的数据下标使用的是控件的ID(我把属性中的id和name设置成一样的值,如.net环境中的服务器端控件使用的ID一样)。 不过,代码中也存在一个较大的问题点。就是使用LogonForm窗体进行身份验证的时候,我原以为可以通过以下代码身份验证代码 Private Sub btnLogon_Click() Dim name Dim pass name = txt_name.Text pass = txt_pass.Text Set objhttp = CreateObject('MSXML2.ServerXMLHTTP') Dim url Dim data Range('Z100').Value = '' ’指定的单元格,用于存放身份验证结果的信息。 url = '*******************.aspx' ' 需要完整的URL,隐去实现细节。 objhttp.Open 'POST', url, False, '域用户名', '域密码' '域用户、密码是此过程的可选参数。 'objhttp.setRequestHeader 'User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)' objhttp.setRequestHeader 'Content-Type', 'application/x-www-form-urlencoded' objhttp.send ('name=' & name & '&pass=' & pass) If objhttp.readyState = 4 Then data = objhttp.responseText 'MsgBox (data) End If If data = 1 Then Range('Z100').Value = data txt_name.Text = '' txt_pass.Text = '' LoginForm.Hide Else MsgBox ('您没有上传数据的权限。') End If End Sub 访问服务器中的页面,并注册一个Session对象,但当接受excel数据的网页进行Session验证的时候,并没有找到这个Session。 这让开发的结果显的不完整。 后面我只能用其他方式进行身份验证 |
|
来自: Excel实用知识 > 《VBA与EXCEL》