Excel 仅在列表中保留文档的最新版本

Excel 仅在列表中保留文档的最新版本,excel,vba,excel-formula,Excel,Vba,Excel Formula,我有这样一份清单: 文件#1 PB 文件#1件 文件#2 PB 文件#2件 文件#2 PD 文件#3 PA 文件#4 PB 文件#4件 大约700排。修订(PA、PB、PC等)和文件编号不在同一列中 对于列表中多次出现的文档,如何筛选/删除不是最新版本的任何行 最新的是这样确定的:PC>PB,PD>PC 此外,为了便于参考,文件编号由字母和数字组成 我不介意用VBA或Excel公式来解决问题。据我所知,这是解决问题的一种方法。有点复杂,但我喜欢解决它 步骤: 使用带有PA、PB等的第二列从a

我有这样一份清单:

文件#1 PB
文件#1件
文件#2 PB
文件#2件
文件#2 PD
文件#3 PA
文件#4 PB
文件#4件

大约700排。修订(PA、PB、PC等)和文件编号不在同一列中

对于列表中多次出现的文档,如何筛选/删除不是最新版本的任何行

最新的是这样确定的:PC>PB,PD>PC

此外,为了便于参考,文件编号由字母和数字组成


我不介意用VBA或Excel公式来解决问题。

据我所知,这是解决问题的一种方法。有点复杂,但我喜欢解决它

步骤:

  • 使用带有PA、PB等的第二列从a到z对数据进行排序
  • 复制粘贴新列中的所有文档编号,并在其上运行“删除重复项”
  • 在下一列中,根据屏幕截图应用CountIf
    =CountIf($B$2:$B$9,F2)
  • 现在使用函数
    =COUNTIF($B$2:$B2,B2)和B2
  • 最后应用Vlookup
    =Vlookup(G2&F2,$A$2:$C$9,3,FALSE)
请参见屏幕截图以获取应用位置的参考信息


您将拥有一个最新版本的独特文档列表。

据我所知,这是一种方法。有点复杂,但我喜欢解决它

步骤:

  • 使用带有PA、PB等的第二列从a到z对数据进行排序
  • 复制粘贴新列中的所有文档编号,并在其上运行“删除重复项”
  • 在下一列中,根据屏幕截图应用CountIf
    =CountIf($B$2:$B$9,F2)
  • 现在使用函数
    =COUNTIF($B$2:$B2,B2)和B2
  • 最后应用Vlookup
    =Vlookup(G2&F2,$A$2:$C$9,3,FALSE)
请参见屏幕截图以获取应用位置的参考信息


您将拥有一个最新版本的唯一文档列表。

如果您正在寻找VBA解决方案,这也应该可行。我假设您的数据在修订字符串左侧的列中按如下方式排列:documentname

这是通过将文档名称添加到字典中来实现的,当同一文档多次出现时,通过转换为数字并在发现较大的新值时更新字典来比较修订号

Option Explicit

Public Sub ConvertRangeToDict()
    Dim mySearchRange       As Excel.Range
    Dim LatestRevisions     As Object
    Dim mySheet             As Excel.Worksheet

    Set mySheet = ThisWorkbook.Sheets("Sheet1") 'Update your sheet reference
    Set mySearchRange = mySheet.Range("A1:A1000") 'Only pass in Document name range, one column only
    Set LatestRevisions = GetLatestRevisions(mySearchRange)

    With LatestRevisions
        mySheet.Range("D1").Resize(.Count, 1) = Application.Transpose(.keys)
        mySheet.Range("E1").Resize(.Count, 1) = Application.Transpose(.items)
    End With

End Sub

Public Function GetLatestRevisions(SearchRng As Range) As Object
    Dim dict            As Object
    Dim Cell            As Excel.Range
    Dim RevisionInDict  As Long
    Dim Revision        As Long

    Set dict = CreateObject("Scripting.Dictionary")
    If SearchRng.Columns.Count > 1 Then Exit Function

    For Each Cell In SearchRng
        If Not dict.Exists(Cell.Value) Then
            dict.Add Cell.Value, Cell.Offset(0, 1) 'I'm assuming the revisions are stored in the cell to the right
        Else
            RevisionInDict = ConvertTextToNumeric(dict(Cell.Value))
            Revision = ConvertTextToNumeric(Cell.Offset(0, 1))
            If Revision > RevisionInDict Then dict(Cell.Value) = Cell.Offset(0, 1)
        End If
    Next

    Set GetLatestRevisions = dict
End Function

Public Function ConvertTextToNumeric(CellValue As String) As Long
    Dim i            As Long
    Dim NumberString As String

    For i = 1 To Len(CellValue)
        NumberString = NumberString & CStr(Asc(Mid$(UCase(CellValue), i, 1)))
    Next

    ConvertTextToNumeric = CLng(NumberString)
End Function

如果您正在寻找一个VBA解决方案,这应该也适用。我假设您的数据在修订字符串左侧的列中按如下方式排列:documentname

这是通过将文档名称添加到字典中来实现的,当同一文档多次出现时,通过转换为数字并在发现较大的新值时更新字典来比较修订号

Option Explicit

Public Sub ConvertRangeToDict()
    Dim mySearchRange       As Excel.Range
    Dim LatestRevisions     As Object
    Dim mySheet             As Excel.Worksheet

    Set mySheet = ThisWorkbook.Sheets("Sheet1") 'Update your sheet reference
    Set mySearchRange = mySheet.Range("A1:A1000") 'Only pass in Document name range, one column only
    Set LatestRevisions = GetLatestRevisions(mySearchRange)

    With LatestRevisions
        mySheet.Range("D1").Resize(.Count, 1) = Application.Transpose(.keys)
        mySheet.Range("E1").Resize(.Count, 1) = Application.Transpose(.items)
    End With

End Sub

Public Function GetLatestRevisions(SearchRng As Range) As Object
    Dim dict            As Object
    Dim Cell            As Excel.Range
    Dim RevisionInDict  As Long
    Dim Revision        As Long

    Set dict = CreateObject("Scripting.Dictionary")
    If SearchRng.Columns.Count > 1 Then Exit Function

    For Each Cell In SearchRng
        If Not dict.Exists(Cell.Value) Then
            dict.Add Cell.Value, Cell.Offset(0, 1) 'I'm assuming the revisions are stored in the cell to the right
        Else
            RevisionInDict = ConvertTextToNumeric(dict(Cell.Value))
            Revision = ConvertTextToNumeric(Cell.Offset(0, 1))
            If Revision > RevisionInDict Then dict(Cell.Value) = Cell.Offset(0, 1)
        End If
    Next

    Set GetLatestRevisions = dict
End Function

Public Function ConvertTextToNumeric(CellValue As String) As Long
    Dim i            As Long
    Dim NumberString As String

    For i = 1 To Len(CellValue)
        NumberString = NumberString & CStr(Asc(Mid$(UCase(CellValue), i, 1)))
    Next

    ConvertTextToNumeric = CLng(NumberString)
End Function

你怎么知道哪一个是最后一个?是的,sry我应该澄清这一点,但如果有意义的话,最新的修订是最高的字母。例如,PC是PB上更新的版本,因此PC>PB。在P@列上按降序排序,然后使用“数据”选项卡上的“删除重复项”。您希望在示例数据中删除哪些重复项?1、3、4、倒数第二?你怎么知道哪一个是倒数第二个?是的,我应该澄清一下,但如果有意义的话,最新版本是最高的字母。例如,PC是PB上更新的版本,因此PC>PB。在P@列上按降序排序,然后使用“数据”选项卡上的“删除重复项”。您希望在示例数据中删除哪些重复项?第一、三、四、倒数第二?哇,这看起来很棒,我还没有试过,但一定会试的,等我试过了再给你点评!您好,我设法使您的代码与我的文件它的伟大和工作非常快!可以复制最新文档行的整行(最多像第五列)吗?您好,很高兴这种方法对您有所帮助。我不确定我是否理解这个问题。但是,如果您希望复制整行,您可以将一个范围存储为字典值,而不是修订文本。哇,这看起来很棒,我还没有尝试过,但一定会尝试,并在我尝试过后给您提供评论!您好,我设法使您的代码与我的文件它的伟大和工作非常快!可以复制最新文档行的整行(最多像第五列)吗?您好,很高兴这种方法对您有所帮助。我不确定我是否理解这个问题。但是,如果您希望复制整行,可以将一个范围存储为字典值,而不是修订文本。感谢您的回答,我将在稍后尝试使用宏时使用它来参考实际的最新文档列表。感谢您的回答,当我稍后尝试使用宏时,我将使用它来参考实际的最新文档列表。