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