用EXCEL查询 SQL SERVER 数据库 U8 876的现存量。有重复的用黄色标记。

年纪大了。发现知识是用来分享的。整天的在网上爬别人的经验。现在也希望能为这个网络留下一点自己的经验。先把EXCEL查询SQL SERVER 数据库的代码黏贴出来。当然,本人的方法并不是最好的,还有很多需要改进的地方。只为还在学习的同学一起学习交流而分享。代码都有注释,应该比较好看的懂。代码送上。

[html] view plain copy
  1. Public Function search_sql()  
  2.     
  3.     
  4.     
  5.     
  6. Dim I2 As Integer, j2 As Integer, sht As Worksheet     ' i2,j2为整数变量;sht 为excel工作表对象变量,指向某一工作表  
  7.     
  8. Dim CR, JR, C, F, CFKG As Integer     'CR Excel表的需要查询的行序号,JRExcel表的得到的结果行序号, C  Excel表的列序号 F 查询结果的总记录数  I SQL表的字段序号  
  9.     
  10. Dim strCn As String, strSQL As String '字符串变量  
  11.     
  12.     
  13.     
  14.     
  15.     
  16.     
  17.     
  18.     
  19.         
  20.    '========================循环读取查询=====================================  
  21.       
  22.        CR = 2  '表示从第二行开始,行序号  
  23.        JR = CR '表示从第二行开始,行序号  
  24.        C = 1  '表示从第一列开始,列序号  
  25.        
  26.        
  27.           
  28.         
  29.           
  30.     '这里需要注意的是,如果用这一句,只能在当前工作表中正常使用。另存为宏后就不能正常工作了  
  31.    'ThisWorkbook指的是当前工作簿,不是活动工作表。她就指向宏的工作簿了。  
  32.        
  33.    ' Set sht = ThisWorkbook.Worksheets("Sheet1")'把sht指向当前工作簿的Test工作表  
  34.        
  35.    '改用ActiveWorkbook就指向当前活动工作簿了。就能正常工作了。O(∩_∩)O哈哈~  
  36.         
  37.     Set sht = ActiveWorkbook.Worksheets("Sheet1") '把sht指向当前工作簿的Test工作表  
  38.         
  39.         
  40.         
  41.         
  42.         
  43.         
  44.        Dim strA As String     '我定义的字符串变量名  
  45.      ' Dim strB(10) As String     '我定义的字符串变量名  
  46.        
  47.      Dim length As Long, count As Long  
  48.     ' zonglieshu = 1 To Worksheets(2).UsedRange.Rows.Count  '得到总的列数,本例中不适用。  
  49.     ' length = sht.UsedRange.Columns.count '得到该列元素个数  
  50.         
  51.          
  52.     '=================唯一的缺点就是这句话还有问题,有时候多,有时候少的。===================  
  53.          
  54.        'length = sht.UsedRange.Rows.count '得到该列元素个数  
  55.         
  56.         
  57.        ' MaxRows = Range("A1").CurrentRegion.Rows.count          '统计行数  
  58.        ' MaxCols = Range("A1").CurrentRegion.Columns.count       '统计列数  
  59.         
  60.         
  61.         
  62.         
  63.         length = Range("A1").CurrentRegion.Rows.count  
  64.         
  65.    '=========================================================================================  
  66.         
  67.         
  68.         
  69.         
  70.       For CR = 2 To length + 1  
  71.         
  72.    
  73.         
  74.       'strA = Range("21").Value  
  75.       strA = sht.Cells(CR, 1).Value  
  76.       'strA = Worksheets("Sheet1").Cells(R, C).Value  
  77.         
  78.         
  79.         
  80.         
  81.       MsgBox ("共" & length & "行:第" & CR & "表格中的内容为:" & strA)  
  82.         
  83.         
  84.       If (strA = Null) Then  
  85.          
  86.       GoTo continue  
  87.          
  88.         
  89.          
  90.        Else  
  91.   '====================================  
  92.     
  93.     
  94.     
  95.     
  96.     
  97.     
  98.     
  99.     
  100.     
  101.     
  102.     
  103.     
  104.     
  105.     
  106.     
  107.     
  108.     
  109.     
  110.     
  111.     
  112.     
  113.     
  114.     
  115.     
  116.     
  117. '方法一:直接引入数据库驱动程序  
  118. '工具 ---〉引用 ---〉Microsoft ActiveX data objects ....  
  119. '然后定义两个驱动  
  120. 'Dim cn As New ADODB.Connection '定义数据链接对象 ,保存连接数据库信息;请先添加ADO引用  
  121. 'Dim rs As New ADODB.Recordset '定义记录集对象,保存数据表  
  122. ' Set cn = New ADODB.Connection  
  123. ' Set rs = New ADODB.Recordset  
  124.     
  125.     
  126.     
  127. '方法二:不用引入驱动,直接设置驱动。  
  128.     
  129.  Dim cn As Object  
  130.  Dim rs As Object  
  131.    
  132.   'Dim cn As New ADODB.Connection   '数据库连接对象  
  133.   'Dim rs As New ADODB.Recordset     '记录集对象  
  134.    
  135.  Set cn = CreateObject("Adodb.Connection")  
  136.  Set rs = CreateObject("Adodb.Recordset")  
  137.   
  138.   
  139.    
  140.   
  141.   
  142.   
  143.     
  144. '=========================我用的是方法二======================  
  145. '  
  146. '  
  147. '  
  148. '  
  149.         
  150.     
  151.     
  152.     
  153.     
  154.     '这里需要注意的是,如果用这一句,只能在当前工作表中正常使用。另存为宏后就不能正常工作了  
  155.    'ThisWorkbook指的是当前工作簿,不是活动工作表。她就指向宏的工作簿了。  
  156.        
  157.    ' Set sht = ThisWorkbook.Worksheets("Sheet1")'把sht指向当前工作簿的Test工作表  
  158.        
  159.    '改用ActiveWorkbook就指向当前活动工作簿了。就能正常工作了。O(∩_∩)O哈哈~  
  160.         
  161.     'Set sht = ActiveWorkbook.Worksheets("Sheet1") '把sht指向当前工作簿的Test工作表  
  162.       
  163.       
  164.       
  165.       
  166.       
  167.     
  168.     
  169.     
  170.     
  171.       
  172.     
  173.     strCn = "Provider=sqloledb;Server=127.0.0.1;Database=CHAXUN_TEST;Uid=sa;Pwd=yangji903" '定义数据库链接字符串  
  174.         
  175.     '下面的语句将读取数据表数据,并将它保存到excel工作表中:工作表为一张两维表,记录集也是一张两维表  
  176.       
  177.      '  ConnectString = "FileDSN=student.dsn;UID=lee;PWD=123"  
  178.       
  179.       
  180.       
  181.   
  182.          
  183.          
  184.          
  185.         
  186.        'MsgBox (strA) '弹出对话框,显示获得到的值  
  187.         
  188.        ' MsgBox "A1单元格的当前值为:" & length     '弹出对话框,显示获得到的值  
  189.         
  190.         
  191.       'For CR = 2 To length  
  192.         
  193.          
  194.         
  195.         
  196.         
  197.          'Worksheets(1).Cells(5, 5).Interior.ColorIndex = 6        'Cells(5, 5)该单元格变成黄色  
  198.         
  199.         
  200.         
  201.      ' If Cells(i, 2) = "a" Then  
  202.       '  Worksheets(1).Cells(i, 2).Interior.ColorIndex = 6        '当单元格="a"时该单元格变成黄色  
  203.          'count = count + 1  
  204.      ' End If  
  205.   
  206.    ' MsgBox (strA)  
  207.       
  208.       
  209.         
  210.     'strSQL = "SELECT * FROM [dbo].[CurrentStock] " '定义SQL查询命令字符串  
  211.       
  212.     'strSQL = "SELECT top 100 * FROM [dbo].[CurrentStock] " '定义SQL查询命令字符串  
  213.       
  214.       
  215.       
  216.     'VB 的SQL查询语句,这个非常重要哦。  
  217.       
  218.     strSQL = "SELECT * FROM [dbo].[CurrentStock] where cInvCode = '" & strA & "'"  
  219.       
  220.       
  221.        'sht.Cells(6, 7) = strA  
  222.       
  223.         
  224.     cn.Open strCn '与数据库建立连接,如果成功,返回连接对象cn  
  225.     rs.Open strSQL, cn '执行strSQL所含的SQL命令,结果保存在rs记录集对象中  
  226.        
  227.        
  228.        
  229.        
  230.    
  231.        
  232.   
  233.         
  234.         
  235.     '测试用  
  236.     'Dim a As String  
  237.     'Dim b As String  
  238.     'a = ActiveWorkbook.Name '返回活动工作薄的名称  
  239.     'b = ThisWorkbook.Name   '返回当前工作簿名称  
  240.     'MsgBox "程序被调用。" & a & "=====" & b  
  241.         
  242.      CFKG = 0 '表示查询到的结果是否重复,如果重复,底色变黄色。  
  243.         
  244.     Do While Not rs.EOF '当数据指针未移到记录集末尾时,循环下列操作  
  245.       
  246.       
  247.      
  248.    '================================现把背景色变白--------------  
  249.         sht.Cells(JR, C + 1).Interior.ColorIndex = 2        '当单元格="a"时该单元格变成黄色  
  250.         sht.Cells(JR, C + 2).Interior.ColorIndex = 2        '当单元格="a"时该单元格变成黄色  
  251.         sht.Cells(JR, C + 3).Interior.ColorIndex = 2       '当单元格="a"时该单元格变成黄色  
  252.      
  253.      
  254.      
  255.      
  256.      
  257.      
  258.         
  259.       sht.Cells(JR, C + 1) = rs("cInvCode") '把当前记录的字段1的值保存到sheet1工作表的第I行第C+1列  
  260.       sht.Cells(JR, C + 2) = rs("iQuantity") '把当前记录的字段1的值保存到sheet1工作表的第I行第C+2列  
  261.       sht.Cells(JR, C + 3) = rs("ItemId") '把当前记录的字段1的值保存到sheet1工作表的第I行第C+3列  
  262.       'sht.Cells(R, C + 3) = rs("waijing") '把当前记录的字段1的值保存到sheet1工作表的第I行第1列  
  263.       'sht.Cells(R, C + 4) = rs("zifuchuan") '把当前记录的字段1的值保存到sheet1工作表的第I行第1列  
  264.       'sht.Cells(R, C + 5) = rs("riqi") '把当前记录的字段1的值保存到sheet1工作表的第I行第1列  
  265.       'sht.Cells(R, C + 6) = rs("shijian") '把当前记录的字段1的值保存到sheet1工作表的第I行第1列  
  266.       'sht.Cells(R, C + 7) = rs("text") '把当前记录的字段1的值保存到sheet1工作表的第I行第1列  
  267.         
  268.         
  269.         
  270.         
  271.         
  272.                                             '遍历该列单元格  
  273.       If CFKG > 0 Then  
  274.         
  275.         'Worksheets(1).Cells(JR, 2).Interior.ColorIndex = 6        '当单元格="a"时该单元格变成黄色  
  276.           
  277.         sht.Cells(JR, C + 1).Interior.ColorIndex = 6        '当单元格="a"时该单元格变成黄色  
  278.         sht.Cells(JR, C + 2).Interior.ColorIndex = 6        '当单元格="a"时该单元格变成黄色  
  279.         sht.Cells(JR, C + 3).Interior.ColorIndex = 6        '当单元格="a"时该单元格变成黄色  
  280.         
  281.         
  282.       End If  
  283.         
  284.         
  285.         
  286.         
  287.           
  288.       rs.MoveNext '把指针移向下一条记录  
  289.         
  290.         
  291.       JR = JR + 1 'i加1,准备把下一记录相关字段的值保存到工作表的下一行  
  292.       CFKG = CFKG + 1  
  293.         
  294.     Loop '循环 Do While Not rs.EOF  
  295.       
  296.    
  297.         
  298.     rs.Close '关闭记录集,至此,程序将把某数据的字段1保存在工作表sheet1的第1列,行数等于数据表的记录数  
  299.     Set rs = Nothing  
  300.     cn.Close '关闭数据库连接,释放资源  
  301.     Set cn = Nothing  
  302.         
  303.         
  304.         
  305.          End If  
  306. continue:  
  307.   ' CR = CR + 1  
  308.         
  309.        
  310.  Next  
  311.  CR = CR + 1  
  312.    
  313.        
  314.     'CR = CR + 1  
  315.       
  316.       
  317.   
  318.         
  319.   
  320.     
  321. End Function<pre name="code" class="html">    



再在表格一内添加一个按钮。代码如下

[html] view plain copy
  1. Private Sub CommandButton1_Click()  
  2.     
  3.     
  4. Call search_sql  
  5.     
  6.     
  7.     
  8. End Sub  

效果如图:

用EXCEL查询 SQL SERVER 数据库 U8 876的现存量。有重复的用黄色标记。

用EXCEL查询 SQL SERVER 数据库 U8 876的现存量。有重复的用黄色标记。

用EXCEL查询 SQL SERVER 数据库 U8 876的现存量。有重复的用黄色标记。

用EXCEL查询 SQL SERVER 数据库 U8 876的现存量。有重复的用黄色标记。

好了。效果就是这样的。主要是用来解决想要查的存货编码太多,U8又不能批量查询。所以写这个可以帮助批量查询。本想直接上传文件,可惜不知道在哪上传。


0