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