Arrays 匹配并反映最新时间
我能做到这一点 我们有两个工作表,(用户1)和(用户2) 每个工作表有3列,[A]系统ID、[B]用户注释和[C]上次修改时间 1-逻辑匹配两张表中的[A]列,如果匹配,则_ 2-检查[C]列、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
列(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