Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5729|回复: 20

[已解决]提取数据问题~请大侠们来帮忙提速~谢谢!

[复制链接]
发表于 2008-9-25 15:01 | 显示全部楼层 |阅读模式

请大侠们来帮忙提速~

用2007的还有更多数据没显示,请看附件谢谢~

532ih375.rar (190.1 KB, 下载次数: 27)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2008-9-25 15:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 爱疯 于 2013-4-19 18:30 编辑

Private Sub CommandButton1_Click() '查找
    CommandButton2_Click
    Dim t As Single, Rcol%, RROW%, DangHao$
    t = Timer
    Dim cn As New ADODB.Connection, sql As String
    DangHao = Range("b1").Text
    If DangHao = "" Then: MsgBox "单号不能为空": Exit Sub
    Application.ScreenUpdating = False
  
    cn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName
        For Rcol = 2 To 252 Step 7
            RROW = Sheets("数据库").Cells(65536, Rcol).End(xlUp).Row
            If RROW < 4 Then GoTo 100
            sql = "select * from [数据库$" & Range(Cells(3, Rcol), Cells(RROW, Rcol + 6)).Address(False, False) & "] where 单号 like '" & DangHao & "'"
            Range("a65536").End(xlUp).Offset(1, 0).CopyFromRecordset cn.Execute(sql)
100:
        Next
    cn.Close
    Set cn = Nothing
    Application.ScreenUpdating = True
    MsgBox "共用时:" & (Timer - t) * 1000 & "毫秒"
End Sub


Private Sub CommandButton2_Click() '清空
Dim intRow As Integer
intRow = Range("a65536").End(xlUp).Row + 4
Range("A4:F" & intRow).ClearContents
End Sub

[hide] p4V5sNPq.rar (196.21 KB, 下载次数: 20)
回复

使用道具 举报

 楼主| 发表于 2008-9-25 16:06 | 显示全部楼层

这样 Sql 还是第一次用~真是学习了谢谢~
回复

使用道具 举报

发表于 2008-9-25 17:08 | 显示全部楼层

你的数据库比较规则!

所以简单的循环和变量就可以实现了!

回复

使用道具 举报

发表于 2008-9-28 17:05 | 显示全部楼层

学习学习先谢谢了

回复

使用道具 举报

发表于 2009-9-7 19:58 | 显示全部楼层

学习学习先谢谢了

回复

使用道具 举报

发表于 2009-9-8 00:36 | 显示全部楼层

VBA基础入门实例讲座

 

Excel VBA作为一种对面对Excel的编程语言,以其强大的功能和简单易
学的特点,受到越来越多的Excel用户的喜爱。俗话说万事开头难,VBA
也是头三脚难踢。可能很多人还没有接触过VBA程序的编写,所以如果
一开始就讲VBA的语法也许会让不少人望而却步或失去兴趣?所以本次
讲座就以工作中的实例来讲

本次讲座要点:
2   了解VBA的功能
2   宏的结构?工作表?单元格的表示和输入方法
2   学会让按钮执行宏
2   With语句的使用
2   变量的简单使用
2   学会使用End方法获取单元格顶点
2   单元格的查找?删除方法
2   Msgbox函数的简单使用
2   错误处理语句的使用

1 ? VBA有什么功能

VBA有什么功能呢,看下面的问题:

在一个含有众多工作表的工作簿里,经常需要取所有工作表的隐藏,而excel只能一次取消一个,而用VBA可以轻轻一点按钮,1秒钟完成这些任务。
也许你的表中数据量非常大,是不是出现过太多的公式而极大影响工作表的打开和编辑速度呢?VBA可以在瞬间完成指定的多个任务。
你的数组公式学的不是很好,也设计不出复杂的公式。这里你就可以用VBA来编写自定义函数。
也许你经常会遇到众多个工作表或工作簿需要合并和汇总,函数对于这些基本上是无能为力的,而VBA中的ADO可以轻松帮你解决。
也许工作中你想拥有自已更灵活的进销存软件或人事管理等工具,那么也可以用VBA来完成一个更适合自已的软件。

总结一下:VBA编写的程序,可以自动的、智能的完成你指定给他的多个任务,提高你的工作效率。

我们怎么来学这些节课

大家打开示例文件的“主界面工作表”,在课前预习的视频中我已讲过今天的任务是完成工作表中所示的“输入”、“查询”、“删除”、“修改”四个功能代码的编写。如果让大家现在就开始做,可能还是丈二和尚摸不着头脑,不知道从何入手,我们这节的方法是每个功能都要先满成更小的功能,然后再组合成这四个大的功能。如果还不明白,下面我们就开始一起做吧

注:可能有不少会员会对这个工作表中设置的界面很感兴趣,其实这些都是用单元格的边线和填充色完成的,以前在一段段前培训时也讲过如何制,感兴趣的可以到excel水平测试中心版块看一下相应的讲义。

3 ?编写在单元格D5输入自已名子的程序?

如果用手工来输入,每个人都能完成。但怎么样能用VBA来完成的呢?下面我们一步步来一起做吧。一定要亲自动手。

1、 在当前工作表标签上单击右键,然后再点击“查看代码”命令。然后会弹出一个窗口,这个窗口是什么呢?它是VBE编辑器,简单的说是编写VBA代码的工具,编写完成的代码也会存放在这个VBE编辑器中。使用VBA代码编写了小程序,我们在才能在工作表中完成输入自已姓名的功能。

注:打开VBE编辑器后,可能好多菜单和栏目都是我们所陌生的,不要紧,随着我们学习的深入,我们将来会对这个窗口非常的熟悉。
    

1、 我们打开了VBE编辑器,可我们该在哪里编写和存放代码呢?下面我们先给代码建一个“小家”。方法是在打开的VBA窗口中执行插入菜单/模块命令。然后我们看右上角有一个工程窗口,在工程窗口中就会看到一个刚建的模块:模块1。看下图:
   
模块插入后,在右边同时也打开了一个窗口。这是一块空白的区域,这里就是我们编写代码的地方。

1、 下面我们就开始用VBA编写在单元格D5中输入自己姓名的程序。可能没有接触过VBA的学员双是一头雾水:要实现的功能我知道,但怎么来编写啊。别急,我们先编写出来,然后再看是怎么编写的。在插入模块后,在打开的右边的代码窗口中输入以下代码:

Sub shuru()
 Range("d5") = "雨中漫步"
End Sub

下面是代码说明:

A、我们要编写的完成输入程序是运行后自动完成一个输入过程,过程程序也叫宏程序,在VBA中它的结构是:
Sub 程序名称()
  完成相应功能需要的代码
End Sub

注:sub和程序名之间要空格分隔,程序名称后的括号内可以存放一些传递的参数,这里我们先不需要了解。宏程序有开始语句也要有结束语句End Sub

B、在VBA中,表示单元格的方法主要有以下两种,

一种是:
  Range(“单元格或单元格区域地址”)
  如表示单元格A5为:Range(“A5”)

一种是:
  Range(“单元格或单元格区域地址”)
  如表示单元格A5为:Range(“A5”)

C?向单元格中输入内容可以用:
Range(“单元格”)=”单元格输入的内容”

如果清除单元格的内容,可以使用:
Range("单元格") = ""

大家可以试着把刚才程序代码的range表示方法换成cells表示

这里有一点需要补充
 Sub shuru()
 Range("D5") = "兰色幻想"
End Sub
中的shuru是程序名 , 它是自已定义的, 不是EXCEL指定的

1、 代码编写完成后了,怎么运行它呢?方法有两种,一种是放在光标放在程序中位置,然后按F5,另一种也是把光标放在程序中,点击工具栏中的运行子过程小按钮。如下图。

大家把原来主界面D5的内容删除 , 然后运行一下程序

看看效果

运行程序后,结果是什么呢,我们在D5单元格中输入“兰色幻想”四个字。
如果要完成多个单元格的输入呢?方法是在程序中继续追加代码。

小练习:补充代码,执行后除了输入姓名外,在D7、D9、D11中输入自已的年龄、性别和工作年限。

Sub 练习()
 Range("d5") = "雨中漫步"
 Range("d7") = 35         '数值不要加引号,文本要加引号
 Range("d9") = "男"
 Range("d11") = "10年"
End Sub

单元格清除有很多方法 , 根据不同的情况使用不同的方法

Cells(5, 4).ClearContents 是清除内容

还是文字左,数字右

excel默认就是这样 , 文本靠左对齐, 数字靠右对齐

前面我们编写了代码,但每次都在打开VBE编辑器才能执行显示很麻烦,我们能不能让按钮来执行代码呢?

我们继续一起做:

第一步:插入一个按钮。方法:执行视图菜单/工具栏/窗体,可以打开窗体工具栏,然后用鼠标点击按钮形状的控件,左键不松拖到工作表中以拖画出一个按钮。

第二步:拖画出按钮后会弹出一个指定宏的对话框,在下面的列表中可以看到我们刚才编写的宏程序名称“shuru”,选取shuru后点击“确定”按钮完成。
大家把D5、D7、D9、D11的内容删除,然后单击按钮试下效果。

练习: 编写一段清空D5?D7?D9?D11内容的程序
注:添加新的代码可以新建模块,也可以在原来的模块里添加新的程序。
  
大家做完这段代码后休息10钟吧,10分种后亮一下自已编写的代码.

继续 , 大家安静, 等下会有讨论时间

5 ?向其他工作表的单元格输入数据?

前面我们学会在在当前工作表中的单元格中输入数据,下面我们学习如何把数据输入到其他工作表中。

下面我们需要完成一个任务:向“数据库”工作表中的A4单元格输入当前工作表D5的姓名。

具体步骤:
1、 新建或在刚才的代码后,再输入下面的程序:
 Sub sheetshuru()
 Sheets("数据库").Cells(4, 1) = Sheets("主界面").Range("D5")
End Sub

如果程序是在主界面工作表中运行 , 可以写为
 Sub sheetshuru()
     Sheets("数据库").Cells(4, 1) = Range("D5")
   End Sub

补充说明: 在同一个模块中 , 不能有两个相同的程序名称

下面是代码说明:

A? 在VBA中表示具体工作表的方法是:
 Sheets(“工作表名称”)

也可以用sheets(序号)来表示工作表,如第3个工作表可以写为:sheets(3) 这里sheet后的s不能缺省,括号中的数字不能加引号

A? 表示指定工作表中某个单元格的方法是:
 Sheets(“工作表名称”).cells(行数,列数)

Sheets(“工作表名称”).Range(“单元格地址”)

工作表和单元格之间用点隔开

一个单元格的值等于另一个单元格值用=连接即可,等号后的单元格值会输入到等号前的单元格中。

小练习:在刚才的程序中补充,完成"数据库"工作表中的A4、B4、C4、D4单元格分别等于"主界面"工作表的D5、D7、D9、D11单元格值.

结果是:
Sub sheetshuru()
 Sheets("数据库").Cells(4, 1) = Sheets("主界面").Range("D5")
 Sheets("数据库").Cells(4, 2) = Sheets("主界面").Range("D7")
 Sheets("数据库").Cells(4, 3) = Sheets("主界面").Range("D9")
 Sheets("数据库").Cells(4, 4) = Sheets("主界面").Range("D11")
End Sub
从代码我们可以看出,每句代码都带有Sheets("数据库"),如果有很多行这样的代码,会造成过多的重复录入。我们是否可以只写一次,后面的工作表代码(Sheets("数据库"))可以省略呢?

答案是肯定的,我们可以用with语句。使用with后的代码更改为:
Sub sheetshuru()
With Sheets("数据库")
 .Cells(4, 1) = Sheets("主界面").Range("D5")
 .Cells(4, 2) = Sheets("主界面").Range("D7")
 .Cells(4, 3) = Sheets("主界面").Range("D9")
 .Cells(4, 4) = Sheets("主界面").Range("D11")
End With
End Sub

with作用就是可以省略共同的 "主语"

如果程序执行时当前工作表名称是主界面工作表,则sheets("主界面")可以省略

6 ?返回最后一个非空单元格行数

以上我们通过编写代码,可以把主界面的信息输入到数据库工作表中第四行的1-4列,但实际上数据会不停的添加,输入的位置也会不断的下移,并不是固定的,所以我们在输入前需要确定数据库中输入的行数。

如何用VBA来定位呢?方法是
 Range(“A65536”).End(xlup)就表示A列最下边一个非空单元格。
就是从A列最下边一个单元格,按 ctrl+向上箭头
End(xlup)=按 ctrl+向上箭头

Range("A65536").End(xlup)返回的是一个单元格,如何得到它的行数呢

Range(“A65536”).End(xlup).Row

单元格.Row 可以得到单元格所在的行数

而Range(“A65536”).End(xlup).row+1则是我们需要输入新记录的位置所在的行

有关end用法大家可以参考vba自带的帮助

输入的行数我们得到了。我们就可以完成第一个输入按钮的大部分任务,即不断的向数据库工作表添加新的人员信息。

Sub luru()
  With Sheets("数据库")
  .Cells(.Range("A65536").End(xlUp).Row + 1, 1) = Range("D5")
  .Cells(.Range("A65536").End(xlUp).Row + 1, 2) = Range("D7")
  .Cells(.Range("A65536").End(xlUp).Row + 1, 3) = Range("D9")
  .Cells(.Range("A65536").End(xlUp).Row + 1, 4) = Range("D11")
  End With
End Sub

上面的代码中把以前的4替换成了可变的行数

解决这个问题的方法是,先把行数交给一个"东东"保存,这个"东东"就是VBA所说的变量
使用变量后的代码如下:
Sub 录入()
Dim myrow As Long
  With Sheets("数据库")
  myrow = .Range("A65536").End(xlUp).Row + 1
  .Cells(myrow, 1) = Range("D5")
  .Cells(myrow, 2) = Range("D7")
  .Cells(myrow, 3) = Range("D9")
  .Cells(myrow, 4) = Range("D11")
  End With
End Sub

A、 在使用变量之前有时需要先声明一下它,即向程序隆重推出:我要在程序中使用变最了,它是***类型的。即:"Dim 变量名称 as 数据类型"

B\  数值类型有整数,有长整数(long)这里由于需要输入的行数在1-65536行。所以使用了long的数据类型 ,具体的变量数据类型请参考帮助或其他图书资料。

变量的作用就是临时存放数据

A、 myrow = .Range("A65536").End(xlUp).Row + 1,这句的意思就是把取得的输入行数放在变量myrow中,然后在后面myrow就代替了需要输入的行数。

就是因为输入了A列数据后 , 后来.Range("A65536").End(xlUp).Row的结就变化了

   输入的主要功能完成了,下面的让大家来做,要求添加代码,在输入完成后把主界面的D5、D7、D9、D11单元格清空。


Sub luru()
Dim myrow As Long
  With Sheets("数据库")
  myrow = .Range("A65536").End(xlUp).Row + 1
  .Cells(myrow, 1) = Range("D5")
  .Cells(myrow, 2) = Range("D7")
  .Cells(myrow, 3) = Range("D9")
  .Cells(myrow, 4) = Range("D11")
  End With
      Range("D5") = ""
      Range("D7") = ""
      Range("D9") = ""
      Range("D11") = ""
End Sub

教如何判断单元格的数值是整数?
答:int(a)=a

好 , 最后一小功能, 讲完今天的课结束

7 ?使用提示信息?

以上我们完成输入的功能,下面呢我还想实现一个要求,即在输入完成后弹出一个提示框,提示:输入成功。
   要完成如上功能,需要使用msgbox函数,使用方法很简单,只须要在程序的结尾添加下面的一句:
MsgBox "录入完成"

很简单啊 , 判断行数是否为1, 如果是1就不删除

Sub luru()
Dim myrow As Long
  With Sheets("数据库")
  myrow = .Range("A65536").End(xlUp).Row + 1
  .Cells(myrow, 1) = Range("D5")
  .Cells(myrow, 2) = Range("D7")
  .Cells(myrow, 3) = Range("D9")
  .Cells(myrow, 4) = Range("D11")
  End With
      Range("D5") = ""
      Range("D7") = ""
      Range("D9") = ""
      Range("D11") = ""
   MsgBox "录入成功"
     
End Sub

后面还有三个按钮的功能 , 咱们明天或后天再讲, 大家可以在VBA帮助中先学习一下FIND方法的使用

回复

使用道具 举报

发表于 2009-9-8 02:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2009-9-8 05:30 | 显示全部楼层

学习[em02][em02]
回复

使用道具 举报

发表于 2009-9-14 13:39 | 显示全部楼层

学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-14 14:23 , Processed in 0.258791 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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