您的位置:程序门 -> vb -> 数据库(包含打印,安装,报表)



excel 做数据源的经典问题征解


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


excel 做数据源的经典问题征解[已结贴,结贴人:lwmwork]
发表于:2007-11-29 04:53:19 楼主
一个excel表做数据源,表头为(序号、编号、姓名、性别、年龄、单位),表可能存在以下问题:
1、序号可能不连续或重复
2、编号首字母可能为0,被认作了数字
3、有重复人员登记(编号、姓名相同)
4、性别有空缺的
5、年龄有录入出生日期或出生年月的,或excel不认识的日期的(如80.5.680、580年5月80。5。6
6、单位有同一个单位两种名称的
现在要用vb做一个统计程序,以该表为数据源,如何进行数据有效性校验,要求
1、第一个问题可直接重新编序号,可省略
2、第2、3、4、5出现问题,以提示框告知问题记录行
3、第5项最好能自动变成年龄要求大于15,小于65
4、全部通过后,以提示框显示单位列表,提醒是否需要更改部分单位名称

那位大侠能给出代码,感激不尽,这个问题应用应该很广泛,我是冲着这个问题来csdn注册的,不要说使用或先转换成access,因为熟悉excel的人远多于用access的,报上来的都是excel表,我是新手,粗通vb,只有边查边看的水平,自己实在写不出,拜托!!!,本人e-mail:lwmwork@tom.com
发表于:2007-11-29 20:43:321楼 得分:0
一个白天无人应答,快要沉了,问题难度应该不算大,但有点麻烦,是吧!  
补充问题:  
1、序号可能不连续或重复              
2、编号首字母可能为0,被认作了数字              
3、有重复人员登记(编号、姓名相同)              
4、性别有空缺的              
5、年龄有录入出生日期或出生年月的,或excel不认识的日期的(如80.5.6或80、5或80年5月或80。5。6)              
6、单位有同一个单位两种名称的              
7、表中间可能有空行  

现在要用vb对数据进行有效性校验,要求              
1、第一个问题可直接重新编序号,可省略              
2、第2、3、4、5出现问题,以提示框告知问题记录行              
3、第5项最好能自动变成年龄要求大于15,小于65              
4、全部通过后,以提示框显示单位列表,提醒是否需要更改部分单位名称              
 
 
 
发表于:2007-11-29 21:45:512楼 得分:0
对此表的有效性校验只是第一步,接下来要录入每个人的资料,进行统计,出具报告。  

因为表是别人报上来的,不能事先设置,而且该表可能连字段名称、字段多少都不一定,所以手工更改是一定要做的,但手工更改后,仍可能存在上面6种情况,另加2个情况:1、可能有空的字段(没报上来),2、有空的行(记录)。  

我要的程序主要功能是“检测-提示存在错误格式”。  

这个问题较难的地方:1、要把“年龄”字段中,可能不规范的日期格式自动更改为数字。2、显示单位列表。3、有重复人员登记  

我认为要以excel做数据源,这个问题应该很有代表性,一定要解决,不是吗?  
发表于:2007-11-30 09:41:123楼 得分:0
先来顶一下。现在没有时间,等会告诉你!
这个问题应该不是很难!但日期格式的问题可能有一定难度,因为得预先设置的错误的格式,不可能预计的全啊!我试试!
发表于:2007-11-30 10:36:384楼 得分:10
dim   xlbook   as   object
dim   xlsheet   as   object
dim   i,m,n,p   as   integer
dim   bh,xm   as   string
set   xlbook   =   nothing
set   xlsheet   =   nothing
set   xlbook   =   getobject(exce文档所在路径及文件名)  ‘这里你可以作一个commondalog
xlsheet=xlbook.worksheets(工作表名)
i=2
do   until   xlsheet.cell(i,1).value=""           '当序号为空时就停下来了。
if   xlsheet.cell(i+1,1).value<>i-1   then
xlsheet.cell(i,1).value=i
endif                                                                       '序号修改完成

if   left(xlsheet.cell(i,2).value)="0"     then       '如果编号单元格内的数据的第一个数字为0 然后……
代码                          其实你的意思我不太明白,编号首字母可能为0被认作了数字
endif

bh=xlsheet.cell(i,2).value
xm=xlsheet.cell(i,3).value
m=2
n=0  
p=0          
do   untill   xlsheet.cell(m,1).value=""
if   bh=xlsheet.cell(m,2).value   then
n=n+1
endif
if   xm=xlsheet.cell(m,3).value   then
p=p+1
endif

if   n=2   or   p=2   then
msgbox   "出现了编号重复或姓名重复,问题出在第" &   m   &   "行"
endif
m=m+1
loop

if   xlsheet.cell(i,4).value=""   then
msgbox   "性别出现空值,问题出现在第" &   i   & "行"  
endif






i=i+1
loop

第56我就不清楚了。第7个同上
另外这里判断的表结束标志是序号行为空时就停止,这个可能也会有问题,你可能根据具体情况具体对待。
我没有试试,你可以参考这个思路!
发表于:2007-11-30 10:45:315楼 得分:0
问题过多   分数太少~!

      所以没人答~!
       

            jiangsheng曾经写过难的   繁琐的问题就要高分

别人解决了要给高分,没解决要给辛苦分
发表于:2007-11-30 11:25:316楼 得分:0
我也想知道excel做数据库的问题,access是什么都不知道,无从下手,也没看过access软件
发表于:2007-11-30 11:34:597楼 得分:0
的确分数太少啊!-     - ¦ ¦ ¦
发表于:2007-11-30 11:49:128楼 得分:0
问题没有难度。但是要敲很多字进来。就算是分多也没有这么多时间回答。
发表于:2007-11-30 12:42:409楼 得分:0
终于注册成功,随便帮你顶一下!
楼主为什么不传一个文件来辅助说明一下更直观?有些问题看得有点让人模糊,比如:“单位有同一个单位两种名称的   ”   是什么让人难解。
发表于:2007-12-01 08:11:5010楼 得分:0
问题太麻烦又没有分,所以特别感谢能给予回答的黑领兄弟!

excel太强大,都被它惯着了,要不是它,我现在应该对数据库非常熟悉了,身边的人们也是这样,所以只好顺势而为,用它来做数据源,但这样出现一个问题--数据定义不准确,所以在统计分析之前,需要对表中所有数据进行有效性检验,我的问题由此而来,这也是该问题具有的普遍意义所在,不是吗?

看来我的描述有一定问题,有人没看懂,我怕说细了,没人能耐住性子看完,我再拣重点说说:

报上来的excel表头为(序号、编号、姓名、性别、年龄、单位),我要以它为基础,录入每个人的其他资料(有30项以上),而且有一部分人在表中没有,另有一部分人在表中有却没有用,表可能存在以下问题:

2、“编号”本应是字符串,在excel表中,以“0”开头的输入成了以“'0”开头(未定义单元格格式,怕被认作了数字)

5、“年龄”有录入出生日期或出生年月的,或excel不认识的日期的(如80.5.6或80、5或80年5月)                              

6、“单位”字段中有同一个单位,出现两种名称的,如有的是“一厂”,有的是“采油一厂”实际是同一个。

我要求:

1、要把“年龄”字段中,可能不规范的日期格式自动更改为数字,错误日期格式更改不完全不要紧,因为一次通不过,就提示手工更改,直到全部通过为止。

2、校验通过后,要求显示一个“单位”列表,就是要把excel表经“自动筛选”后出现的哪个下拉列表提取出来,提示给录入人员,看是否有需要修改的,别的方面我吭哧个十天半个月也许能有笨办法解决,但这个最困扰我。                            

向看完问题并明白了我的意思的人致敬!
发表于:2007-12-02 18:38:4911楼 得分:0
你的问题不用vb解决,excel自代的vba就可以完美解决。还有看你的介绍,excel自身带有的一些功能你也没用到,实际excel你也不是高手!
发表于:2007-12-03 05:29:1712楼 得分:0
我那句话说自己是excel高手了?

统计分析部分用vba做过,我的最终目的是完成一个能自动出具分析报告的独立程序,所以必须用vb完成,楼上的“高手”帮我把“要求2”解决下吧!不管是vb还是vba,你的留言除了废话还是废话。
发表于:2007-12-05 13:37:2513楼 得分:0
兄弟,你先别着急!我再试试看,明天吧!
发表于:2007-12-06 13:06:4514楼 得分:0
年龄字段的判断(接上面的),也是笨办法,参考吧:
dim   nl   as   integer      '声明一个变量用来存放年龄的.
if       len(xlsheet.cell(i,5).value)=2   then
      if   xlsheet.cell(i,5).value <=15   or   xlsheet.cell(i,5).value> =65   then
              msgbox   "年龄应该在15-65之间"     '这里你可以根据自己的情况加一些语句
  endif
else     '如果不是2位,也就是说输入的不是年龄,下在来判断日期格式.因为vb默认是yy-mm-dd那我们就按这个判断.
   
  if   mid(xlsheet.cell(i,5).value,3,1) <> "-"   then     '判断第三个字符是不是"-"这个思路你试试,不行再改改.
              msgbox   "年龄的日期格式不是yy-mm-dd,请修正!"            
  else
            ln   =(date-xlsheet.cell(i,5).value)/365            
            xlsheet.cell(i,5).valuen=nl     '计算年龄
        endif
endif

单位判断,大体思路,你看行不行得通:判断单位的数据是不是只有2位,如果是,再从单位列第一个数据中取前两位对比,如果不相同,向后取,如,对比"一厂",第一个人的单位是"石油一厂",第一次从"石油一厂"中取"石油"是否于"一厂",不是,再取"油一",不是,再向后取"一厂".相等了.这两个数据就被认为是相同的单位!

发表于:2007-12-06 15:15:2715楼 得分:10
瞅空给你写了个示例,大概思路而已,自己根据需要完善吧:

vbscript code
dim oexcel as object dim obook as object dim osheet as object dim orange as object dim arrdata as variant dim r as integer, c as integer dim row as integer dim i as integer dim tmp as string, tmpdata as string on error goto app_err: set oexcel = createobject"excel.application") set obook = oexcel.workbooks.open("c:\t.xls") set osheet = obook.worksheets(1) osheet.activate '获得已使用的行列 r = osheet.usedrange.cells.rows.count c = osheet.usedrange.cells.columns.count '将内容读入数组 redim arrdata(1 to r, 1 to c) '序号、编号、姓名、性别、年龄、单位 arrdata = osheet.range("a1").resize(r, c) '处理数据: for row = 2 to r '序号 arrdata(row, 1) = row - 1 '编号 arrdata(row, 2) = format(arrdata(row, 2), "0000") '性别 arrdata(row, 4) = iif(trim(format(arrdata(row, 4))) <> "", _ arrdata(row, 4), "") '性别为空的都设置为“女” '年龄 arrdata(row, 5) = replace(arrdata(row, 5), ".", "/") arrdata(row, 5) = replace(arrdata(row, 5), "", "/") arrdata(row, 5) = replace(arrdata(row, 5), "-", "/") arrdata(row, 5) = format(arrdata(row, 5), "yy年mm月dd日") arrdata(row, 5) = datediff"yyyy", arrdata(row, 5), date) '得到年龄 '单位 arrdata(row, 6) = replace(arrdata(row, 6), "一厂", "采油一厂") '自己根据需要添加 next '相同记录保存在文本文件中 tmpdata = "序号" & vbtab & "编号" & vbtab & "姓名" & vbcrlf for i = 2 to ubound(arrdata) - 1 tmp = arrdata(i, 2) & vbtab & arrdata(i, 3) for row = i + 1 to ubound(arrdata) if arrdata(row, 2) & vbtab & arrdata(row, 3) = tmp then tmpdata = tmpdata & arrdata(row, 1) & vbtab & tmp & vbcrlf end if next row next i open "c:\tmp.txt" for output as #1 print #1, tmpdata close #1 '定义单元格格式 oexcel.columns("b:d").select oexcel.selection.numberformatlocal = "@" '写回excel表格 osheet.range("a1").resize(r, c).value = arrdata obook.save msgbox "ok" obook.close app_exit: set osheet = nothing set obook = nothing oexcel.quit set oexcel = nothing exit sub app_err: msgbox err.description resume app_exit
发表于:2007-12-13 23:33:0616楼 得分:0
一个excel表,第一行是字段名,选“数据”→“筛选”→“自动筛选”,会在每个字段名旁边出现下拉列表,列出该列中所有不同内容,如何提取到一个数组中?
发表于:2007-12-20 04:35:3417楼 得分:0
“自动筛选”内容的提取

sub   norepeatlist()
dim   uniquevalue   as   new   collection
dim   u   as   variant
on   error   resume   next
irow   =   sheet1.[a65536].end(xlup).row
set   rng   =   sheet1.range("a1:a"   &   irow)
       
for   each   cel   in   rng
uniquevalue.add   cel.value,   cstr(cel.value)
next   cel

for   each   u   in   uniquevalue
if   sheet1.cells(1,   6)   =   ""   then
    sheet1.cells(1,   6)   =   u
    else:   sheet1.cells(1,   6)   =   sheet1.cells(1,   6)   &   "、"   &   u
end   if
next   u
end   sub


快速检索

最新资讯
热门点击