网上找到一个用于EXCEL的VBA代码,能用但是一直不理解,能帮我翻译下吗,谢谢

Sub DoSql()
Dim cnn As Object
Dim rst As Object

Dim Mypath As String, Str_cnn As String, Sqlstr As String

Dim i As Long

Set cnn = CreateObject("adodb.Connection") ' CreateObject '('adodb.connection')
Mypath = ThisWorkbook.FullName
If Application.Version < 12 Then
Str_cnn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & Mypath
Str_cnn = provider
Else
Str_cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source = " & Mypath
End If
cnn.Open Str_cnn
Sqlstr = "SELECT * FROM [ListInAdvance$]" '//请在此处写入你的SQL代码
Set rst = cnn.Execute(Sqlstr)
Cells.ClearContents
For i = 0 To rst.Fields.Count - 1
Cells(1, 1) = rst.Fields(i).Name

Next
Range("a2").CopyFromRecordset rst '
cnn.Close
Set cnn = Nothing
End Sub

Sub DoSql()

这个过程名叫DoSql,运行不需要任何参数


Dim cnn As Object

定义cnn 它是是一个对象


Dim rst As Object


Dim Mypath As String, Str_cnn As String, Sqlstr As String

定义了一堆字符串


Dim i As Long

定义i是长整数


Set cnn = CreateObject("adodb.Connection") 

简而言之创建了ADOdb连接,你可以理解为启用了一个和不同类型数据库交互的中间组件

ADOdb,就像一根吸管,各种数据库就像是奇形怪状的杯子,正常的杯子从上面的开口取水,如果是瓶颈拧成麻花的杯子可能直接就倒不出来,要特殊的倒法。取数据就像取水,ADOdb做的事情是,只要把吸管放好,就可以取水,而不必掌握不同杯子特殊的倒水方法。


Mypath = ThisWorkbook.FullName

这里是给字符串Mypath赋值,让他等于vba代码所在文件的完整路径,比如这段代码放在了C盘根目录下的123.xlsm里,运行之后Mypath="C:\123.xlsm"


If Application.Version < 12 Then

Str_cnn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & Mypath

Str_cnn = provider
Else
Str_cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source = " & Mypath
End If

这里是在判断excel版本,不同的excel版本使用ADO的时候引擎版本不一样,所以分开设置。

    如果低于office12(其实就是2007)引擎使用OLEDB.4.0,数据源就是Mypath

    给字符串Str_cnn赋值,其实就是指明了Provider和DataSource参数

    Provider其实就是ADO使用的引擎

    DataSource就是数据源

    如果高于office12(高于office2007)

    引擎使用OLEDB.12.0,数据源还是Mypath

Str_cnn = provider我也没看懂为什么这么写。

是不是sub 前面有const provider


cnn.Open Str_cnn

连接数据库


Sqlstr = "SELECT * FROM [ListInAdvance$]" '//请在此处写入你的SQL代码
Set rst = cnn.Execute(Sqlstr)

执行了你的sql语句

设置rst为查询到的结果对象


Cells.ClearContents

清除sheet里所有内容,保留格式


For i = 0 To rst.Fields.Count - 1
Cells(1, 1) = rst.Fields(i).Name

Next

遍历结果集,在A1单元格填上域(Field)名,但是其实只保留最后一个。(结果集)


Range("a2").CopyFromRecordset rst '

在以A2为左上角定点的区域里放上查询得出的结果集。


cnn.Close

关闭ADOdb连接


Set cnn = Nothing

释放cnn对象内存


End Sub

温馨提示:答案为网友推荐,仅供参考
相似回答