Excel 继续将人员列表分配到下一张工作表

Excel 继续将人员列表分配到下一张工作表,excel,vba,Excel,Vba,我有一个excel文件,包含5张工作表: 主页 PRP Sharepoint 树液 FO 博 在主表中,我有一个从F12单元格开始的人员列表: 下面的代码是根据“B”列中的行数将这些人复制到其他表格的“A”列 我想要它做什么: 在为“PRP sharepoint”工作表中的每个项目分配人员后,它将进入下一个工作表,即“SAP”,前提是受让人进入下一个工作表的顺序应取决于谁是上一个工作表上最后一个工作表之后的下一个人,而不是再次从第一个人重新开始 我想开始从“PRP Sharepoint”工作表

我有一个excel文件,包含5张工作表:

  • 主页
  • PRP Sharepoint
  • 树液
  • FO
  • 在主表中,我有一个从
    F12
    单元格开始的人员列表:

    下面的代码是根据“B”列中的行数将这些人复制到其他表格的“A”列

    我想要它做什么:

    在为“PRP sharepoint”工作表中的每个项目分配人员后,它将进入下一个工作表,即“SAP”,前提是受让人进入下一个工作表的顺序应取决于谁是上一个工作表上最后一个工作表之后的下一个人,而不是再次从第一个人重新开始

    我想开始从“PRP Sharepoint”工作表到“BO”工作表的循环,同时保持人员顺序

    Sub Assign()
    
    Dim WS As Worksheet
    Dim LastRow As Long
    Dim Main As Worksheet
    Set Main = Sheets("Main")
    Dim SrchRng As Range, cel As Range
    
    
    For Each WS In Worksheets
    
    LastRow = WS.Range("B" & WS.Rows.Count).End(xlUp).Row
    
     ALR = Main.Range(Main.Range("F12"), Main.Range("F" & Main.Rows.Count).End(xlUp)).Count
    
     For x = 2 To LastRow
     For A = 2 To ALR + 1
    
        If x = LastRow + 1 Then GoTo z
    
        WS.Cells(x, 1).value = Main.Cells(A + 10, 6).value
    
     x = x + 1
    
     Next A
    
     x = x - 1
    
     Next x
    
     z:
    
    'Do nothing
    
    Next WS
    
    
    MsgBox "Done"
    
    End Sub
    
    如何修改代码以满足我的需要

    更新2:

    在主表中,我添加了一个新的列G,其中包含CWID(每个人的ID)

    答案中的代码工作得很好,但由于我在主工作表中添加了一个新列,现在我必须调整代码以使用“SAP”工作表

    问题:

    我如何调整代码以满足以下要求

    在“SAP”中有一列(由创建),其中还包含CWID,该CWID和主工作表中的新列G相同。只要主工作表中的CWID与“SAP”工作表中的行相同,它就不会将该处理器分配给该分配,同时仍会继续分配序列

    因此,如果匹配,它将在填充行时跳过它


    基本上,根据“SAP”工作表中的(创建人)列,不应将此人分配给他/她创建的项目。

    更新2:(如果工作表单元格在“A”列中已经有一些值,则跳过这些单元格)

    据我所知,当你从每张纸到下一张纸填写“A”栏时,你想继续写人名。因此,对于人员和图纸行,不应使用两个For循环。但您必须使用过程级变量,并仅在到达最后一个人时(而不是切换到下一张工作表时)将其重置为第一行

    以下是工作代码:

    Sub Assign()
    
    Dim Main As Worksheet, WS As Worksheet
    Dim PersonFirstRow As Long, PersonLastRow As Long, PersonRow As Long
    Dim WSLastRow As Long, r As Long
    Dim iWorksheet As Integer
    
    Set Main = Sheets("Main")
    
    PersonFirstRow = 12 'row of F12
    
    PersonLastRow = Main.Cells(Main.Rows.Count, "F").End(xlUp).Row
    PersonRow = PersonFirstRow 'current row in Main sheet
    
    For iWorksheet = 2 To Worksheets.Count 'start from second sheet (first sheet is Main)
        Set WS = Worksheets(iWorksheet)
        'WS.Range("A2", "A" & WS.Rows.Count).Clear 'if you want to clear column "A" before fill (if there are more items in it)
    
        WSLastRow = WS.Range("B" & WS.Rows.Count).End(xlUp).Row 'last row in column B of this sheet
    
        For r = 2 To WSLastRow 'loop through rows of this sheet
    
            If Trim(WS.Cells(r, "A").Value) = "" Then 'skip this cell if it has already some value
    
                WS.Cells(r, "A").Value = Main.Cells(PersonRow, "F") 'F12, F13, ...
    
                PersonRow = PersonRow + 1
                If PersonRow > PersonLastRow Then PersonRow = PersonFirstRow 'reset back to first row when we reach the last person
    
            End If
    
        Next r
    
    Next iWorksheet
    
    MsgBox "Done"
    
    End Sub
    

    我现在无法访问pc,我将尝试为您的新请求提供可能需要的更改,这些更改涉及SAP中的“创建人”列

    Sub Assign()
    
    Dim Main As Worksheet, WS As Worksheet
    Dim PersonFirstRow As Long, PersonLastRow As Long, PersonRow As Long
    Dim WSLastRow As Long, r As Long
    Dim iWorksheet As Integer
    
    Set Main = Sheets("Main")
    
    PersonFirstRow = 12 'row of F12
    
    PersonLastRow = Main.Cells(Main.Rows.Count, "F").End(xlUp).Row
    PersonRow = PersonFirstRow 'current row in Main sheet
    Dim SN As String, sameCWID As Boolean
    
    For iWorksheet = 2 To Worksheets.Count 'start from sheet2
        Set WS = Worksheets(iWorksheet)
        SN = WS.Name
    
        WSLastRow = WS.Range("B" & WS.Rows.Count).End(xlUp).Row 'last row in column B of this sheet
    
        For r = 2 To WSLastRow 'loop through rows of this sheet
    
            If Trim(WS.Cells(r, "A").Value) = "" Then 'skip this cell if it has already some value
    
                    sameCWID = False
                    If SN="SAP" Then If WS.Cells(r,"D").Value = Main.Cells(PersonRow,"G") Then sameCWID=True
    
                    If sameCWID Then 'dont choose this person
                        r = r-1 ' stay at this row to set by next person
                    Else
                        WS.Cells(r, "A").Value = Main.Cells(PersonRow, "F") 'F12, F13, ...
                    End If
    
                PersonRow = PersonRow + 1
                If PersonRow > PersonLastRow Then PersonRow = PersonFirstRow 'reset back to first row when we reach the last person
    
            End If
    
        Next r
    
    Next iWorksheet
    
    MsgBox "Done"
    
    End Sub
    

    对不起,但首先我必须说,几乎不可能理解你在做什么。你需要问一个更具体的问题。人们来到这里通常会遇到代码中的特定问题。您需要将您的问题分解为一个具体且易于理解的示例,在这个示例中,我们至少可以看到您的代码所做的和应该做的不同。对于一般的代码问题,你不会在这里得到任何好的答案。嗨,谢谢你的建议。我将编辑描述并提供屏幕截图。添加屏幕截图是个好主意,但你的问题现在并不更清楚,只是变得更长了。没有人读超过一页的东西。你肯定必须(在一个例子上而不是在你的实际工作上)找出你的问题所在。我给你举个例子:你给了我们一个火箭的建造计划,并问你如何能飞到月球上。但真正的问题是如何将火箭燃料送入火箭。找出你的问题是什么,并提出一个具体的问题以进一步了解。不要试图立即解决洞火箭月球飞行。嗨,我编辑了这个问题。嗨,谢谢你的建议,我编辑了这个问题并简要说明了我需要实现的目标。我尝试了上面的代码,并将代码插入到“…”中它正在工作,但对于工作表中的每个Ws,它似乎都是一样的。我需要将人员连续分配到每一张工作表,而不是重新开始分配。好的,我用一个完整的工作代码更新了答案。正如我所描述的那样。非常感谢你!还有一个问题,如果a列中的单元格中已经有一个值,这会发生吗?我不想重写,因为有时A列的某些行中已经有值。但仍然继续分配给每个项目的人员顺序。它回答了所有问题。:)非常感谢你的帮助!请检查此更改。。。我不确定,因为我不能在PCP检查谢谢,S.Serp。稍后我会尝试一下,并让您知道。您好,S.Serp,我已添加了插入的新代码,并尝试替换将在“SAP”表中匹配的CWID,以检查它是否不会分配该任务中的人员。我没有反应。但是,如果我让它只是正常的,没有任何匹配,它工作得很好。您是否将完整的代码作为已编辑的代码进行了测试?我认为您在插入新更改时犯了一个错误。。。我在上面添加了完整代码。我刚刚根据更新插入了新代码。明天我将测试完整的代码。谢谢S.serp!将让你知道后树完整的代码。