Excel精英培训网

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

已解决

[复制链接]
发表于 2012-5-30 06:54 | 显示全部楼层 |阅读模式
本帖最后由 neverno 于 2012-5-30 11:35 编辑

2.jpg    (图2)          1.jpg   (图1)
Sub test()
    Dim zone As Range
    Dim nbLignes As Integer
    Dim i As Integer
    Dim doublons As Boolean
    Dim taille As Integer
    Dim leFormat As String
   
    Set zone = Range("A2").CurrentRegion
    nbLignes = zone.Rows.Count
   
    taille = 4
    leFormat = "0000"
    Range("A2") = "Code"
   
    Do
   
        For i = 2 To nbLignes
         zone.Cells(i, 1) = leCode(zone.Cells(i, 2), taille)
         zone.Cells(i, 1).NumberFormat = leFormat
       Next
   
        zone.Sort key1:=Range("A2"), Header:=xlYes
      
        doublons = False
        For i = 2 To nbLignes - 1
            If zone.Cells(i, 1) = zone.Cells(i + 1, 1) Then
                doublons = True
            End If
        Next
        
        If taille < 8 Then leFormat = leFormat & "0"
        
        taille = taille + 1
        
    Loop While doublons
End Sub
Function leCode(ByVal codePerm As String, ByVal n As Integer)
    Dim c As String
   
    c = Mid(codePerm, 5, 4)
   
    If n > 4 Then
        If n <= 8 Then
            c = c & Right(codePerm, n - 4)
        ElseIf n <= 12 Then
            c = Right(codePerm, n)
        Else
            c = codePerm
        End If
    End If
    leCode = c
End Function
如题,明天考试,这是上课时老师写的代码,图1为运行前,图2 为运行后,目的是将A列中的姓名变为B列的学生证号(由4个字母8个数字组成)  并且删去前两个字母之后,再按A列进行排序

问题:
1 中间定义了doublons查找是否重复,有什么用
2 对于boolean型变量,一开始是不是默认值为FALSE
3 另外定义的函数是为了实现保留学生证号的8个数字?那删去前两个字母在哪体现的?

对于窗体控件部分的,文本框的change 和afterupdate事件有什么区别?
万分感谢 !

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2012-5-30 07:18 | 显示全部楼层

1 中间定义了doublons查找是否重复,有什么用Loop While doublons
doublons =true 时,继续do循环

2 对于boolean型变量,一开始是不是默认值为FALSE
boolean类型变量,初始值为 false

3 另外定义的函数是为了实现保留学生证号的8个数字?那删去前两个字母在哪体现的?
Function leCode
由这个自定义函数实现的


对于窗体控件部分的,文本框的change 和afterupdate事件有什么区别
change=改变,意思为文本框中每输入或者删除一个值,都会触发该事件
afterupdate=在通过用户界面更改了控件中的数据后,此事件发生。
意思为,输入完数据后,离开文本框才会触发该来件

你放代码进去测试一下就知道区别了!

  1. Private Sub TextBox1_AfterUpdate()
  2. MsgBox "TextBox1_AfterUpdate 事件"
  3. End Sub

  4. Private Sub TextBox1_Change()
  5.   MsgBox "TextBox1_Change 事件"
  6. End Sub

复制代码

回复

使用道具 举报

 楼主| 发表于 2012-5-30 07:44 | 显示全部楼层
感谢 无聊的疯子

对于函数lecode,假如学号为 ABCD12345678 (目标变为CD12345678)
若n=6 根据函数定义
c = 1234
c= 1234 & 78
最终 lecode = 123478  
这个并不是所希望的形式啊,不知问题出在哪?
回复

使用道具 举报

发表于 2012-5-30 08:03 | 显示全部楼层
neverno 发表于 2012-5-30 07:44
感谢 无聊的疯子

对于函数lecode,假如学号为 ABCD12345678 (目标变为CD12345678)

请提供附件,不然没办法测试你所说的问题
回复

使用道具 举报

 楼主| 发表于 2012-5-30 08:18 | 显示全部楼层
无聊的疯子 发表于 2012-5-30 08:03
请提供附件,不然没办法测试你所说的问题

exNotes.xls (49.5 KB, 下载次数: 2)
回复

使用道具 举报

 楼主| 发表于 2012-5-30 08:20 | 显示全部楼层
主要是sub affichageweb () 和 function lecode 部分, 谢谢
回复

使用道具 举报

发表于 2012-5-30 08:36 | 显示全部楼层
neverno 发表于 2012-5-30 07:44
感谢 无聊的疯子

对于函数lecode,假如学号为 ABCD12345678 (目标变为CD12345678)

若n=6 根据函数定义

n为什么会=6呢??


在传递参数前,taille = 4  这里已经初始化 n 的值了,所以不知道你说的 n=6 是在什么情况下?
回复

使用道具 举报

 楼主| 发表于 2012-5-30 08:51 | 显示全部楼层
我是觉得taille=4为初始值,然后根据 taille = taille + 1 循环, 下一个taille=5,之后6,7,8 ...
还有当doublons 为真时开始循环,也就是说如果出现上下两个相邻单元格值相同时开始循环,那如果doublons 值永远为false,循环不发生,这样的话函数lecode不是没用了吗? 关键是我发现学号那列还真没有相同的
回复

使用道具 举报

发表于 2012-5-30 08:59 | 显示全部楼层
neverno 发表于 2012-5-30 08:51
我是觉得taille=4为初始值,然后根据 taille = taille + 1 循环, 下一个taille=5,之后6,7,8 ...
还有当 ...

taille = taille + 1


这个只有在有相同数据的时候才会起到作用!!你拿个数据改成一样的试试吧,


该代码考虑很周到,但是解法不好!
回复

使用道具 举报

 楼主| 发表于 2012-5-30 09:21 | 显示全部楼层
本帖最后由 neverno 于 2012-5-30 11:37 编辑

嗯,我再试试,再次感谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-4 20:42 , Processed in 0.347027 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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