ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 770|回复: 2

[分享] 利用表格作为数据库

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-2-22 21:48 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 wcj109 于 2023-2-22 21:56 编辑

Dim cnn, rs, rs1, tab1, mycmd, nam '模块级变量
Sub 连接数据库()‘利用表格作为数据库
        Set cnn = CreateObject("ADODB.Connection")
        Set rs = CreateObject("ADODB.Recordset")
        Set
rs1 = CreateObject("ADODB.Recordset")
        Set mycmd = CreateObject("ADODB.command")
                                                '            If Dir(ThisWorkbook.Path & "\" & "*.mdb") = "答题查询.mdb" Then
                                                '                my = ThisWorkbook.Path & "\答题查询.mdb " '连接数据库 ace.OLEDB.12.0  jet.OLEDB.4.0";Extended Properties=Excel 8.0;
                                                '                Else
                                                '                my = "d:/数据库/答题查询.mdb"
                                                '            End If
my = ThisWorkbook.FullName '完整路径
tab1 = "[" & Sheet3.Range("F2") & "$]" '表格名称  
             If Application.Version < 12 Or InStr(Replace(UCase(Application.Caption), UCase(Application.ActiveWorkbook.Name), ""), "WPS") > 0 Then 'Application.Caption标题栏文本
                cnn.Open "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & my ' & ";hdr=yes;imex=1" '表格连接
'                cnn.Open "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & my '连接数据库 ace.OLEDB.12.0  jet.OLEDB.4.0’access作为数据库
                         Else
                 cnn.Open "Provider=Microsoft.ace.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & my '& ";hdr=yes;imex=1" '表格连接
'                cnn.Open "Provider=Microsoft.ace.OLEDB.12.0;Data Source=" & my
            End If      
End Sub
‘写入工作表
Sub 写入表格1()
b = Range("b60000").End(xlUp).Row
h = Range("iv3").End(xlToLeft).Column
' On Error Resume Next
If rs.RecordCount > 0 Then
    rs.MoveFirst
   Range(Range("a3"), Cells(b, h)).Clear 'Contents
End If
    If Not rs.EOF Then
             '     Sheet1.[b2].CopyFromRecordset rs
                   [a3] = "序号"
          For i = 0 To rs.Fields.Count - 1
                   Cells(3, i + 2) = rs.Fields(i).Name '表头名称
          Next

            For i = 1 To rs.RecordCount
                  For j = 0 To rs.Fields.Count - 1
                        Cells(i + 3, j + 2) = rs.Fields(j) '添加行
                 Next j
                  rs.MoveNext
            Next i
           Columns("b:b").NumberFormatLocal = "yyyy/m/d" '设置b列为日期格式
    '        Sheet3.Range("e:e").NumberFormatLocal = "@"

               '1\添加序号
                    i = 1
                    Do
                       Range("a" & i + 3) = i
                       i = i + 1
                    Loop While Range("b" & i + 3) <> ""

                '2\设置表格格式
    '             Sheet1.Activate
           Call 设置表格格式
       Else
                Range("a4:ag65355").Clear
                MsgBox "没有查到"
     End If
End Sub


Sub 设置表格格式()
  row1 = Range("a63535").End(xlUp).Row '表格总的行数
  col = Range("a3").End(xlToRight).Column '表格总的列数
  bi = 3 '标题行行号,颜色,蓝色
  qi = 4 '单元格区域起始行号
  
      With Range(Cells(qi, 1), Cells(row1, col)) '数据区域大概设置
        '1、单元格边框、颜色
        '   .Borders.LineStyle = 0 '去边框3行1列起
            .Borders.LineStyle = 1
        '   .Borders.ColorIndex = 5 '边框颜色
         
          '2、调整单元格的字体及颜色大小
             .Font.Name = "宋体" '"仿宋体"
        '     Range("a3:q" & i).Font.FontStyle = "Bold"
             .Font.Bold = False '是否粗体
             .Font.ColorIndex = 1
             .Font.Size = 10
         '3调整行列的宽高度及换行
         .WrapText = True '自动换行
        .Rows.AutoFit '自动调整行高
'        .Columns.AutoFit '自动调整列宽
        
    End With
    With Range(Cells(bi, 1), Cells(bi, col))
     '4、调整标题行的宽度和字体加深
        .Interior.ColorIndex = 37 '调整单元格颜色,第二行蓝色
       .Font.Bold = True '第二行字体加深
       .Font.Size = 10
       .Borders.LineStyle = 1
        .RowHeight = 26 '调整第二行的行高,columnwidth=3列宽
'         .Columns.AutoFit '自动调整列宽
    End With
    '5、单独调整列宽度和字体加深
    Range(Cells(bi, 1), Cells(row1, col)).Columns.AutoFit '自动调整列宽
'        Range("d:d").ColumnWidth = 25 'b列列宽设置
'        Range("b:b").ColumnWidth = 9.13
'        Range("c:c").ColumnWidth = 9
'        Range("e:e").ColumnWidth = 13
        
                '        Range("ah:ah").Font.Size = 9
End Sub

sub 查询()'利用sql语句查谒
Call 连接数据库
sql="select *  from  "  &  tab1  
rs.Open Sql, cnn, 1, 3
Sheet3.Activate'写入sheet3表格
Call 写入表格1


rs.Close
  cnn.Close
   Set cnn = Nothing

end sub



TA的精华主题

TA的得分主题

发表于 2023-2-24 16:47 | 显示全部楼层
给你点赞了

TA的精华主题

TA的得分主题

发表于 2023-2-24 22:01 | 显示全部楼层
代码虽然分过程写了,感觉不整齐,有些乱。
送你一个模块吧
  1. Option Explicit
  2. '**********************************************************
  3. '*****2022/12/29  整理这个模块,以便方便以后使用********
  4. '*****                        丹哥编辑                                        ********
  5. '*****本模块用于sql代码调用Excel工作簿的数据源数据******
  6. '***********************************************************
  7. '单独使用本模块,需要设置全局变量wbFullName

  8. Public wbFullName As String

  9. '通用的输入sql公式来查询得出数组(不包括标题)
  10. Public Function ESQlArrNoTitle(sql As String)
  11.     'SQLArr最终为数组形式
  12.     Dim rs As Object, cn As Object
  13.     Dim arr(), i%, j%
  14.    ReDim arr(0 To 0, 0 To 0)
  15.     Set rs = ESqlExecuteRecordset(sql)
  16.     Set cn = rs.activeconnection
  17.     '    Stop
  18.     If rs.RecordCount > 0 Then
  19.         ReDim arr(1 To rs.RecordCount, 1 To rs.Fields.Count)
  20.         rs.MoveFirst
  21.         For i = 1 To UBound(arr)
  22.             For j = 1 To UBound(arr, 2)
  23.                 arr(i, j) = rs.Fields(j - 1).Value
  24.             Next j
  25.             rs.movenext
  26.         Next i
  27.     End If
  28.     '    Stop
  29.     ESQlArrNoTitle = arr '如果没有查到结果,那么数组的最大小标就是0
  30.     rs.Close: Set rs = Nothing
  31.     cn.Close: Set cn = Nothing
  32.     Erase arr

  33. End Function
  34. '通用的输入sql公式来查询得出数组(包括标题)
  35. Public Function ESQlArr(sql As String)
  36.     'SQLArr最终为数组形式
  37.     Dim rs As Object, cn As Object
  38.     Dim arr(), i%, j%
  39.    ReDim arr(0 To 0, 0 To 0)
  40.     Set rs = ESqlExecuteRecordset(sql)
  41.     Set cn = rs.activeconnection
  42.     '    Stop
  43.     If rs.RecordCount > 0 Then
  44.         ReDim arr(1 To rs.RecordCount + 1, 1 To rs.Fields.Count)
  45.         rs.MoveFirst
  46.         For i = 2 To UBound(arr)
  47.             For j = 1 To UBound(arr, 2)
  48.                 arr(i, j) = rs.Fields(j - 1).Value
  49.             Next j
  50.             rs.movenext
  51.         Next i
  52.         For j = 1 To UBound(arr, 2)
  53.             arr(1, j) = rs.Fields(j - 1).Name
  54.         Next j
  55.     End If
  56.    
  57.     '    Stop
  58.     ESQlArr = arr '如果没有查到结果,那么数组的最大小标就是0
  59.     rs.Close: Set rs = Nothing
  60.     cn.Close: Set cn = Nothing
  61.     Erase arr

  62. End Function
  63. '连接数据库,返回连接对象
  64. Private Function CreateConnectionE() As Object
  65.       Dim cn As Object
  66. '      wbFullName = ThisWorkbook.Path
  67.       Set cn = CreateObject("Adodb.Connection")
  68.       
  69.       With cn
  70.             .Provider = "Microsoft.Ace.Oledb.12.0;extended properties=excel 12.0"
  71.             .Open wbFullName
  72.       End With
  73.       If Err.Number <> 0 Then
  74.             Set CreateConnectionE = Nothing
  75.       Else
  76.             Set CreateConnectionE = cn
  77.       End If
  78. End Function

  79. '执行增、删、改等操作的函数,不用返回值
  80. Public Function ESqlExcuteNonQuery(sql As String) As Boolean
  81.       Dim cn As Object

  82.       Set cn = CreateConnectionE
  83.       If cn Is Nothing Then   '连接失败
  84.             ESqlExcuteNonQuery = False
  85.             Exit Function
  86.       End If
  87. '      On Error Resume Next
  88.       cn.Execute sql
  89.       If Err.Number <> 0 Then
  90.             cn.Close: Set cn = Nothing
  91.             ESqlExcuteNonQuery = False
  92.       Else
  93.             cn.Close: Set cn = Nothing
  94.             ESqlExcuteNonQuery = True
  95.       End If
  96. End Function

  97. '执行SQL查询,返回单个值的函数
  98. Public Function ESqlExecuteSingle(sql As String) As Variant
  99.       Dim cn As Object, rs As Object

  100.       Set cn = CreateConnectionE
  101.       If cn Is Nothing Then '连接失败
  102.             ESqlExecuteSingle = 0
  103.             Exit Function
  104.       End If
  105.       On Error Resume Next
  106.       Set rs = cn.Execute(sql)
  107.       If Err.Number <> 0 Then
  108.             ESqlExecuteSingle = 0
  109.       Else
  110.             If Not IsNull(rs.Fields(0).Value) Then
  111.                   ESqlExecuteSingle = rs.Fields(0).Value
  112.             Else
  113.                   ESqlExecuteSingle = 0
  114.             End If
  115.       End If
  116. End Function

  117. '执行SQL查询,返回一个记录集
  118. Private Function ESqlExecuteRecordset(sql As String) As Object
  119.       Dim cn As Object, rs As Object

  120.       Set cn = CreateConnectionE
  121.       If cn Is Nothing Then  '连接失败
  122.             Set ESqlExecuteRecordset = Nothing
  123.             Exit Function
  124.       End If
  125.       On Error GoTo errFlag
  126.       Set rs = CreateObject("Adodb.Recordset")
  127.       rs.Open sql, cn, 3, 2
  128.       Set ESqlExecuteRecordset = rs
  129.       Exit Function
  130. errFlag:
  131.       Set ESqlExecuteRecordset = Nothing
  132.       cn.Close: Set cn = Nothing
  133. End Function

复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-8 19:11 , Processed in 0.025851 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表