如何使用excel创建值介于一定数量之间的随机名称?
我在一列中有100个名字。在下一个单元格中,每个名字的旁边都有一个数值,这个数值表示这个名字的价值。在一家公司中,每个名字都有可能担任6个职位。这也在每个名字旁边的一个单元格中 电子表格看起来像这样 John Smith Lawyer $445352 Joe Doe Doctor $525222 John Doe Accountant $123192 etc.... 约翰·史密斯律师445352美元 乔·多伊医生525222美元 无名氏会计师123192美元 等如何使用excel创建值介于一定数量之间的随机名称?,excel,Excel,我在一列中有100个名字。在下一个单元格中,每个名字的旁边都有一个数值,这个数值表示这个名字的价值。在一家公司中,每个名字都有可能担任6个职位。这也在每个名字旁边的一个单元格中 电子表格看起来像这样 John Smith Lawyer $445352 Joe Doe Doctor $525222 John Doe Accountant $123192 etc.... 约翰·史密斯律师445352美元 乔·多伊医生525222美元 无名氏会计师123192美元 等
我想让excel给我10个人,他们的总收入在200万到300万美元之间。但我要求其中2人是医生,2人是律师,2人是会计师等。我将如何创建这一点?我用以下数据建立了表1: 目标:
Sub macro()
Dim rCell As Range
Dim rRng As Range
Dim rangelist As String
Dim entryCount As Long
Dim totalnum As Long
Set rRng = Sheet1.Range("A1:A12")
Dim OccA As String
Dim OccCntA As Long
Dim OccASalmin As Long
Dim OccASalmax As Long
Dim OccB As String
Dim OccCntB As Long
Dim OccBSalmin As Long
Dim OccBSalmax As Long
Dim OccC As String
Dim OccCntC As Long
Dim OccCSalmin As Long
Dim OccCSalmax As Long
'Set total number of results to return
totalnum = 10
'Set which occupations that must be included in results
OccA = "Accountant"
OccB = "Doctor"
OccC = "Lawyer"
'Set minimum quantity of each occupation to me returned in results
OccCntA = 2
OccCntB = 2
OccCntC = 2
'Set min and max salary ranges to return for each occupation
OccASalmin = 1000000
OccASalmax = 6000000
OccBSalmin = 1000000
OccBSalmax = 6000000
OccCSalmin = 1000000
OccCSalmax = 6000000
'Get total number of entries
entryCount = rRng.Count
'Randomly get first required occupation entries
'Return list of rows for each Occupation
OccAList = PickRandomItemsFromList(OccCntA, entryCount, OccA, OccASalmin, OccASalmax)
OccBList = PickRandomItemsFromList(OccCntB, entryCount, OccB, OccBSalmin, OccBSalmax)
OccCList = PickRandomItemsFromList(OccCntC, entryCount, OccC, OccCSalmin, OccCSalmax)
For Each i In OccAList
If rangelist = "" Then
rangelist = "A" & i
Else
rangelist = rangelist & "," & "A" & i
End If
Next i
For Each i In OccBList
If rangelist = "" Then
rangelist = "A" & i
Else
rangelist = rangelist & "," & "A" & i
End If
Next i
For Each i In OccCList
If rangelist = "" Then
rangelist = "A" & i
Else
rangelist = rangelist & "," & "A" & i
End If
Next i
'Print the rows that match criteria
Dim rCntr As Long
rCntr = 1
Dim nRng As Range
Set nRng = Range(rangelist)
For Each j In nRng
Range(j, j.Offset(0, 2)).Select
Selection.Copy
Range("E" & rCntr).Select
ActiveSheet.Paste
rCntr = rCntr + 1
Next j
'Get rest of rows randomly and print
OccList = PickRandomItemsFromListB(totalnum - rCntr + 1, entryCount, rangelist)
For Each k In OccList
Set Rng = Range("A" & k)
Range(Rng, Rng.Offset(0, 2)).Select
Selection.Copy
Range("E" & rCntr).Select
ActiveSheet.Paste
rCntr = rCntr + 1
Next k
End Sub
Function PickRandomItemsFromListB(nItemsToPick As Long, nItemsTotal As Long, avoidRng As String)
Dim rngList As Range
Dim idx() As Long
Dim varRandomItems() As Variant
Dim i As Long
Dim j As Long
Dim booIndexIsUnique As Boolean
Set rngList = Range("B1").Resize(nItemsTotal, 1)
ReDim idx(1 To nItemsToPick)
ReDim varRandomItems(1 To nItemsToPick)
For i = 1 To nItemsToPick
Do
booIndexIsUnique = True ' Innoncent until proven guilty
idx(i) = Int(nItemsTotal * Rnd + 1)
For j = 1 To i - 1
If idx(i) = idx(j) Then
' It's already there.
booIndexIsUnique = False
Exit For
End If
Next j
Set isect = Application.Intersect(Range("A" & idx(i)), Range(avoidRng))
If booIndexIsUnique = True And isect Is Nothing Then
Exit Do
End If
Loop
varRandomItems(i) = idx(i)
Next i
PickRandomItemsFromListB = varRandomItems
' varRandomItems now contains nItemsToPick unique random
' items from range rngList.
End Function
Function PickRandomItemsFromList(nItemsToPick As Long, nItemsTotal As Long, Occ As String, Salmin As Long, Salmax As Long)
Dim rngList As Range
Dim idx() As Long
Dim varRandomItems() As Variant
Dim i As Long
Dim j As Long
Dim booIndexIsUnique As Boolean
Set rngList = Range("B1").Resize(nItemsTotal, 1)
ReDim idx(1 To nItemsToPick)
ReDim varRandomItems(1 To nItemsToPick)
For i = 1 To nItemsToPick
Do
booIndexIsUnique = True ' Innoncent until proven guilty
idx(i) = Int(nItemsTotal * Rnd + 1)
For j = 1 To i - 1
If idx(i) = idx(j) Then
' It's already there.
booIndexIsUnique = False
Exit For
End If
Next j
If booIndexIsUnique = True And Range("B" & idx(i)).Value = Occ And Range("B" & idx(i)).Offset(0, 1).Value >= Salmin And Range("B" & idx(i)).Offset(0, 1).Value <= Salmax Then
Exit Do
End If
Loop
varRandomItems(i) = idx(i)
Next i
PickRandomItemsFromList = varRandomItems
End Function
Sub宏()
变暗rCell As范围
暗rRng As范围
将范围列表设置为字符串
暗淡的入口数等于长
Dim totalnum尽可能长
设置rRng=Sheet1.范围(“A1:A12”)
Dim OccA作为字符串
暗淡的OccCntA一样长
昏昏欲睡
暗淡的时间和长的时间一样长
作为字符串的Dim OccB
Dim OccCntB的长度为
时间尽可能长
暗淡的OccBSalmax尽可能长
作为字符串的Dim OccC
Dim OccCntC与长
暗淡的OccCSalmin如长
Dim OccCSalmax和Long一样长
'设置要返回的结果总数
totalnum=10
'设置必须包含在结果中的职业
OccA=“会计”
OccB=“医生”
OccC=“律师”
'设置结果中返回给我的每个职业的最小数量
OccCntA=2
OccCntB=2
OccCntC=2
'设置每个职业返回的最低和最高薪资范围
OccASalmin=1000000
OccASalmax=6000000
OccBSalmin=1000000
OccBSalmax=6000000
OccCSalmin=1000000
OccCSalmax=6000000
'获取项目总数
entryCount=rRng.Count
'随机获取第一个必需的职业条目
'返回每个职业的行列表
OccAList=PickRandomItemsFromList(OccCntA、entryCount、OccA、OccASalmin、OccASalmax)
OccBList=PickRandomItemsFromList(OccCntB、entryCount、OccB、OccBSalmin、OccBSalmax)
OccCList=PickRandomItemsFromList(OccCntC、entryCount、OccC、OccCSalmin、OccCSalmax)
对于每一个我在OccAList
如果rangelist=“”,则
rangelist=“A”和i
其他的
范围列表=范围列表&“,&“A”&i
如果结束
接下来我
对于OccBList中的每个i
如果rangelist=“”,则
rangelist=“A”和i
其他的
范围列表=范围列表&“,&“A”&i
如果结束
接下来我
对于OccCList中的每个i
如果rangelist=“”,则
rangelist=“A”和i
其他的
范围列表=范围列表&“,&“A”&i
如果结束
接下来我
'打印符合条件的行
变暗rCntr为长
rCntr=1
变暗nRng As范围
设置nRng=范围(范围列表)
对于nRng中的每个j
范围(j,j偏移量(0,2))。选择
选择,复制
范围(“E”和rCntr)。选择
活动表。粘贴
rCntr=rCntr+1
下一个j
'随机获取其余行并打印
OccList=PickRandomItemsFromListB(totalnum-rCntr+1,entryCount,rangelist)
对于OccList中的每个k
设置Rng=范围(“A”&k)
范围(Rng,Rng偏移量(0,2))。选择
选择,复制
范围(“E”和rCntr)。选择
活动表。粘贴
rCntr=rCntr+1
下一个k
端接头
函数PickRandomItemsFromListB(nItemsToPick为长,nItemsTotal为长,avoidRng为字符串)
暗淡的闪烁范围
Dim idx()的长度为
Dim varRandomItems()作为变量
我想我会坚持多久
Dim j尽可能长
Dim booindexis作为布尔值唯一
设置rngList=范围(“B1”)。调整大小(nItemsTotal,1)
ReDim idx(1到nItemsToPick)
ReDim VARANDOMITEMS(1到nItemsToPick)
对于i=1至nItemsToPick
做
booIndexIsUnique=在被证明有罪之前,真实的“无罪”
idx(i)=Int(nItemsTotal*Rnd+1)
对于j=1到i-1
如果idx(i)=idx(j),则
“它已经在那里了。
booIndexIsUnique=False
退出
如果结束
下一个j
Set isect=Application.Intersect(范围(“A”)和idx(i)),范围(avoidng))
如果booIndexIsUnique=True且isect为空,则
退出Do
如果结束
环
varRandomItems(i)=idx(i)
接下来我
PickRandomItemsFromListB=varRandomItems
'varRandomItems现在包含nItemsToPick unique random
'范围内的项目为rngList。
端函数
函数PickRandomItemsFromList(nItemsToPick为长、nItemsTotal为长、Occ为字符串、Salmin为长、Salmax为长)
暗淡的闪烁范围
Dim idx()的长度为
Dim varRandomItems()作为变量
我想我会坚持多久
Dim j尽可能长
Dim booindexis作为布尔值唯一
设置rngList=范围(“B1”)。调整大小(nItemsTotal,1)
ReDim idx(1到nItemsToPick)
ReDim VARANDOMITEMS(1到nItemsToPick)
对于i=1至nItemsToPick
做
booIndexIsUnique=在被证明有罪之前,真实的“无罪”
idx(i)=Int(nItemsTotal*Rnd+1)
对于j=1到i-1
如果idx(i)=idx(j),则
“它已经在那里了。
booIndexIsUnique=False
退出
如果结束
下一个j
如果booIndexIsUnique=True和Range(“B”&idx(i))。Value=Occ和Range(“B”&idx(i))。Offset(0,1)。Value>=Salmin和Range(“B”&idx(i))。Offset(0,1)。Value是真的全部在一行中,还是A列中的所有名称,B列中的职业,C列中的工资,共100行?哦,对不起,我是excel新手。你说得对。所有的名字都在A列中。职业在B列中,薪水在c列中,等等。在MS Access中将这些数据导入到一个表中并编写SQL来完成这项工作要容易得多。这是一次性的还是必须经常做?这是需要经常做的事情。它还需要能够包括/排除某些人,然后从剩余的池中生成一个列表。我同意蒙蒂·怀尔德的观点。它在一个合适的数据库中更易于维护,也更易于操作。