|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 玉阳山人 于 2021-12-16 17:27 编辑
拓展任意区间乐透型号码排列组合的功能.zip
(216.53 KB, 下载次数: 8)
老师:上面附件乐透型号码排列、组合的自定义函数里,
由于第一参数C1指定的是【乐透型彩票】n选m中号码总数n。假如C1指定为33,则代表需要排列组合的号码范围是01~33;假如C1指定为11,则代表需要排列组合的号码范围是01~11.等于默认所有最小数字都是从01开始。但是在实际应用时,经常会遇到从指定最小数字开始,到指定最大数字之间排列、组合的情况--如:从最小00~最大10这11个元素里,每次抽取m个的排列组合;或从最小21~最大33这13个元素里,每次抽取m个的排列组合......
为了让自定义函数LTXPL和LTXZH具备更灵活、广泛的运算功能,需要将原第一参数C1【n选m中号码总数n】,拆分成指定最小数字(包括00)、最大数字(<=99)两个参数,使之可以对00~99范围内任意区间的元素,按照每次抽取m个进行排列组合。令:
C1代表最小数字(第一参数),
C2代表最大数字(第二参数),
C3代表每注排列组合的的元素个数m(第三参数),
mode=1为多列输出,mode<>1为单列输出(第四参数);
ch=0,自动字符长度,ch<>0指定字符长度【指定为1时,显示单字节;指定为2时,显示双字节;指定为n时,即显示n字节(第五参数).
附1.乐透型号码的排列--
'乐透型号码排列
Function LTXPL(C1, C2, Optional mode = 1, Optional ch = 2)
'C1取C2组合
'mode=1多列输出,mode<>1单列输出
'ch=0,自动字符长度,ch<>0指定字符长度
n = C1
m = C2
If Application.Version = "11.0" Then '2003版本
N3 = Application.Caller.Rows.Count
M3 = Application.Caller.Columns.Count
Else
gsh = Application.ThisCell.Formula
Do While gsh = Application.ThisCell.Offset(N3, 0).Formula
If Application.ThisCell.Offset(N3, 0).Row = Rows.Count Then Exit Do
N3 = N3 + 1
Loop
Do While gsh = Application.ThisCell.Offset(0, M3).Formula
If Application.ThisCell.Offset(0, M3).Row = Columns.Count Then Exit Do
M3 = M3 + 1
Loop
End If
arr = ArrPC(n, m, 3, , 1) '3 排列,1(或缺省) 组合
If ch = 0 Then fu = Application.Rept(0, Len(n)) Else fu = Application.Rept(0, Abs(ch))
If UBound(arr) > N3 Then kr = N3 Else kr = UBound(arr)
If UBound(arr, 2) > M3 Then kc = M3 Else kc = UBound(arr, 2)
If mode = 1 Then
ReDim brr(1 To N3, 1 To M3)
For i = 1 To kr
For j = 1 To kc
brr(i, j) = Format(arr(i, j), fu)
Next
For jj = j To M3
brr(i, jj) = ""
Next
Next
For ii = i To N3
For j = 1 To M3
brr(ii, j) = ""
Next j, ii
Else
ReDim brr(1 To N3, 1 To 1)
For i = 1 To kr
For j = 1 To UBound(arr, 2)
brr(i, 1) = brr(i, 1) & Format(arr(i, j), fu)
Next j, i
For ii = i To N3
brr(ii, 1) = ""
Next
End If
LTXPL = brr
End Function
附2.乐透型号码的组合
Function LTXZH(C1, C2, Optional mode = 1, Optional ch = 2)
'C1取C2组合
'mode=1多列输出,mode<>1单列输出
ch=0,自动字符长度,ch<>0指定字符长度【指定为1时,显示单字节;指定为2时,显示双字节;指定为n时,即显示n字节.
n = C1
m = C2
If Application.Version = "11.0" Then '2003版本
N3 = Application.Caller.Rows.Count
M3 = Application.Caller.Column.Count
Else
gsh = Application.ThisCell.Formula
Do While gsh = Application.ThisCell.Offset(N3, 0).Formula
If Application.ThisCell.Offset(N3, 0).Row = Rows.Count Then Exit Do
N3 = N3 + 1
Loop
Do While gsh = Application.ThisCell.Offset(0, M3).Formula
If Application.ThisCell.Offset(0, M3).Row = Columns.Count Then Exit Do
M3 = M3 + 1
Loop
End If
arr = ArrPC(n, m, , , 1)
If ch = 0 Then fu = Application.Rept(0, Len(n)) Else fu = Application.Rept(0, Abs(ch))
If UBound(arr) > N3 Then kr = N3 Else kr = UBound(arr)
If UBound(arr, 2) > M3 Then kc = M3 Else kc = UBound(arr, 2)
If mode = 1 Then
ReDim brr(1 To N3, 1 To M3)
For i = 1 To kr
For j = 1 To kc
brr(i, j) = Format(arr(i, j), fu)
Next
For jj = j To M3
brr(i, jj) = ""
Next
Next
For ii = i To N3
For j = 1 To M3
brr(ii, j) = ""
Next j, ii
Else
ReDim brr(1 To N3, 1 To 1)
For i = 1 To kr
For j = 1 To UBound(arr, 2)
brr(i, 1) = brr(i, 1) & Format(arr(i, j), fu)
Next j, i
For ii = i To N3
brr(ii, 1) = ""
Next
End If
LTXZH = brr
End Function
恭请老师在上面自定义函数LTXPL和LTXZH的代码里,在全盘保留原代码运算功能的基础上,拆分原第一参数(指定号码总数n)为指定最小数字和指定最大数字两个参数。
谢谢!
|
|