Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: qee用

[VBA接力赛第1期]真分数[已总结]

[复制链接]
 楼主| 发表于 2007-3-18 22:41 | 显示全部楼层

<p><strong>截止3月18日22:30收到6份有效答案:</strong></p><p><strong>bifengxia</strong> 3-13 21:55</p><p><strong>lpz001</strong> 3-16 19:58</p><p><strong>LJW17</strong> 3-17 23:03</p><p><strong>uranus1997</strong> 3-17 23:21</p><p><strong>戏子</strong> 3-18 8:44</p><p><strong>danielcm</strong> 3-18 22:27</p>
回复

使用道具 举报

发表于 2007-3-18 22:49 | 显示全部楼层

<p><br/>这是演示</p><p><font color="#2222aa">奖励2个金币</font></p>
[此贴子已经被admin于2007-3-19 10:02:26编辑过]
回复

使用道具 举报

 楼主| 发表于 2007-3-19 00:23 | 显示全部楼层

<p><strong>第1期VBA接力赛情况总述(一)</strong></p><p>这是前段时间在“编程爱好者”论坛看到的一道C语言题,本来是想考核大家排序算法的,发题时有些匆忙,既忽略了EXCEL自身的排序功能,更忘了EXCEL中的“分数”格式,真是惭愧。也好,EXCEL有EXCEL的精彩,感谢所有参与的朋友提供的精彩答案。因为排序已不是本题的重点,影响速度的主要因素就变成了两个方面:<br/><strong>1.数组的使用<br/></strong>VBA在对大数据的处理中,为了提高代码速度,数组是经常使用的方法。很多朋友对数组的方法可能还不熟悉,来看下面的例子:<br/>dim i&amp;<br/>for i=1 to 10000<br/>&nbsp; cells(i,2)=cells(i,1)*i<br/>next i<br/>上面这段代码是将[A1]至[A10000]依次写入[A1]至[A10000]乘它们所在的行号,如果使用数组的方法,就是这样的:<br/>dim i&amp;,arr1(),arr2(1 to 10000,1 to 1)<br/>arr1=range("A1:A10000") '将数据读入数组,当将超过1个单元格区域的数据读入Variant型变量时,便会产生一个下标从1开始的二维数组,两维分别对应行和列<br/>for i=1 to 10000 <br/>&nbsp; arr2(i,1)=i*arr1(i,1) '从数组中读数计算比从工作表中读数快得多<br/>next i<br/>range("B1:B10000")=arr2 '处理完成后,一次性写回工作表比逐个写快N倍<br/>你只要记住上面注释的三行并学会应用,差不多就掌握了80%以上的数组知识。<br/><strong>2.最大公约数</strong><br/>Function Gys(ByVal a%, ByVal b%)<br/>&nbsp; If a Mod b = 0 Then Gys = b: Exit Function<br/>&nbsp; Gys = Gys(b, a Mod b)<br/>End Function<br/>我不解释了,uranus1997在后面给了详尽的注释。<br/>这道题所涉及的知识当然不限于上面两个方面,抛开因我的失误而埋没的排序算法,要验证最快速度,高级筛选、集合、SQL...差不多都有用武之地,有兴趣的朋友可以去尝试一下。</p>
回复

使用道具 举报

 楼主| 发表于 2007-3-19 00:26 | 显示全部楼层

<p><strong>VBA第1期接力赛情况总述(二)</strong></p><p>本次竞赛共收到bifengXia,plz001,LJW17,uranus1997,戏子,danielcm六位会员有效答案6份,正确性验证取N=2,6,100,200,300,速度评价取N=300。测试环境为Duron700/256M,WinXP+Excel2003。以下是参评代码(根据需要部分代码做了非实质性修改)及测试评价:<br/><strong>'--*-- bifengXia --*--</strong><br/>Sub BiFengXia()<br/>&nbsp;&nbsp;&nbsp; Dim i As Integer, j As Integer, k As Integer, t As Single, iNowRow As Integer<br/>&nbsp;&nbsp;&nbsp; t = Timer<br/>&nbsp;&nbsp;&nbsp; Range("A:A").Clear<br/>&nbsp;&nbsp;&nbsp; k = Int(Range("B1").Value)<br/>&nbsp;&nbsp;&nbsp; If k &lt; 2 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox "在B1单元格输入一个大于等于 2 的整数!", , "BiFengXia"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Range("B1").Select<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Sub<br/>&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Application.ScreenUpdating = False<br/>&nbsp;&nbsp;&nbsp; On Error GoTo 100<br/>&nbsp;&nbsp;&nbsp; iNowRow = 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '当前行<br/>&nbsp;&nbsp;&nbsp; For i = 1 To k&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'i为分母<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For j = 1 To i - 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'j为分子,它的值在1到i-1之间,用自定义函数判断j与i是否能够组成真分数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If ProperFraction(j, i) Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cells(iNowRow, 1).Value = "'" &amp; j &amp; "/" &amp; i '如果是真分数,将分数写入A列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cells(iNowRow, 2).Value = j / i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '如果是真分数,将小数写入B列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iNowRow = iNowRow + 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '下移一行<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next j<br/>&nbsp;&nbsp;&nbsp; Next i<br/>&nbsp;&nbsp;&nbsp; '根据B列的临时值(小数)扩展排序,按升充排列<br/>&nbsp;&nbsp;&nbsp; Range("A1:B" &amp; iNowRow).Sort Key1:=Range("B1"), Order1:=xlAscending, Header:= _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortMethod:=xlPinYin, DataOption1:=xlSortNormal<br/>&nbsp;&nbsp;&nbsp; Range("B:B").Clear&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '清楚B列的临时值<br/>&nbsp;&nbsp;&nbsp; Range("B1").Select<br/>&nbsp;&nbsp;&nbsp; Range("B1").Value = k<br/>&nbsp;&nbsp;&nbsp; Application.ScreenUpdating = True<br/>&nbsp;&nbsp;&nbsp; MsgBox "共用时:" &amp; (Timer - t) * 1000 &amp; "毫秒!", , "BiFengXia"<br/>&nbsp;&nbsp;&nbsp; Exit Sub<br/>100:<br/>&nbsp;&nbsp;&nbsp; MsgBox "结果超出运算的最大行,产生了溢出!请最好将B1单元格的数值减小到320以内。", , "BiFengXia"<br/>&nbsp;&nbsp;&nbsp; Range("A:B").Clear<br/>&nbsp;&nbsp;&nbsp; Range("B1").Value = k<br/>&nbsp;&nbsp;&nbsp; Range("B1").Select<br/>End Sub</p><p>'自定义函数,测试是否为真分数(分子为number1,分母为number2)<br/>rivate Function ProperFraction(number1 As Integer, number2 As Integer) As Boolean<br/>&nbsp;&nbsp;&nbsp; ProperFraction = True<br/>&nbsp;&nbsp;&nbsp; If number2 Mod number1 = 0 And number1 &gt; 1 Then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '如果分子能够被分母整除,则不是真分数,返回结果<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProperFraction = False<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Function<br/>&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Dim k As Integer<br/>&nbsp;&nbsp;&nbsp; 'For k = 2 To (number1 + 2) / 2<br/>&nbsp;&nbsp;&nbsp; For k = 2 To number1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If number1 Mod k = 0 And number2 Mod k = 0 Then&nbsp;&nbsp;&nbsp;&nbsp; '如果分子与分母有公约数,则不是真分数,返回结果<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProperFraction = False<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Function<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Next k<br/>End Function<br/>------<br/><u>结果:正确 用时:26.29秒<br/>代码结构清晰,书写规范。输出结果为文本格式,如修改为按分数形式输出,速度应当更快。</u></p><p><strong>'--*-- plz001 --*--</strong><br/>rivate Sub CommandButton1_Click()<br/>&nbsp;&nbsp;&nbsp; Application.ScreenUpdating = False<br/>&nbsp;&nbsp;&nbsp; M = Timer<br/>&nbsp;&nbsp;&nbsp; Columns("A:A").ClearContents<br/>&nbsp;&nbsp;&nbsp; Columns("A:A").NumberFormatLocal = "# ???/???"<br/>&nbsp;&nbsp;&nbsp; v = Cells(1, 2)<br/>&nbsp;&nbsp;&nbsp; If v = 2 Then [a1] = 0.5: Exit Sub<br/>&nbsp;&nbsp;&nbsp; r = 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '在数组中生成分数列,速度快<br/>&nbsp;&nbsp;&nbsp; ReDim arrl(1 To (v * (v - 1) / 2), 0)<br/>&nbsp;&nbsp;&nbsp; For i = 2 To v<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For t = 1 To i - 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r = r + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arrl(r, 0) = t / i<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next t<br/>&nbsp;&nbsp;&nbsp; Next i<br/>&nbsp;&nbsp;&nbsp; Range("A1:A" &amp; r) = arrl<br/>&nbsp;&nbsp;&nbsp; Set arr = Range("a1:a" &amp; r)&nbsp;&nbsp; '对对象变量的操作比直接访问对象速度快<br/>&nbsp;&nbsp;&nbsp; arr.Sort Key1:=arr(1, 1), Order1:=xlAscending, Header:=xlNo<br/>&nbsp;&nbsp;&nbsp; rng1 = arr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '?????<br/>&nbsp;&nbsp;&nbsp; ReDim ary(1 To r, 0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '排序后再筛选,这样的算法快<br/>&nbsp;&nbsp;&nbsp; ary(1, 0) = rng1(1, 1)<br/>&nbsp;&nbsp;&nbsp; For i = 2 To r<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If rng1(i, 1) &lt;&gt; rng1(i - 1, 1) Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ary(k + 2, 0) = rng1(i, 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = k + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Next i<br/>&nbsp;&nbsp;&nbsp; Range("A1:A" &amp; r) = ary<br/>&nbsp;&nbsp;&nbsp; Application.ScreenUpdating = True<br/>&nbsp;&nbsp;&nbsp; MsgBox Timer - M<br/>End Sub<br/>------<br/><u>结果:正确 用时:1.48秒<br/>精益求精,每一次都给我惊喜,能够在这么短时间内掌握数组的使用,除了天资聪颖,更可赞学习探索之精神可嘉。<br/>“对对象变量的操作比直接访问对象速度快”我测试的结果没有得到证实。建议以后在书写代码时使用变量声明(Option Explicit),细节上如边缘数据,运行环境预清理等等要注意考虑,良好的代码习惯的会使进步更快。</u></p><p><strong>'--*-- LJW17 --*--</strong><br/>Sub zhengFS()<br/>&nbsp;&nbsp;&nbsp; ' 从B1单元格读取一个任意整数,按从小到大顺序求出分子、分母均不大于该整数的真分数。<br/>&nbsp;&nbsp;&nbsp; Dim n As Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '读取整数存放的变量<br/>&nbsp;&nbsp;&nbsp; Dim feimu() As Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '求出结果分母存放的数组<br/>&nbsp;&nbsp;&nbsp; Dim feizi() As Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '求出结果分子存放的数组<br/>&nbsp;&nbsp;&nbsp; Dim lp1, lp2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '循环变量<br/>&nbsp;&nbsp;&nbsp; Dim gesu As Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '求出结果的个数<br/>&nbsp;&nbsp;&nbsp; gesu = 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '个数赋0<br/>&nbsp;&nbsp;&nbsp; n = Cells(1, 2).Value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '读出整数<br/>&nbsp;&nbsp;&nbsp; ReDim feimu(CLng(n) * CLng(n - 1) / 2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '根据n重新定义分母、分子数组的大小<br/>&nbsp;&nbsp;&nbsp; ReDim feizi(CLng(n) * CLng(n - 1) / 2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '因计算结果可能为Long型,为防止溢出错误,需要使用CLng转换函数<br/>&nbsp;&nbsp;&nbsp; For lp1 = 2 To n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '分母循环<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For lp2 = 1 To lp1 - 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '分子循环<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If lp2 = 1 Then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '判断分子是否为1,是则肯定是真分数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gesu = gesu + 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '个数加1,并保存好分子、分母<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feimu(gesu) = lp1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feizi(gesu) = lp2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If zhengfeisu(lp2, lp1) Then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '判断是否为真分数,是则保存,否则不保存<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gesu = gesu + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feimu(gesu) = lp1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feizi(gesu) = lp2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next lp2<br/>&nbsp;&nbsp;&nbsp; Next lp1<br/>&nbsp;&nbsp;&nbsp; For lp1 = 1 To gesu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '通过冒泡排序,将求出的真分数存放的数组按小到大排序<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feimu(0) = feimu(lp1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feizi(0) = feizi(lp1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For lp2 = lp1 + 1 To gesu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '求出一组数中的最小值,并将最小值移到前面<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If feizi(0) / feimu(0) &gt; feizi(lp2) / feimu(lp2) Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feizi(lp1) = feizi(lp2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feimu(lp1) = feimu(lp2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feizi(lp2) = feizi(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feimu(lp2) = feimu(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feizi(0) = feizi(lp1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feimu(0) = feimu(lp1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next lp2<br/>&nbsp;&nbsp;&nbsp; Next lp1<br/>&nbsp;&nbsp;&nbsp; Range("a:a").Clear&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '清空A列<br/>&nbsp;&nbsp;&nbsp; For lp1 = 1 To gesu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '将求出并排好序的真分数写入A列中<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cells(lp1, 1).Value = "'" + CStr(feizi(lp1)) + "/" + CStr(feimu(lp1))<br/>&nbsp;&nbsp;&nbsp; Next lp1<br/>End Sub</p><p>Function zhengfeisu(i, j) As Boolean<br/>''******************************************************************************<br/>''**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 判断分子为i,分母为j的分数是否真分数,是则还加True,否则还False&nbsp;&nbsp;&nbsp;&nbsp; **<br/>''******************************************************************************<br/>&nbsp;&nbsp;&nbsp; Dim lp3<br/>&nbsp;&nbsp;&nbsp; zhengfeisu = True&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '假设该数是真分数<br/>&nbsp;&nbsp;&nbsp; If j / i &lt;&gt; j \ i Then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '判断分母、分子是否能够整除<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For lp3 = 2 To i \ 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '不能整除则循环求出分子、分母是否存在公约数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If i Mod lp3 = 0 And j Mod lp3 = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhengfeisu = False&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '存在公约数则不是真分数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit For<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next lp3<br/>&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhengfeisu = False&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '如果分母、分子能够整除则不是真分数<br/>&nbsp;&nbsp;&nbsp; End If<br/>End Function<br/>------<br/><u>结果:正确 用时:596秒<br/>结构清晰规范,详尽的注释很难得,冒泡排序对大数据的处理效率很低。</u></p><p></p>
回复

使用道具 举报

 楼主| 发表于 2007-3-19 00:27 | 显示全部楼层

<p><strong>'--*-- uranus1997 --*--</strong></p><p>rivate Sub CommandButton1_Click()<br/>Dim x As Integer<br/>Dim y As Integer<br/>Dim t As Single</p><p>t = Timer<br/>Application.ScreenUpdating = False<br/>Sheets(1).[A:A].ClearContents<br/>ThisWorkbook.Save</p><p>If Sheets(1).[B1].Value = 1 Then<br/>&nbsp;&nbsp;&nbsp; MsgBox "没有符合的分数"<br/>&nbsp;&nbsp;&nbsp; Exit Sub<br/>End If</p><p>Dim yMax As Integer<br/>yMax = Sheets(1).[B1].Value<br/>Dim NowPos As Integer<br/>NowPos = 1<br/>For y = 2 To yMax<br/>Cells(NowPos, 1) = 1 / y<br/>NowPos = NowPos + 1<br/>&nbsp;&nbsp;&nbsp; If y &lt;&gt; 2 Then<br/>&nbsp;&nbsp;&nbsp; Cells(NowPos, 1) = (y - 1) / y<br/>&nbsp;&nbsp;&nbsp; NowPos = NowPos + 1<br/>&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For x = 1 To yMax - 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If x &lt; y And x &lt;&gt; 1 And y - x &lt;&gt; 1 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If x Mod 2 &lt;&gt; 0 Or y Mod 2 &lt;&gt; 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If gcd(y, x) = 1 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cells(NowPos, 1) = x / y<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NowPos = NowPos + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next x<br/>Next y</p><p>Sheets(1).[A:A].Sort Key1:=Range("A1"), Orientation:=xlTopToBottom<br/>MsgBox "用时" &amp; Format(Timer - t, "0.00") &amp; "秒"<br/>Application.ScreenUpdating = True<br/>End Sub</p><p>Function gcd(ByVal m As Integer, ByVal n As Integer) As Integer<br/>&nbsp; Do While n &lt;&gt; 0<br/>&nbsp;&nbsp;&nbsp; reminder = m Mod n<br/>&nbsp;&nbsp;&nbsp; m = n<br/>&nbsp;&nbsp;&nbsp; n = reminder<br/>&nbsp; Loop<br/>&nbsp; gcd = m<br/>End Function<br/>------<br/><u>结果:正确 用时:6.27秒<br/>忽略了必要注释要求。构思严谨,结构清晰规范,公约数函数更是可圈可点,如果使用数组,速度将大为提高。</u></p><p><br/><strong>'--*-- 戏子 --*--</strong><br/>Sub sanbe1()<br/>Application.ScreenUpdating = False<br/>On Error Resume Next<br/>t = Timer<br/>n = [b1]<br/>Dim arr(1 To 32768, 1 To 1)<br/>Range("A1:A" &amp; [A65536].End(xlUp).Row).ClearContents<br/>m = 1<br/>For i = 1 To n<br/>&nbsp;&nbsp;&nbsp; For j = 1 To i - 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr(m, 1) = j / i<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m = m + 1<br/>&nbsp;&nbsp;&nbsp; Next j<br/>Next i<br/>[a1:a32768] = arr</p><p>For i = 1 To [A65536].End(xlUp).Row<br/>&nbsp;&nbsp;&nbsp; j = Application.WorksheetFunction.CountIf(Range("A1:A" &amp; [A65536].End(xlUp).Row), Cells(i, 1)) - 1<br/>&nbsp;&nbsp;&nbsp; For m = 1 To j<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row1 = Application.WorksheetFunction.Match(Cells(i, 1), Range(Cells(i + 1, 1), Cells([A65536].End(xlUp).Row, 1)), 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cells(row1 + i, 1).ClearContents<br/>&nbsp;&nbsp;&nbsp; Next<br/>Next<br/>'//A列按升序排列<br/>&nbsp;&nbsp;&nbsp; Range("A1:A" &amp; [A65536].End(xlUp).Row).Select<br/>&nbsp;&nbsp;&nbsp; Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :=xlPinYin, DataOption1:=xlSortTextAsNumbers<br/>tim = (Timer - t) * 1000<br/>MsgBox "共耗时:" &amp; tim &amp; "毫秒"<br/>Application.ScreenUpdating = True<br/>End Sub</p><p>------<br/><u>结果:正确 用时:485秒<br/>使用工作表函数筛选不重复值,构思特别。但CountIf是公认最慢的工作表函数之一。</u></p><p><strong>'--*-- danielcm --*--</strong><br/>Dim AisFS As Boolean<br/>rivate Sub CommandButton1_Click()<br/>&nbsp;Dim A As Single, k As Integer, i As Integer, i1 As Integer, m As Integer, B As Integer<br/>&nbsp;Dim arr() As String<br/>&nbsp;&nbsp;&nbsp; Application.ScreenUpdating = False<br/>&nbsp;&nbsp;&nbsp; A = Timer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '记时开始<br/>&nbsp;&nbsp;&nbsp; Columns("A:A").ClearContents<br/>&nbsp;&nbsp;&nbsp; Sheets(1).Columns(1).NumberFormatLocal = "# ?/???"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '定义A列格式<br/>&nbsp;ReDim Preserve arr(1 To 27400)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '分配数组存储空间<br/>&nbsp;&nbsp;&nbsp; k = [b1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '取B1最大分母值<br/>&nbsp;For i = 1 To k - 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '分子<br/>&nbsp;&nbsp;&nbsp; For i1 = i + 1 To k&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '分母<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B = i<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AisFS = False<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SigeFS i, i1, B<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If AisFS = False Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m = m + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr(m) = CStr(i) &amp; "/" &amp; CStr(i1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '数据存入数组<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Next i1<br/>Next i<br/>&nbsp;&nbsp;&nbsp; Range("A1").Resize(m, 1) = Application.WorksheetFunction.Transpose(arr)&nbsp;&nbsp;&nbsp;&nbsp; '将数组填充到表<br/>&nbsp;&nbsp;&nbsp; Range("A1:A" &amp; m).Select&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '选择<br/>&nbsp;&nbsp;&nbsp; Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :=xlPinYin, DataOption1:=xlSortNormal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '排序<br/>&nbsp;&nbsp;&nbsp; Application.ScreenUpdating = True<br/>&nbsp;&nbsp;&nbsp; MsgBox "总用时 " &amp; Format(Timer - A, "0.000") &amp; "秒。"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '统计时间<br/>End Sub<br/>Function SigeFS(ByVal Fz As Integer, ByVal Fm As Integer, moDnum As Integer) '进行递归<br/>If moDnum = 1 Then Exit Function<br/>If (Fz Mod moDnum) = 0 And (Fm Mod moDnum) = 0 Then<br/>&nbsp;&nbsp;&nbsp; AisFS = True: Exit Function<br/>Else<br/>&nbsp;&nbsp;&nbsp; moDnum = moDnum - 1<br/>&nbsp;&nbsp;&nbsp; SigeFS Fz, Fm, moDnum<br/>End If<br/>End Function<br/>------<br/><u>结果:正确 用时:8.25秒<br/>代码结构清晰,简洁规范。<br/></u><br/>**********************************</p>
回复

使用道具 举报

 楼主| 发表于 2007-3-19 00:29 | 显示全部楼层

<p><strong>VBA第1期接力赛情况总述(三)</strong></p><p><strong><font color="#0000ff">根据以上测评,现公布第1期VBA接力赛评定结果如下:</font></strong><br/><strong>1.</strong><font color="#0000ff">bifengXia</font>,<font color="#0000ff">LJW17</font>,<font color="#0000ff">戏子</font>,<font color="#0000ff">danielcm</font>获参与奖,每人奖励2个金币。<br/><strong>2.</strong><font color="#0000ff">uranus1997</font>获参与奖,奖励3个金币。<br/><strong>3.</strong>本期优胜者为<font color="#0000ff">plz001</font>,奖励8个金币,并负责组织下期VBA接力赛。</p><p><font color="#ff0000"><strong>最后,再次对所有参与者表示感谢,对获奖者和优胜者表示祝贺!</strong></font></p><p><br/><strong>参见</strong>:<font color="#0000ff"><u>VBA接力赛规则(试行)</u></font></p>
回复

使用道具 举报

发表于 2007-3-19 03:21 | 显示全部楼层

<div class="msgheader">QUOTE:</div><div class="msgborder"><b>以下是引用<i>qee用</i>在2007-3-19 0:23:13的发言:</b><br/><p><strong>第1期VBA接力赛情况总述(一)</strong></p><p>这是前段时间在“编程爱好者”论坛看到的一道C语言题,本来是想考核大家排序算法的,发题时有些匆忙,既忽略了EXCEL自身的排序功能,更忘了EXCEL中的“分数”格式,真是惭愧。也好,EXCEL有EXCEL的精彩,感谢所有参与的朋友提供的精彩答案。因为排序已不是本题的重点,影响速度的主要因素就变成了两个方面:<br/><strong>1.数组的使用<br/></strong>VBA在对大数据的处理中,为了提高代码速度,数组是经常使用的方法。很多朋友对数组的方法可能还不熟悉,来看下面的例子:<br/>dim i&amp;<br/>for i=1 to 10000<br/>&nbsp; cells(i,2)=cells(i,1)*i<br/>next i<br/>上面这段代码是将[A1]至[A10000]依次写入[A1]至[A10000]乘它们所在的行号,如果使用数组的方法,就是这样的:<br/>dim i&amp;,arr1(),arr2(1 to 10000,1 to 1)<br/>arr1=range("A1:A10000") '将数据读入数组,当将超过1个单元格区域的数据读入Variant型变量时,便会产生一个下标从1开始的二维数组,两维分别对应行和列<br/>for i=1 to 10000 <br/>&nbsp; arr2(i,1)=i*arr1(i,1) '从数组中读数计算比从工作表中读数快得多<br/>next i<br/>range("B1:B10000")=arr2 '处理完成后,一次性写回工作表比逐个写快N倍<br/>你只要记住上面注释的三行并学会应用,差不多就掌握了80%以上的数组知识。<br/><strong>2.最大公约数</strong><br/>Function Gys(ByVal a%, ByVal b%)<br/>&nbsp; If a Mod b = 0 Then Gys = b: Exit Function<br/>&nbsp; Gys = Gys(b, a Mod b)<br/>End Function<br/>我不解释了,uranus1997在后面给了详尽的注释。<br/>这道题所涉及的知识当然不限于上面两个方面,抛开因我的失误而埋没的排序算法,要验证最快速度,高级筛选、集合、SQL...差不多都有用武之地,有兴趣的朋友可以去尝试一下。</p></div><p></p><p>之前就知道用数组可以提速的, 偏偏就是卡在数组的运用上了, 现在经Q版一点, 开窍了: )<br/>S: 第一次上交的答案是有注解的, 第二次忘记加上了, 既然Q版提到, 就补一下最大公约数的注解.<br/>辗转相除法定理: 设a,b,c是任意三个不全为0的整数,且a=bq+c 其中q是整数,则a,b与b,c有相同的公约数,即(a,b)=(b,c). 转化为公式就是gcd(a,b) = gcd(b,a mod b)←递归...... 不太喜欢......[em04]</p><p>Function gcd(ByVal m As Integer, ByVal n As Integer) As Integer&nbsp;&nbsp; '求最大公约数公式----辗转相除法(欧几里德算法)<br/>Do While n &lt;&gt; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;'当n大于0时, 循环继续<br/>&nbsp;&nbsp;&nbsp; reminder = m Mod n&nbsp;&nbsp;&nbsp; '先用小的一个数n除大的一个数m,得第一个余数reminder<br/>&nbsp;&nbsp;&nbsp; m = n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '把n作为被除数<br/>&nbsp;&nbsp;&nbsp; n = reminder&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '把reminder作为除数<br/>Loop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;'循环,<br/>&nbsp;&nbsp;&nbsp; gcd = m&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;'当余数为0时(赋值给n了, 即n=0), 循环结束, 最大公约数gcd为最后一个除数n(赋值给m了)<br/>End Function</p><p>题外话: 发觉想学好编程, 数学必须要过关......我得恶补一下数学了......</p><p>&nbsp;</p><p><font color="#2222aa">奖励3个金币</font></p>
[此贴子已经被qee用于2007-3-19 10:39:59编辑过]
回复

使用道具 举报

发表于 2007-3-19 10:28 | 显示全部楼层

<p>Q版的代码,真是强.学习了!</p>[em04][em04]
回复

使用道具 举报

发表于 2007-3-19 10:53 | 显示全部楼层

<p>精彩,太精彩!</p><p>努力努力再努力!</p><p>&nbsp;</p><p><font color="#ce2020">奖励2个金币</font></p>
[此贴子已经被admin于2007-3-19 11:01:05编辑过]
回复

使用道具 举报

 楼主| 发表于 2007-3-19 11:05 | 显示全部楼层

<p>全部奖金发放完毕</p><p>[em24][em24][em24][em24][em24][em24]</p><p></p><p></p>
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 22:42 , Processed in 0.306456 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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