Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用excel创建值介于一定数量之间的随机名称?_Excel - Fatal编程技术网

如何使用excel创建值介于一定数量之间的随机名称?

如何使用excel创建值介于一定数量之间的随机名称?,excel,Excel,我在一列中有100个名字。在下一个单元格中,每个名字的旁边都有一个数值,这个数值表示这个名字的价值。在一家公司中,每个名字都有可能担任6个职位。这也在每个名字旁边的一个单元格中 电子表格看起来像这样 John Smith Lawyer $445352 Joe Doe Doctor $525222 John Doe Accountant $123192 etc.... 约翰·史密斯律师445352美元 乔·多伊医生525222美元 无名氏会计师123192美元 等

我在一列中有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:

目标:

  • 返回10人
  • 工资在1000000到6000000之间
  • 每个医生、律师、会计师至少2名
  • 运行此宏:

    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来完成这项工作要容易得多。这是一次性的还是必须经常做?这是需要经常做的事情。它还需要能够包括/排除某些人,然后从剩余的池中生成一个列表。我同意蒙蒂·怀尔德的观点。它在一个合适的数据库中更易于维护,也更易于操作。