Excel查询-删除列值

Excel查询-删除列值,excel,excel-formula,vba,Excel,Excel Formula,Vba,在我们的团队名册中,我们试图消除在某一天外出的人员的轮班。例如,在2017年5月25日的截图中,Leo离开了。我可以在上面几行中使用什么公式/选项/代码,以便根据本栏中的手动输入自动删除Leo的所有班次 下面是一个使用Excel VBA的可能解决方案 首先,将名为Master的原始花名册的内容复制到新的工作表更新花名册中。这允许您保留原始花名册的未更改副本,以防以后从客场行中删除姓名并需要重新应用更新 接下来,扫描第一列以定位Away:行 最后,对于剩余的每一列,都会将离开的名称列表加载到一个数

在我们的团队名册中,我们试图消除在某一天外出的人员的轮班。例如,在2017年5月25日的截图中,Leo离开了。我可以在上面几行中使用什么公式/选项/代码,以便根据本栏中的手动输入自动删除Leo的所有班次


下面是一个使用Excel VBA的可能解决方案

首先,将名为Master的原始花名册的内容复制到新的工作表更新花名册中。这允许您保留原始花名册的未更改副本,以防以后从客场行中删除姓名并需要重新应用更新

接下来,扫描第一列以定位Away:行

最后,对于剩余的每一列,都会将离开的名称列表加载到一个数组中

然后,每次处理一个离开的名称。通过与正则表达式匹配,然后根据需要替换为逗号或无,可以从花名册的每一行中删除出现的每个名称

Option Explicit

Dim AwayRowNbr As Long

Sub UpdateRoster()

  Dim UpdatedRoster As Worksheet
  Dim RowNbr As Long
  Dim ColNbr As Long
  Dim MaxColNbr As Long
  Dim MaxRowNbr As Long

  ' Insert new "Updated Roster" worksheet
  Set UpdatedRoster = Sheets.Add(After:=Sheets(Sheets.Count))
  UpdatedRoster.Name = "Updated Roster"

  With ThisWorkbook.Worksheets("Updated Roster")

    ' Copy contents of "Master" worksheet to "Updated Roster"
    ThisWorkbook.Worksheets("Master").Cells.Copy Destination:=.Cells

    ' Locate "Away" row, and determine last column with data
    AwayRowNbr = .Range("A:A").Find(What:="Away:", LookIn:=xlValues).Row
    MaxColNbr = .Cells(AwayRowNbr, Columns.Count).End(xlToLeft).Column

    For ColNbr = 2 To MaxColNbr
      Call RemoveNames(.Cells(AwayRowNbr, ColNbr).Value, ColNbr)
    Next ColNbr

  End With

End Sub

Sub RemoveNames(AwayNames As String, ColNbr As Long)

   Dim AwayName() As String
   Dim Name As String
   Dim NameIdx As Integer
   Dim RegEx As Object
   Dim RowNbr As Long
   Dim MaxRowNbr As Long
   Dim BeforeReplace As String
   Dim AfterReplace As String

   With ThisWorkbook.Worksheets("Updated Roster")

     ' Create regular expression object
     Set RegEx = CreateObject("vbscript.regexp")
     RegEx.Global = False

     ' Load "away" names into a String array
     AwayName() = Split(AwayNames, ",")

     ' Determine last row with data
     MaxRowNbr = .Cells(Rows.Count, ColNbr).End(xlUp).Row

     ' Process each "away" name
     For NameIdx = LBound(AwayName) To UBound(AwayName)
       Name = Trim(AwayName(NameIdx))
       For RowNbr = 2 To MaxRowNbr
         If RowNbr <> AwayRowNbr Then

           AfterReplace = .Cells(RowNbr, ColNbr).Value

           ' Remove name if delimited by commas
           RegEx.Pattern = ", *" & Name & " *,"
           Do
             BeforeReplace = AfterReplace
             AfterReplace = RegEx.Replace(BeforeReplace, ",")
           Loop Until BeforeReplace = AfterReplace

           ' Remove name if at beginning or end of cell
           RegEx.Pattern = "(^ *" & Name & " *,)|(, *" & Name & " *$)|(^ *" & Name & " *$)"
           Do
             BeforeReplace = AfterReplace
             AfterReplace = RegEx.Replace(BeforeReplace, "")
           Loop Until BeforeReplace = AfterReplace

           .Cells(RowNbr, ColNbr).Value = AfterReplace

         End If
       Next RowNbr
     Next NameIdx

   End With

End Sub

客场行是手动填充的,对吗?是的,客场行是手动填充的。谢谢。上面几行的公式是什么?或者它们只是硬编码的值,在这种情况下,很难用公式替换它们,但可能会基于原始行生成新行,加上远离行。无论哪种方式都可以,上面的公式或基于原始行和远离值生成新行。如何基于这些值生成新行?