ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: yagi2008

[分享] VBA入门指南——献给在这里得到帮助但看不懂代码的朋友(已建电梯)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2009-2-9 14:54 | 显示全部楼层
本帖已被收录到知识树中,索引项:开发帮助和教程
LZ你真幽默,"已建电梯"

TA的精华主题

TA的得分主题

发表于 2009-2-9 15:01 | 显示全部楼层
做个记号先!!!!!!

TA的精华主题

TA的得分主题

发表于 2009-2-9 20:47 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-9 22:15 | 显示全部楼层
原帖由 kw116 于 2009-2-9 14:38 发表


问下是必须用range(某列).end(xldown).value 来取值么?
个人感觉不是必须用end(xldown)的话是不是可以用
range(某列最下一行).end(xlup).value来取值?
比如说:Range("A65536").end(xlup).Value
这样可以 ...


完全可以!!好习惯!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-9 22:17 | 显示全部楼层

【2009.2.9】代码起步——我的程序(续)

  大家好,今天是元宵节,过完今天,这个年也就结束了,大伙也该安心上班了~然而今天也是我们这个教程的最后一讲,在讲完这个案例之后,相信大家已经从一个对VBA来说完全找不着北的门外汉,慢慢摸到了门边上了,虽然还是在门外,但相信只要继续努力,已经可以独立摸着门进去了!
  还记得代码吗?我再次贴出来:
Private Sub CommandButton1_Click()
Dim i, j, p, q, x, y, u As Integer
Dim tmpaddr As String
p = 34
q = 34
x = 34
y = 34
w = 0
Range("A34", "D1000").Clear
For i = 1 To Sheet2.Range("a1", "af30").Cells.Count
    tmpaddr = Sheet2.Range("a1", "af30").Cells(i).Address
    j = CountIf(Sheet2.Range("a1", "af30"), Sheet2.Range(tmpaddr).Value)
    Select Case j
    Case 1:
        Sheet2.Range("A" & CStr(p)).Value = Sheet2.Range(tmpaddr).Value
        p = p + 1
        Range("g34").Value = CStr(p - 34)
    Case 2:
        For u = 34 To q - 1
            If Sheet2.Range("B" & CStr(u)).Value = Sheet2.Range(tmpaddr).Value Then
                GoTo exit_q
            End If
        Next
        Sheet2.Range("B" & CStr(q)).Value = Sheet2.Range(tmpaddr).Value
        q = q + 1
        Range("h34").Value = CStr(q - 34)
exit_q:
    Case 3:
        For u = 34 To x - 1
            If Sheet2.Range("C" & CStr(u)).Value = Sheet2.Range(tmpaddr).Value Then
                GoTo exit_x
            End If
        Next
        Sheet2.Range("C" & CStr(x)).Value = Sheet2.Range(tmpaddr).Value
        x = x + 1
        Range("i34").Value = CStr(x - 34)
exit_x:
    Case Is > 3:
        For u = 34 To y - 1
            If Sheet2.Range("D" & CStr(u)).Value = Sheet2.Range(tmpaddr).Value Then
                GoTo exit_y
            End If
        Next
        Sheet2.Range("D" & CStr(y)).Value = Sheet2.Range(tmpaddr).Value
        y = y + 1
        Range("j34").Value = CStr(y - 34)
exit_y:
'    Case Else
'        w = w + 1
'        Range("k34").Value = CStr(w)
    End Select
Next
End Sub
Private Function CountIf(ByVal tmpR As Range, ByVal tmpN As String) As Integer
Dim a, b, c As Integer
b = 0
For a = 1 To tmpR.Cells.Count
    If tmpR.Cells(a).Value = tmpN Then
        b = b + 1
    End If
Next
CountIf = b
End Function
  上次讲到了每个分支结构的内部都是来处理对应个数数字的,比如第一个分支就是处理变量J等于1的情况的,这个从CASE后面跟的条件可以看出来,其他还有J等于2、J等于3以及J大于3这样三种情况。在每个分支内部的代码,大家仔细观察可以发现基本大同小异,因为毕竟都是做统计个数这个事情,唯一的不同是计数存放的地方不同而已。以J等于2为例,首先是一个FOR循环,这个循环的作用是将当前单元格的值与存放在A1到AF30区域出现2次的数字的队列中的数进行比较,如果发现当前单元格的值已经被登记在这个队列里了,那么立即结束这个分支结构,GOTO exit_q是一个无条件转移语句,目的是将程序下一步执行的目的跳转到exit_q这个标号表示的地方。如果通过FOR循环发现当前单元格的值没有被登记在该队列里,那么就将该单元格的值登记到该队列里,并将计数器Q加1,同时改变记录出现2次的单元格的统计数字。
  还有一个FUNCTION,名字叫做CountIf,有2个参数,前一个是表示一个区域,后一个是表示一个字符串,结果返回一个整形数值。该函数的作用是按照第一个参数指定的区域范围,统计某一个字符串出现的次数,并将该次数的数值作为函数结果返回给调用者。
  好了,这个程序就讲解到这里。可能有的朋友会说,我还没懂呢,呵呵,没关系,从下一次课开始,我们将开始一个全新的学习旅程,我把它称为“从实例学VBA编程”,通过一个帖子一个实例的方式,带领大家逐步迈进VBA的大门,一步一个脚印,脚踏实地地打下扎实的基础!让我们为最终掌握VBA这门技术并为我所用而不懈努力吧!
  朋友们,再见!顺祝大家元宵节快乐!

TA的精华主题

TA的得分主题

发表于 2009-2-9 23:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
支持这种形式的课堂,谢谢LZ

TA的精华主题

TA的得分主题

发表于 2009-2-10 08:49 | 显示全部楼层
楼主有时间能给161楼的代码分别注释一下,那是再清楚不过。盼望会有这样的贴子

TA的精华主题

TA的得分主题

发表于 2009-2-10 13:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
虽课程已完,但也顶上,望待续!!!!

TA的精华主题

TA的得分主题

发表于 2009-2-10 13:51 | 显示全部楼层
哈!忘了跟你说了我是  正在输入....

TA的精华主题

TA的得分主题

发表于 2009-2-10 15:20 | 显示全部楼层
佩服,真是高手呀,看齐,受益匪浅
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 00:26 , Processed in 0.032824 second(s), 5 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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