Arrays 匹配并反映最新时间

Arrays 匹配并反映最新时间,arrays,excel,vba,Arrays,Excel,Vba,我能做到这一点 我们有两个工作表,(用户1)和(用户2) 每个工作表有3列,[A]系统ID、[B]用户注释和[C]上次修改时间 1-逻辑匹配两张表中的[A]列,如果匹配,则_ 2-检查[C]列、列(a)中的上次修改时间。偏移量(0,2)。值然后_ 3-最长或最晚的时间获胜,在[B]列、列(a)中获得评论。偏移量(0,1)。值_ 4-在[B]列的其他用户工作表注释中覆盖 我需要这样做 为了性能起见,将(用于每个-loop)转换为数组。 实际范围比本例中的范围大得多 转换为数组的代码: Sub Ge

我能做到这一点

我们有两个工作表,(用户1)和(用户2)

每个工作表有3列,[A]系统ID、[B]用户注释和[C]上次修改时间

1-逻辑匹配两张表中的[A]列,如果匹配,则_

2-检查[C]列、
列(a)中的上次修改时间。偏移量(0,2)。值
然后_

3-最长或最晚的时间获胜,在[B]列、
列(a)中获得评论。偏移量(0,1)。值
_

4-在[B]列的其他用户工作表注释中覆盖

我需要这样做
为了性能起见,将(
用于每个
-loop)转换为数组。
实际范围比本例中的范围大得多

转换为数组的代码:

Sub Get_LastModified_Here()
'指定两个工作表
将位置1设置为工作簿
Set Location1=get工作簿(“C:\Users\HP\Desktop\User\u 1.xlsb”)
Dim位置2作为工作簿
Set Location2=get工作簿(“C:\Users\HP\Desktop\User\u 2.xlsb”)
'设置用户_2工作表
调暗SourceCell,SourceRange作为范围
'这是主键(系统id)
设置SourceRange=工作簿(“用户_2.xlsb”).工作表(“数据”).范围(“A2:”和“A4”)
'启动循环
对于SourceRange中的每个SourceCell,对于user_2工作表中system_id列中的每个单元格
Dim X As String'获取每个单元格地址以供以后使用

X=SourceCell.Address '设置用户1工作表(此工作表) 将目标单元格变暗为Excel.Range Set TargetCell=工作簿(“用户_1.xlsb”)。工作表(“数据”)。范围(X) '如果两个工作表中的A列匹配(系统\u唯一\u ID) 如果SourceCell=TargetCell,则 '如果列(C)中的用户2(源)修改日期是(晚于>)列(C)中的用户1(目标)修改日期,则列(b)中的用户1注释将被列(b)中的用户2注释覆盖 如果SourceCell.Offset(0,2).Value>TargetCell.Offset(0,2).Value,则 TargetCell.Offset(0,1).Value=SourceCell.Offset(0,1).Value '否则,如果用户1上次修改,则他/她的评论将获胜并覆盖用户2的评论 ElseIf SourceCell.Offset(0,2).Value
功能模块/不相关

公共函数get工作簿(ByVal sFullName作为字符串)作为工作簿
将文件设置为字符串
以工作簿的形式返回
sFile=Dir(sFullName)
出错时继续下一步
设置wbReturn=工作簿(sFile)
如果返回值为零,那么
设置wbReturn=Workbooks.Open(sFullName)
如果结束
错误转到0
Set get工作簿=wbturn
端函数
试试看

Sub Get_LastModified_Here()
'指定两个工作表
将位置1设置为工作簿
Set Location1=get工作簿(“C:\Users\HP\Desktop\User\u 1.xlsb”)
Dim位置2作为工作簿
Set Location2=get工作簿(“C:\Users\HP\Desktop\User\u 2.xlsb”)
'设置用户_2工作表
调暗SourceCell作为范围,SourceRange作为范围
变光目标As范围
作为一根弦
Dim vSource作为变量,vTarget作为变量
我想我会坚持多久
'这是主键(系统id)
设置SourceRange=工作簿(“用户_2.xlsb”).工作表(“数据”).范围(“A2:”和“A4”)
'范围扩大了两列。
使用SourceRange
设置SourceRange=.Resize(.Rows.Count、.Columns.Count+2)
以
strAdr=SourceRange.Address
设置rngTarget=工作簿(“用户_1.xlsb”)。工作表(“数据”)。范围(strAdr)
'将范围设置为二维数组。
vSource=SourceRange
vTarget=rngTarget
'启动循环
“针对SourceRange中的每个SourceCell”针对用户\u 2工作表中system\u id列中的每个单元格
对于i=1到UBound(vSource,1)
“Dim X As String”获取每个单元格地址以供以后使用

'X=SourceCell.Address '设置用户1工作表(此工作表) '将目标单元格设置为Excel.Range 'Set TargetCell=工作簿(“用户_1.xlsb”)。工作表(“数据”)。范围(X) '如果两个工作表中的A列匹配(系统\u唯一\u ID) '如果SourceCell=TargetCell,则 如果vSource(i,1)=vTarget(i,1),则 '如果列(C)中的用户2(源)修改日期是(晚于>)列(C)中的用户1(目标)修改日期,则列(b)中的用户1注释将被列(b)中的用户2注释覆盖 '如果SourceCell.Offset(0,2).Value>TargetCell.Offset(0,2).Value,则 如果vSource(i,3)>vTarget(i,3),那么 'TargetCell.Offset(0,1).Value=SourceCell.Offset(0,1).Value vTarget(i,2)=vSource(i,2) '否则,如果用户1上次修改,则他/她的评论将获胜并覆盖用户2的评论 'ElseIf SourceCell.Offset(0,2).Value
工作表(“数据”)中的x是多少?范围(x)
?对不起,你是什么意思?(x) 根据源工作表
Set TargetCell=Workbooks(“User_1.xlsb”)。工作表(“Data”)。范围(x)
x的值是多少?x=SourceCell。地址有关于此安排的重要信息。非常感谢您给我一些时间并分享您的经验。我真的很感激,非常感谢祝你好运:D@Zatary,我很高兴这有帮助
Sub Get_LastModified_Here()

    ' Specify Both Worksheets
    Dim Location1 As Workbook
    Set Location1 = GetWorkbook("C:\Users\HP\Desktop\User_1.xlsb")

    Dim Location2 As Workbook
    Set Location2 = GetWorkbook("C:\Users\HP\Desktop\User_2.xlsb")

    ' Set User_2 Worksheet
    Dim SourceCell As Range, SourceRange As Range
    Dim rngTarget As Range
    Dim strAdr As String
    Dim vSource As Variant, vTarget As Variant
    Dim i As Long
    ' This is the primary key (system_id)
    Set SourceRange = Workbooks("User_2.xlsb").Sheets("Data").Range("A2:" & "A4")
    
    'The range is expanded by two columns.
    With SourceRange
        Set SourceRange = .Resize(.Rows.Count, .Columns.Count + 2)
    End With
    
    strAdr = SourceRange.Address
    Set rngTarget = Workbooks("User_1.xlsb").Worksheets("Data").Range(strAdr)
    
    'Bring the range as a two-dimensional array.
    vSource = SourceRange
    vTarget = rngTarget
    
    ' Start Loop
   'For Each SourceCell In SourceRange ' for each cell in system_id column in user_2 worksheet
    For i = 1 To UBound(vSource, 1)
        'Dim X As String ' get each cell address for later usage
        'X = SourceCell.Address

    
        ' Set User_1 Worksheet  (this worksheet)
        'Dim TargetCell As Excel.Range
       ' Set TargetCell = Workbooks("User_1.xlsb").Worksheets("Data").Range(X)

        ' If column A in both sheets match (System_Unique_ID)
        'If SourceCell = TargetCell Then
         If vSource(i, 1) = vTarget(i, 1) Then
            ' If user 2 (source) modified date in col (C) is (later than >) user1 (target) modified date in col (C) then user 1 comment in col (b) is overwritten by user 2 comment in col (b)
            'If SourceCell.Offset(0, 2).Value > TargetCell.Offset(0, 2).Value Then
             If vSource(i, 3) > vTarget(i, 3) Then
                    'TargetCell.Offset(0, 1).Value = SourceCell.Offset(0, 1).Value
                    vTarget(i, 2) = vSource(i, 2)
            'Else if user 1 modified last then his/her comment wins and overwrite user 2 comment
            'ElseIf SourceCell.Offset(0, 2).Value < TargetCell.Offset(0, 2).Value Then
            ElseIf vSource(i, 3) < vTarget(i, 3) Then
                'SourceCell.Offset(0, 1).Value = TargetCell.Offset(0, 1).Value
                vSource(i, 2) = vTarget(i, 2)
            End If
        End If
    'Next SourceCell
    Next i
    
    'Assign the values of the array to the range.
    SourceRange = vSource
    rngTarget = vTarget
End Sub