You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA员工互评开发:C、D列不同名的姓名分配需求

实现员工互评D列姓名分配的VBA逻辑补充

以下是满足你需求的完整VBA代码,已补充D列姓名分配的核心逻辑:

Sub assign2ndQR()
    Dim empNames As Variant
    Dim LastRow As Long
    Dim ws As Worksheet
    Dim i As Long, arrIndex As Long
    
    ' 指定目标工作表,避免ActiveWorkbook切换导致错误
    Set ws = ActiveWorkbook.Sheets("employees")
    LastRow = ws.UsedRange.Rows.Count
    empNames = UniquesFromRange(ws.Range("A2:A" & LastRow))
    
    ' 处理空数组情况
    If UBound(empNames) = -1 Then
        Debug.Print "未找到有效姓名数据"
        Exit Sub
    End If
    
    arrIndex = 0 ' 初始化数组遍历索引
    ' 遍历D列(从第2行开始,假设第1行为表头)
    For i = 2 To LastRow
        ' 循环获取数组中的姓名,直到当前行C、D列姓名不同
        Do
            ws.Cells(i, "D").Value = empNames(arrIndex)
            arrIndex = arrIndex + 1
            ' 数组遍历完成后重置索引,实现循环复用
            If arrIndex > UBound(empNames) Then arrIndex = 0
            
            ' 特殊场景处理:数组仅含一个姓名且与C列重复,无法分配
            If UBound(empNames) = 0 And ws.Cells(i, "C").Value = empNames(arrIndex) Then
                Debug.Print "警告:第" & i & "行无法分配有效姓名,唯一可选姓名与C列重复"
                Exit Do
            End If
        Loop Until ws.Cells(i, "C").Value <> ws.Cells(i, "D").Value
    Next i
    
    Debug.Print "D列姓名分配任务完成"
End Sub

Function UniquesFromRange(Rng As Range)
    Dim d As Object, c As Range, tmp
    Set d = CreateObject("scripting.dictionary")
    For Each c In Rng.SpecialCells(xlCellTypeVisible).Cells
        tmp = Trim(c.Value)
        If Len(tmp) > 0 Then
            If Not d.Exists(tmp) Then d.Add tmp, 1
        End If
    Next c
    UniquesFromRange = d.keys
End Function

关键逻辑说明

  • 数组循环复用:通过arrIndex变量遍历empNames数组,当索引超出数组上界时重置为0,实现数组的循环使用。
  • 同行姓名去重:使用Do...Loop循环检查当前分配的姓名是否与C列同行姓名重复,若重复则自动取下一个数组元素,直到符合规则。
  • 边界情况处理:当姓名数组仅包含一个元素,且该元素与当前行C列姓名相同时,输出警告并退出循环,避免无限死循环。
  • 类型优化:将LastRow的类型从Integer改为Long,避免工作表行数超过32767时出现溢出错误。

内容的提问来源于stack exchange,提问作者phrozen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:33:33