Excel 仅在列表中保留文档的最新版本
我有这样一份清单: 文件#1 PBExcel 仅在列表中保留文档的最新版本,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件
文件#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@列上按降序排序,然后使用“数据”选项卡上的“删除重复项”。您希望在示例数据中删除哪些重复项?第一、三、四、倒数第二?哇,这看起来很棒,我还没有试过,但一定会试的,等我试过了再给你点评!您好,我设法使您的代码与我的文件它的伟大和工作非常快!可以复制最新文档行的整行(最多像第五列)吗?您好,很高兴这种方法对您有所帮助。我不确定我是否理解这个问题。但是,如果您希望复制整行,您可以将一个范围存储为字典值,而不是修订文本。哇,这看起来很棒,我还没有尝试过,但一定会尝试,并在我尝试过后给您提供评论!您好,我设法使您的代码与我的文件它的伟大和工作非常快!可以复制最新文档行的整行(最多像第五列)吗?您好,很高兴这种方法对您有所帮助。我不确定我是否理解这个问题。但是,如果您希望复制整行,可以将一个范围存储为字典值,而不是修订文本。感谢您的回答,我将在稍后尝试使用宏时使用它来参考实际的最新文档列表。感谢您的回答,当我稍后尝试使用宏时,我将使用它来参考实际的最新文档列表。