我在Excell中有五个电子表格(技术上在LibreOffice Calc 中),我们称之为A
,B
,C
,D
& ; E
。
一张工作表A
包含列标题submission #
,member #
,member name
,comment
,date
和& time
。
B
包含列标题review #
,field #
和& score
。
C
有review #
,field #
和& text
。
D
有#
,member #
,member name
,review from #
,number
,text
,scores
,reviewer first name
,reviewer last name
,reviewer email
,reviewer person #
,date
,time
,& attachment
。
E
有field #
,field header
,value
和& explanation
我想尝试同步这些不同的工作表,因为A
,D
通常共享member #
,D
& B
分享score
,B
& E
分享field #
,同样E
& C
分享字段编号。
最有效的方法是什么?
可以在Calc中完成吗?也许使用一些VBA-esque语法。
答案 0 :(得分:0)
这是您需要的excel VBA。
USAGE
在工作表A上放置工作表D的列。例如,让我们处理列review from #
。将该公式放在单元格中:=LookupCSVResults($B2,SheetD!$B$2:$B$xx,SheetD!D$2:D$xx,)
您应该能够正确地复制该公式并获得所有值。 sheetD
中具有相同member #
的所有值都在一个单元格中连接,并带有新的行分隔符。
如果您想要其他分隔符,请修改VBA代码并按您选择的字符代码更改Chr(10)
。
我相信这种格式可以在以后更轻松地重用数据。
`
Function LookupCSVResults(lookupValue As Variant, lookupRange As Range, resultsRange As Range) As String
Dim s As String 'Results placeholder
Dim sTmp As String 'Cell value placeholder
Dim r As Long 'Row
Dim c As Long 'Column
Const strDelimiter = "|||" 'Makes InStr more robust
s = strDelimiter
For r = 1 To lookupRange.Rows.Count
For c = 1 To lookupRange.Columns.Count
If lookupRange.Cells(r, c).Value = lookupValue Then
'I know it's weird to use offset but it works even if the two ranges
'are of different sizes and it's the same way that SUMIF works
sTmp = resultsRange.Offset(r - 1, c - 1).Cells(1, 1).Value
If InStr(1, s, strDelimiter & sTmp & strDelimiter) = 0 Then
s = s & sTmp & strDelimiter
End If
End If
Next
Next
s = Replace(s, strDelimiter, Chr(10))
LookupCSVResults = s 'Return the function
End Function