如何解决粘贴相邻列的宏
我在Excel中有这两个表:
我需要粘贴第二个表的“文本”和“代码”列,直到第一个表的“货币”列,其中第一个表的“可选名称”列等于“名称”在第二张表中。
最后,它应该显示如下表:
显然我的表更大,所以我试图用Excel vba创建一个宏,该宏会自动比较然后粘贴相应的值,但是由于我对使用excel vba很陌生,所以我并没有取得太大的成功:(
解决方法
通过Match
只是为了展示可能耗时的经典(范围)循环的替代方法,我演示了一种使用两个数据字段数组比较不同工作表中的 name 列的方法。
-
在此示例中,列
Sheet1
中的C
个名称被分配给数组a
,而Sheet2
个名称被分配给数组b
-请参阅0-1
-
两个数组都通过
Application.Match
进行比较,从而生成一个(垂直)索引数组,指示在第二个数据集中搜索的位置-请参见2
部分。 / p> -
最终,数据通过
Application.Index
重新排列(请参见3
部分),并写入任何需要的目标(此处写入Sheet1
的列F:G
,即C
之后的3列;请参见4
部分。
示例呼叫
Option Explicit ' declaration head of code module
Sub ExampleCall()
'0. get identifying name column ranges; here using the sheets' Code(Name)
Dim rngA As Range: Set rngA = getColRange(Sheet1,"C")
Dim rngB As Range: Set rngB = getColRange(Sheet2,"A")
'1. assign values to variant 1-based 2-dimensional arrays
Dim a,b ' declare as variant arrays
a = rngA.Value
b = rngB.Value
'2. get indices where to search in b
a = Application.Match(a,b,0) ' compare name columns
'Debug.Print Join(Application.Transpose(a),"|") ' write search order to immediate window
'3a.get text + code data
b = rngB.Offset(0,1).Resize(Columnsize:=2).Value ' get text/code values starting next column
'3b.reorder b-array based on a-indices
b = Application.Index(b,a,Array(1,2)) ' reorder them based on a-indices
'4. write text + code to target ( col C + 3 cols offset ~> col F)
rngA.Offset(0,3).Resize(UBound(b),2) = b
End Sub
帮助功能
计算给定工作表列的最后一行并返回整个范围。
Function getColRange(mySheet As Worksheet,_
Optional ByVal myColumn As Variant = "A",_
Optional ByVal Startrow As Long = 2) As Range
With mySheet
'a) check if sheet exists
If IsError(Application.Evaluate(mySheet.Name & "!A1")) Then GoTo SHEETERROR
'b) change numeric column no to letter(s)
If IsNumeric(myColumn) Then myColumn = Split((.Columns(myColumn).Address(,0)),":")(0)
'c) get last row in given column
Dim lastRow As Long
lastRow = .Range(myColumn & .Rows.Count).End(xlUp).Row
'd) return data range as function result
' (a Range is an Object and has to be SET!)
Set getColRange = .Range(myColumn & Startrow & ":" & myColumn & lastRow)
End With
Exit Function
SHEETERROR:
MsgBox "Worksheet " & mySheet.Name & vbNewLine & _
"(CodeName " & mySheet.CodeName & ")" & vbNewLine & _
"does not exist!",vbExclamation,"Sheet Error"
Stop
End Function
相关链接
C.f。 Some undocumented pecularities of the Application.Index
function
最后,事实证明不需要VBA。
我实际上已经使用了VLOOKUP函数。
在这里我学会了如何使用此功能:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。