用户需求用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
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
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。
这让开发的结果显的不完整。
后面我只能用其他方式进行身份验证