[算表] VBA合并与转换多栏(已解决)

楼主: jerry7504 (Amo)   2019-10-26 04:16:08
软件:excel
版本:2013
大家好如上述小弟目前资料型态如下:
学号 测验次数 国 英 数 国2 英2 数2 延续下去
因为上一个人汇入资料没有做条件汇入数据库
现在资料为:
学号 测验次数 国 英 数 国2 英2 数2 国3 英3 数3
123 2 80 70 70 70 80 90
123 1 70 60 80
照常理来说这个资料应该合并然后加到第三次而并非独立出来这个资料最多只做4次测验
需每次做分析不能合并算平均或总成绩
小弟的问题是
1.如何将学号合并为多栏并且将下面第一次的资料贴到第三次且次数加至正确数量如下:
学号 测验次数 国 英 数 国2 英2 数2 国3 英3 数3
123 3 80 70 70 70 80 90 70 60 80
2.假如有各种测验次数的学生如只做1次的一样有两笔如何判断让它加到第二次如下:
学号 测验次数 国 英 数 国2 英2 数2 国3 英3 数3
123 2 80 70 70 70 80 90
123 1 70 60 80
456 1 70 60 80
456 1 60 70 85
结果:
学号 测验次数 国 英 数 国2 英2 数2 国3 英3 数3
123 3 80 70 70 70 80 90 70 60 80
456 2 70 60 80 60 70 85
3.还有一种情况插入是三次
123 1 70 60 88
123 1 70 60 80
123 1 70 60 83
要考虑以下状况该怎么写呢拜托了
作者: soyoso (我是耀宗)   2019-10-26 10:05:00
1.要有学号唯一值,如果有就不用以下方式方式有a)资料工具的移除重复range.removeduplicatesb)进阶筛选,range.advancedfilterc)dictionaryd)循环,判断,工作表函数countif(是否为0),match(是否为错误值)2.有唯一值后填入第一笔资料和找是否有重复,循环于范围内,或循环于range.find,找到以range.copy或range= range.value复制贴上或填入;要确认每笔学号最右侧有值储存格栏号的话,range.end、range.find或工作表函数counta(有连续资料时),栏号的话range.column
楼主: jerry7504 (Amo)   2019-10-26 16:15:00
目前唯一值有了可是不知道怎么去比对2者相同学号后面的所有值 贴上部分如何依序贴呢?
作者: soyoso (我是耀宗)   2019-10-26 16:36:00
巢状循环判断或是循环range.find,就看是否有排序,有的话range.find或是工作表函数match取第一笔出现的列号,循环工作表函数countif取得的笔数,位序贴上就要看每笔学号最右侧有资料的储存格或栏号,方式上述回文range.end之后都是再说明这方面,有这个资料range.offset或是栏号+1
楼主: jerry7504 (Amo)   2019-10-26 18:09:00
疴小弟不才搞了5小时连后面范围都选不出来...S大能提供函数或VBA程式吗xD
作者: soyoso (我是耀宗)   2019-10-26 19:55:00
提供回文所述选不出来的档案或写法,再来看看问题是什么?
楼主: jerry7504 (Amo)   2019-10-26 20:56:00
我先重新来不然都乱了s大帮我大概分析一下概念有没有错1.筛选唯一学号2.将表二唯一学号跟表ㄧ原始资料比对如果相等将表ㄧ对应学号右边值抓出2、依照学号依序贴上后面数值
作者: soyoso (我是耀宗)   2019-10-26 21:16:00
如原po回文所述
楼主: jerry7504 (Amo)   2019-10-26 21:46:00
目前程式阶段跟错误https://i.imgur.com/Bb0jf2V.jpg
作者: soyoso (我是耀宗)   2019-10-26 21:53:00
以宏来看有可能出现这个错误的原因是sheet2要改为类似上方工作表1的写法,如工作表2.range("a:a")之类的如要match寻找完全符合的话,第三个引数不是1,而是0另外也不太了解变量E是什么?1.不确定这个变量的型态是什么?range吗?2.如果是的话,要set该变量
楼主: jerry7504 (Amo)   2019-10-26 22:00:00
有改了好像还是一样还是要加宣告那这个概念写成这样有错吗?https://i.imgur.com/Qh097Oa.jpg目前改完可以执行但是没有值https://i.imgur.com/g5bwGMu.jpg
作者: soyoso (我是耀宗)   2019-10-26 22:12:00
可以执行,没错误产生,但没有值带入方面还是要从档案来看因为测试连结的宏,工作表1有连续资料(二栏以上)是可以将工件表2的b栏资料带入的如 https://i.imgur.com/KNgCnQm.jpg 储存格d1有带入资料
楼主: jerry7504 (Amo)   2019-10-26 22:21:00
作者: soyoso (我是耀宗)   2019-10-26 22:29:00
连结不知道哪个是工作表1、工作表2
楼主: jerry7504 (Amo)   2019-10-26 22:35:00
疑那要如何修改S大那个怎么用出来的
作者: soyoso (我是耀宗)   2019-10-26 22:37:00
修改什么?因为不确定22:25和22:26所上传的图档是工作表1或2,没看到下方工作表名称那个怎么用出来的?不了解,哪个?我的连结图档?如果是的话,是以萤幕截图从原po回文的图档来看应是无机密性吧,若没有的话看要不要就上传云端空间,提供连结(缩网页),这样不限我版上先进要协助原po也会较方便
楼主: jerry7504 (Amo)   2019-10-26 22:59:00
https://drive.google.com/file/d/1iTJpEaNCfVhZC27O2q1AdtQn-pp_w_Qn/view感谢大大https://reurl.cc/e5LVOL忘记缩网再麻烦了这个是结果档我vba还没写https://reurl.cc/5g4bDy这个是我写到刚刚那个问题的
作者: soyoso (我是耀宗)   2019-10-27 06:53:00
是工作表1的资料填到工作表2的话,判断后面的写法就相反了应是工作表2.range=工作表1.range,取得最右侧有值的储存格也会是写于工作表2.range的部分如只有a栏一栏,不以xltoright,而是xltoleft的方式
楼主: jerry7504 (Amo)   2019-10-27 15:12:00
我改成left可是它没办法全部依照学号往下 是读到学号的最后第一个值耶https://i.imgur.com/UzWUJp8.jpghttps://i.imgur.com/yCbJVs7.jpg
作者: soyoso (我是耀宗)   2019-10-27 15:46:00
这方面还是要看宏如何写才比较清楚
楼主: jerry7504 (Amo)   2019-10-27 15:50:00
https://i.imgur.com/Jh9L4zo.jpg有抓到第一个值但是它只显示最后一个出来目前程式一直跑的确会依序抓到最后但是列不出来
作者: soyoso (我是耀宗)   2019-10-28 10:48:00
这样的截图,没看到工作表1或2是那个资料,要的话请附上工作表1、工作表2名称和宏的截图,不然就以档案来看才比较清楚就像我10/27 06:54所回文取得最右侧有值的储存格也会是写在工作表2.range的部分,但宏上还是写在工作表1(变量r)的部分就类似这样 https://i.imgur.com/SXDdTer.jpg我就不分工作表了,要有k栏(唯一值)的资料,提供的是range.copy方式,如不用带格式的话,以回文range=range.value方式。连结内L栏后就是从c栏起的资料了
楼主: jerry7504 (Amo)   2019-10-28 19:12:00
感谢s大 我27号已经有试出来了 不过我是用do untilloop不知道哪个效率比较高呢?我之后会再试试看真的很感谢s大~https://i.imgur.com/r4xhxBW.jpg这是我27号写出来的结果是在工作表2里 跟s大的结果一样不过在我原始data 处理的速度会有点慢 原始有1万多笔会有一小段无法回应的时间

Links booklink

Contact Us: admin [ a t ] ucptt.com