51Testing软件测试论坛

标题: 被个问题困住了,好心人帮我一下哈 [打印本页]

作者: wujianping    时间: 2010-3-11 10:23
标题: 被个问题困住了,好心人帮我一下哈
'============================================
'从上到下填入10个值,再从左2到右填入10个值
Sub ReportInformation(filename,mychar)
Set Excel = CreateObject("Excel.Application")
Excel.Workbooks.Add
Set NewSheet = Excel.Sheets.Item(1)
NewSheet.Name = "Test"
For i = 1 to 10
NewSheet.Cells(i,1).value = mychar
i = i + 1
NewSheet.Cells(1,i).value = mychar
i = i - 1
Next
Excel.ActiveWorkbook.SaveAs filename
Excel.Quit
Set Excel = Nothing
End Sub

'=================================================================================
'获得10个随机字符串

Function RandomChar(a1,a2)
For i = 1 to 3
Num1 = RandomNumber(a1, a2)
Num2 = RandomNumber(a1, a2)
Num3 = RandomNumber(a1, a2)
Num4 = RandomNumber(a1, a2)
Num5 = RandomNumber(a1, a2)
Num6 = RandomNumber(a1, a2)
Num7 = RandomNumber(a1, a2)
Num8 = RandomNumber(a1, a2)
Num9 = RandomNumber(a1, a2)
Num10 = RandomNumber(a1, a2)
RandomChar = chr(Num1)&chr(Num2)&chr(Num3)&chr(Num4)&chr(Num5)&chr(Num6)&chr(Num7)&chr(Num8)&chr(Num9)&chr(Num10)
Next
End Function


我要把随机字符串依次填入Excel中,并实现每一个单元格都是不同的字符串。现在遇到一个问题,怎么让每个单元格都是不同的值,执行一次"ReportInformation"只能调用一次"RandomChar"导致每个单元格都是一样的值,怎么重复调用"RandomChar"?
作者: shirlincn    时间: 2010-3-11 10:39
在填值的循环中调用随机数?
作者: wujianping    时间: 2010-3-11 11:01
原帖由 shirlincn 于 2010-3-11 10:39 发表
在填值的循环中调用随机数?


对的
作者: liujinkui    时间: 2010-3-11 11:17
这个去查查彩票随机 如双色球。
作者: skyzhu    时间: 2010-3-11 11:41
列也是可以 +1 的,把A转ascii,+1以后再转字符就是B了
然后用Range单元格做,套2个for,XY坐标放进去就行了,这样比较清晰
作者: wujianping    时间: 2010-3-11 12:01
原帖由 skyzhu 于 2010-3-11 11:41 发表
列也是可以 +1 的,把A转ascii,+1以后再转字符就是B了
然后用Range单元格做,套2个for,XY坐标放进去就行了,这样比较清晰


这个我知道,我是要让a1,a2形成一个随机区间,比如65-90就是A-Z

怎么才能做到每循环一次“NewSheet.Cells(i,1).value = mychar”,就获得一次随机值呢?
作者: May_may    时间: 2010-3-11 13:27
不明白lz那个随机数里的i有什么作用么?RandomChar的值的不同ms就只跟a1和a2有关系
作者: feiyunkai    时间: 2010-3-11 13:30
标题: 修改代码如下:然后再试下
''============================================
''从上到下填入10个值,再从左2到右填入10个值
Call ReportInformation("D:\test.xls")
Sub ReportInformation(filename)
Set Excel = CreateObject("Excel.Application")
Excel.DisplayAlerts = False
Excel.Workbooks.Add
Set NewSheet = Excel.Sheets.Item(1)
NewSheet.Name = "Test"
For i = 1 to 10
mychar=RandomChar(65,90)
NewSheet.Cells(i,1).value = mychar
i = i + 1
NewSheet.Cells(1,i).value = mychar
i = i - 1
Next
Excel.ActiveWorkbook.SaveAs filename
Excel.Workbooks.Close
Excel.Quit
Set NewSheet=Nothing
Set Excel = Nothing
End Sub
'
''=================================================================================
''获得10个随机字符串
'
Function RandomChar(a1,a2)
Num1 = RandomNumber(a1, a2)
Num2 = RandomNumber(a1, a2)
Num3 = RandomNumber(a1, a2)
Num4 = RandomNumber(a1, a2)
Num5 = RandomNumber(a1, a2)
Num6 = RandomNumber(a1, a2)
Num7 = RandomNumber(a1, a2)
Num8 = RandomNumber(a1, a2)
Num9 = RandomNumber(a1, a2)
Num10 = RandomNumber(a1, a2)
RandomChar = chr(Num1)&chr(Num2)&chr(Num3)&chr(Num4)&chr(Num5)&chr(Num6)&chr(Num7)&chr(Num8)&chr(Num9)&chr(Num10)
End Function

[ 本帖最后由 feiyunkai 于 2010-3-11 13:44 编辑 ]
作者: feiyunkai    时间: 2010-3-11 13:36
因为你将RandomChar(a1,a2)作为函数ReportInformation的参数,所以函数体内,所有的RandomChar(a1,a2)的值,都是传入时的值,所以值是固定的,如果想改变这个值,那么就要将RandomChar(a1,a2)放在循环体里边。
解决这个问题的方法有2种:
一、将RandomChar(a1,a2)放在ReportInformation函数的循环体内(见上面的代码)
二、将ReportInformation函数中的循环放在函数的外面(这种方法性能很差,所以最好采用第一种方法)

另外使用Excel.ActiveWorkbook.SaveAs方法时,前面最好设置一下强制保存:Excel.DisplayAlerts = False,filename路径下有同名文件时,就会直接覆盖该文件,而不提示是否覆盖,如果有特殊需要的,那么写个函数判断一下filename路径下是否存在相同文件

[ 本帖最后由 feiyunkai 于 2010-3-11 14:00 编辑 ]
作者: wujianping    时间: 2010-3-11 14:00
原帖由 May_may 于 2010-3-11 13:27 发表
不明白lz那个随机数里的i有什么作用么?RandomChar的值的不同ms就只跟a1和a2有关系


i是增加excel表的行列值
作者: wujianping    时间: 2010-3-11 14:19
原帖由 feiyunkai 于 2010-3-11 13:36 发表
因为你将RandomChar(a1,a2)作为函数ReportInformation的参数,所以函数体内,所有的RandomChar(a1,a2)的值,都是传入时的值,所以值是固定的,如果想改变这个值,那么就要将RandomChar(a1,a2)放在循环体里边。
解决 ...


修改后的代码跟我想要的还是有点出入,我并不想要把mychar在函数体内写死,我希望能给mychar赋各种各样的值,随机字符串只是其中一种,非常感谢
作者: skyzhu    时间: 2010-3-11 15:23
mychar=RandomChar(65,90)
这个要随机区间的话。。把65和90 换成随机范围的不就好了。。。
或者你再加个参数,也随机一下,就当是个随机的类型。。。
有随机了还要随机区间干什么
作者: feiyunkai    时间: 2010-3-11 16:49
我上面已经说过,你的函数RandomChar(a1,a2)返回值只是个固定的值,一个固定的值,作为参数仍是个固定的值,因此要想在每次使用时,都取不同的值,那么函数必须返回不止一个的值,下面以返回数组为例:
'思路:随即获取10组数据,并存放在数组中,然后将数组作为参数传递给函数,这样在函数体内就可以根据数组的下标,去取相应的数据

''============================================
''从上到下填入10个值,再从左2到右填入10个值
Call ReportInformation("D:\test.xls",RandomChar(65,90))
Sub ReportInformation(filename,mychar)
Set Excel = CreateObject("Excel.Application")
Excel.DisplayAlerts = False
Excel.Workbooks.Add
Set NewSheet = Excel.Sheets.Item(1)
NewSheet.Name = "Test"
For i = 1 to 10
NewSheet.Cells(i,1).value = mychar(i-1)
i = i + 1
NewSheet.Cells(1,i).value = mychar(i-1)
i = i - 1
Next
Excel.ActiveWorkbook.SaveAs filename
Excel.Workbooks.Close
Excel.Quit
Set NewSheet=Nothing
Set Excel = Nothing
End Sub

Function RandomChar(a1,a2)
Dim Charaa(10)
For j=0 to 9
Num1 = RandomNumber(a1, a2)
Num2 = RandomNumber(a1, a2)
Num3 = RandomNumber(a1, a2)
Num4 = RandomNumber(a1, a2)
Num5 = RandomNumber(a1, a2)
Num6 = RandomNumber(a1, a2)
Num7 = RandomNumber(a1, a2)
Num8 = RandomNumber(a1, a2)
Num9 = RandomNumber(a1, a2)
Num10 = RandomNumber(a1, a2)
Charaa(j) = (chr(Num1)&chr(Num2)&chr(Num3)&chr(Num4)&chr(Num5)&chr(Num6)&chr(Num7)&chr(Num8)&chr(Num9)&chr(Num10))
RandomChar=Charaa
Next
End Function

[ 本帖最后由 feiyunkai 于 2010-3-11 17:11 编辑 ]
作者: wujianping    时间: 2010-3-11 17:39
原帖由 feiyunkai 于 2010-3-11 16:49 发表
我上面已经说过,你的函数RandomChar(a1,a2)返回值只是个固定的值,一个固定的值,作为参数仍是个固定的值,因此要想在每次使用时,都取不同的值,那么函数必须返回不止一个的值,下面以返回数组为例:
'思路:随即 ...


横排的都是一样的值,还是没有解决啊老大
作者: wujianping    时间: 2010-3-11 17:40
原帖由 skyzhu 于 2010-3-11 15:23 发表
mychar=RandomChar(65,90)
这个要随机区间的话。。把65和90 换成随机范围的不就好了。。。
或者你再加个参数,也随机一下,就当是个随机的类型。。。
有随机了还要随机区间干什么


你没理解我的想法
作者: feiyunkai    时间: 2010-3-11 17:48
呵呵,那是我调试时候用的代码,,忘记改了,你把(i-1)换成0-9的随即数就行了
For i = 1 to 10
NewSheet.Cells(i,1).value = mychar(i-1)
i = i + 1
NewSheet.Cells(1,i).value = mychar(i-1)
i = i - 1
Next
修改为:
For i = 1 to 10
NewSheet.Cells(i,1).value = mychar(RandomNumber(0,9))
i = i + 1
NewSheet.Cells(1,i).value = mychar(RandomNumber(0,9))
i = i - 1
Next

[ 本帖最后由 feiyunkai 于 2010-3-11 17:52 编辑 ]
作者: skyzhu    时间: 2010-3-11 21:05
汗,LZ绕了好大个圈子
NewSheet.Cells(1,i).value =RandomChar(xxxxx)  赋值的时候调用你的随机函数不就好了
随机函数里要加Randomize,否则容易出一样的
那个随机函数搞的好复杂,1个变量就可以了,每生成一个字符拼接在1个变量里面就好了
还以为你要填满10*10的格子,原来就只要1行1列
作者: wujianping    时间: 2010-3-11 22:59
原帖由 skyzhu 于 2010-3-11 21:05 发表
汗,LZ绕了好大个圈子
NewSheet.Cells(1,i).value =RandomChar(xxxxx)  赋值的时候调用你的随机函数不就好了
随机函数里要加Randomize,否则容易出一样的
那个随机函数搞的好复杂,1个变量就可以了,每生成一个字 ...


“NewSheet.Cells(1,i).value =”我并不是只要随机值而已,我可能要给他常量,或其他的变量,要写死在里面我就不用费这么大劲了
作者: wujianping    时间: 2010-3-11 23:10
原帖由 feiyunkai 于 2010-3-11 17:48 发表
呵呵,那是我调试时候用的代码,,忘记改了,你把(i-1)换成0-9的随即数就行了
For i = 1 to 10
NewSheet.Cells(i,1).value = mychar(i-1)
i = i + 1
NewSheet.Cells(1,i).value = mychar(i-1)
i = i - 1
Nex ...


这样行列都是取相同数组里的10个值,行列的字符串应该都是一样的,只是顺序不同而已,还是没解决啊老大
我想说是不是要定义两个数组,或者数组要定义20个值,干,郁闷了。。。
作者: feiyunkai    时间: 2010-3-12 09:57
原帖由 wujianping 于 2010-3-11 23:10 发表


这样行列都是取相同数组里的10个值,行列的字符串应该都是一样的,只是顺序不同而已,还是没解决啊老大
我想说是不是要定义两个数组,或者数组要定义20个值,干,郁闷了。。。

那就取20个随即数好了,方法有了,自己改下代码就可以了啊,其实在第2次代码的基础上,你完全可以修改下,实现自己想要的结果,为什么不自己动手改下呢?懒!!!!!哈哈
'函数RandomChar(a1,a2)中的
Dim Charaa(10)
For j=0 to 9
'修改为:
Dim Charaa(20)
For j=0 to 19
'函数ReportInformation(filename,mychar)中的
For i = 1 to 10
NewSheet.Cells(i,1).value = mychar(i-1)
i = i + 1
NewSheet.Cells(1,i).value = mychar(i-1)
i = i - 1
Next
'修改为:
For i = 1 to 10
NewSheet.Cells(i,1).value = mychar(i-1)
i = i + 1
NewSheet.Cells(1,i).value = mychar(i+9)
i = i - 1
Next

[ 本帖最后由 feiyunkai 于 2010-3-12 10:06 编辑 ]
作者: wujianping    时间: 2010-3-12 10:19
原帖由 feiyunkai 于 2010-3-12 09:57 发表

那就取20个随即数好了,方法有了,自己改下代码就可以了啊,其实在第2次代码的基础上,你完全可以修改下,实现自己想要的结果,为什么不自己动手改下呢?懒!!!!!哈哈
'函数RandomChar(a1,a2)中的
Dim Chara ...


哈哈,太谢谢了,我是想看看你这边还有没有更好的方法来实现我想要的东西,所以我就先不改!
作者: wujianping    时间: 2010-3-12 10:21
不过还是有个问题,这样好像也只是治标而已,如果我想要更多的随机值也还要到函数里面改啊?如果要的随机值的数量很大呢?还是存在问题的,看看能不能帮我再优化一下,我这边也多想想
作者: z_kh    时间: 2010-3-12 11:48
没细看,不过应该是属于伪随机问题。
作者: z_kh    时间: 2010-3-12 11:51
随机前用 Randomize 处理下,这样每次第一次执行随机函数就不会出现每次第一次执行都得到同样的值了。
作者: z_kh    时间: 2010-3-12 11:54
截取一段提供参考。
Randomize   语句   
               
   
  初始化随机数生成器。   
   
  语法   
   
  Randomize   [number]   
   
  可选的   number   参数是   Variant   或任何有效的数值表达式。   
   
  说明   
   
  Randomize   用   number   将   Rnd   函数的随机数生成器初始化,该随机数生成器给   number   一个新的种子值。如果省略   number,则用系统计时器返回的值作为新的种子值。   
   
  如果没有使用   Randomize,则(无参数的)Rnd   函数使用第一次调用   Rnd   函数的种子值。   
   
  注意   若想得到重复的随机数序列,在使用具有数值参数的   Randomize   之前直接调用具有负参数值的   Rnd。使用具有同样   number   值的   Randomize   是不会得到重复的随机数序列的。
作者: skyzhu    时间: 2010-3-12 15:06
原帖由 wujianping 于 2010-3-11 22:59 发表


“NewSheet.Cells(1,i).value =”我并不是只要随机值而已,我可能要给他常量,或其他的变量,要写死在里面我就不用费这么大劲了


外面传进来什么,就给这个随机函数什么就好了。。。你觉得只能固定吗?
作者: hehetom    时间: 2010-3-18 11:19
excelhome里 有很多这样都问题




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2