此任务的Excel技巧
我在excel中有一个包含以下行的电子表格:此任务的Excel技巧,excel,spreadsheet,vba,Excel,Spreadsheet,Vba,我在excel中有一个包含以下行的电子表格: COLUMN Value1.Value2.Value3 Value4.Value5.Value6 Value7.Value8.Value9 在另一个电子表格中,我有一个简单的列表,上面有一些名字: COLUMN Name1 Name2 Name3 当然,这个列表是巨大的:) 因此,在末尾需要有以下spreasd表: COLUMN Value1.Name1.Value2.Value3 Va
COLUMN
Value1.Value2.Value3
Value4.Value5.Value6
Value7.Value8.Value9
在另一个电子表格中,我有一个简单的列表,上面有一些名字:
COLUMN
Name1
Name2
Name3
当然,这个列表是巨大的:)
因此,在末尾需要有以下spreasd表:
COLUMN
Value1.Name1.Value2.Value3
Value4.Name1.Value5.Value6
Value7.Name1.Value8.Value9
Value1.Name2.Value2.Value3
Value4.Name2.Value5.Value6
Value7.Name2.Value8.Value9
Value1.Name3.Value2.Value3
Value4.Name4.Value5.Value6
Value7.Name4.Value8.Value9
我必须将列表上的名称与电子表格上的所有值连接起来,并为所有名称复制它们
有没有办法自动完成这个过程?手动过程需要几个小时才能完成,我认为有一种更聪明的方法可以做到这一点,尽管我不知道!)
提前谢谢你的帮助。我想那可能行得通
Const FIRST_TALBE = 4
Const SECOND_TABLE = 2
Sub makeTheJob()
For i = 1 To lastRow
l = Split(Cells(i, FIRST_TABLE), ".")
newvalue = l(0) & "." & Cells(i, SECOND_TABLE) & "." & l(1) & "." & l(2)
Debug.Print newvalue
Next i
End Sub
值之间始终有一个“.”
试试这个代码。对于庞大的名称/值列表,使用数组会快得多:
Sub test()
Dim arrVal As Variant
Dim arrNames As Variant
Dim arrRes As Variant
Dim v, n, k As Long
'change Sheet1 to suit
With ThisWorkbook.Worksheets("Sheet1")
'change A1:A3 to values address
arrVal = .Range("A1:A3")
'change B1:B3 to names address
arrNames = .Range("B1:B3")
ReDim arrRes(1 To UBound(arrVal) * UBound(arrNames), 1 To 1)
k = 1
For Each v In arrVal
For Each n In arrNames
arrRes(k, 1) = Left(v, InStr(1, v, ".")) & n & Mid(v, InStr(1, v, "."))
k = k + 1
Next
Next v
'change "c1" to start cell where to put new values
.Range("C1").Resize(UBound(arrRes, 1)) = arrRes
End With
End Sub
注意:
如果您不知道“值”和“名称”范围的确切地址,请更改此部分
'change A1:A3 to values address
arrVal = .Range("A1:A3")
'change B1:B3 to names address
arrNames = .Range("B1:B3")
到
在这种情况下,“值”和“名称”范围相应地从A1
和B1
开始,并相应地在coumnsA
和B
中的最后一个非空行结束
结果:
使用公式进行测试是一个很好的挑战:) 在D1中使用此数组公式,然后向下复制
=INDEX(LEFT($A$1:$A$4;FIND(".";$A$1:$A$4))&TRANSPOSE($C$1:$C$3)&RIGHT($A$1:$A$4;LEN($A$1:$A$4)-FIND(".";$A$1:$A$4)+1);1+INT((ROWS($D$1:D1)-1)/ROWS($C$1:$C$3));1+MOD(ROWS($D$1:D1)-1;ROWS($C$1:$C$3)))
根据您的区域设置,您可能需要将字段分隔符“;”替换为“,”1)是否需要在
值
列中始终在第一个之后添加NameI
?2) 名称
第3列)中是否有重复项应为VBA解决方案或公式?@simoco 1)是。2) “名称”列中没有重复项。3)应该是VBA解决方案还是公式?Dalek,列值
中的所有值都有效吗?我的意思是它们总是有
?值之间总是有一个“.”。值会发生变化,但它们之间总是有一个“.”。我不知道我是否做错了什么,但它给了我.Range(“C1”).Resize(UBound(arrRes))=WorksheetFunction.Transpose(arrRes)上的错误“Type mismatch”,如下从注释到Q,这段代码假设数组中的所有值arrVal=.Range(“A1:A3”)
具有
。这是真的吗?可能您在“value”范围的地址中包含了列标题?它们有一个“.”。“没有标题。@Dalek,转置函数有一些限制(数组长度限制)。我已经更新了我的答案——现在它应该起作用了,因为有些人对Excel Hero公式挑战这样的挑战避而远之,我仍然必须说,这是一个严肃的赏心悦目的问题+1.抄下来对我不起作用。第一排,一切都很好。有什么特别的配置吗?如果它适用于第一行,那么您可能有一个相对引用,它应该是绝对的或相反的。我又试了一次,成功了。确保引用完全相等。没有特殊的配置。或者给我看看你用的公式。(三思而后行,是否按Ctrl-Shift-Enter键输入公式?这是一个数组公式)
=INDEX(LEFT($A$1:$A$4;FIND(".";$A$1:$A$4))&TRANSPOSE($C$1:$C$3)&RIGHT($A$1:$A$4;LEN($A$1:$A$4)-FIND(".";$A$1:$A$4)+1);1+INT((ROWS($D$1:D1)-1)/ROWS($C$1:$C$3));1+MOD(ROWS($D$1:D1)-1;ROWS($C$1:$C$3)))