分享

浅习VBA数据上传功能

 Excel实用知识 2021-11-21

用户需求用Excel宏直接上传其中的数据导数据库中,于是我花了一个礼拜的时间对VBA的基础知识进行了解。当然只是关注于此次需求相关的部分,所以只能算是浅习(粗浅的学习)。


复制代码
VBA数据上传代码
Sub UpLoadData()
    IsLogon 
= False
    
Dim DataTable(595As 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(我把属性中的idname设置成一样的值,如.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

这让开发的结果显的不完整。

后面我只能用其他方式进行身份验证

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多