Excel 如果列标题不匹配(但使用单独工作表中标题的映射),则在工作表之间复制/粘贴值

Excel 如果列标题不匹配(但使用单独工作表中标题的映射),则在工作表之间复制/粘贴值,excel,vba,Excel,Vba,我有一个包含映射表的输入,用于匹配不同的标题 例: 我还有两张表,分别是源表和目标表。 -源工作表的header2值作为第2列中的标题(例如:sam.value、John.value等) -目标图纸标题的header1值作为第1列中的标题(例如:sam_name、John_name等) 我需要通过从映射表映射正确的标题,将值从源表标题复制粘贴到第2列下的目标表 下面是我编写的代码 Set sc=thiswook.Sheets(“conf_sheet”)包含源工作表和目标工作表的标题映射 Set

我有一个包含映射表的输入,用于匹配不同的标题
例:

我还有两张表,分别是源表和目标表。
-源工作表的header2值作为第2列中的标题(例如:sam.value、John.value等)
-目标图纸标题的header1值作为第1列中的标题(例如:sam_name、John_name等)

我需要通过从映射表映射正确的标题,将值从源表标题复制粘贴到第2列下的目标表

下面是我编写的代码

Set sc=thiswook.Sheets(“conf_sheet”)包含源工作表和目标工作表的标题映射
Set ws1=ThisWorkbook.Sheets(“源工作表”)
设置scrsh=ThisWorkbook.工作表(“目标工作表”)
wrow=ws1.UsedRange.Rows.Count
wcol=ws1.UsedRange.Columns.Count
srow=sc.UsedRange.Rows.Count
scol=sc.UsedRange.Columns.Count
计数器=0
cnt=0
对于i=2至srow
对于j=1至wcol
如果InStr(1,UCase(ws1.Cells(sc.Cells(i,4.Value,j.Value)),UCase(sc.Cells(i,1.Value),vbTextCompare)>0,则
范围(scrsh.Cells(2,计数器+1),scrsh.Cells(wrow,计数器+1))。值=范围(ws1.Cells(3,j),ws1.Cells(wrow,j))。值
计数器=计数器+1
如果结束
如果结束
cnt=cnt+1
下一个j
接下来我

请验证我是否正确理解这一点

  • 您有一个目标工作表(目标)和一个源工作表(源)

  • 您的注意力集中在目标工作表的
    单元格(i,1)
    中的标签上

  • 您希望将所有源工作表
    单元格(j,1)
    与目标工作表
    单元格(i,1)

  • 如果有匹配项,则将
    单元格(j,2)
    中的源数据附加到
    行(i)


基于这些理解,我将对您的代码做一些更改/建议:

  • 更改图纸名称引用以代表正在发生的事情(例如,srow中的“s”等,使我认为这是源图纸)

  • UsedRange
    可能不可靠,因此请根据始终包含数据的某些行/列查找最后一行/最后一列

  • 缩进代码,使其更具可读性


下面是我模拟一些代码的镜头,以反映上述理解(由于对“conf_sheet”缺乏理解而未进行测试):


由于其他注释,wwasn不容易输入一件事:当您限定范围时,限定所有方面。您有
Range(ws.Cells(…)
,但应该始终是
ws.Range(ws.Cells(…)
,才能完全符合条件。如果您没有完全符合条件,则无论出现
范围
的地方,都将使用活动工作表,这可能会导致错误。

请验证我是否正确理解了这一点

  • 您有一个目标工作表(目标)和一个源工作表(源)

  • 您的注意力集中在目标工作表的
    单元格(i,1)
    中的标签上

  • 您希望将所有源工作表
    单元格(j,1)
    与目标工作表
    单元格(i,1)

  • 如果有匹配项,则将
    单元格(j,2)
    中的源数据附加到
    行(i)


基于这些理解,我将对您的代码做一些更改/建议:

  • 更改图纸名称引用以代表正在发生的事情(例如,srow中的“s”等,使我认为这是源图纸)

  • UsedRange
    可能不可靠,因此请根据始终包含数据的某些行/列查找最后一行/最后一列

  • 缩进代码,使其更具可读性


下面是我模拟一些代码的镜头,以反映上述理解(由于对“conf_sheet”缺乏理解而未进行测试):


由于其他注释,wwasn不容易输入一件事:当您限定范围时,限定所有方面。您有
Range(ws.Cells(…)
,但应该始终是
ws.Range(ws.Cells(…)
,才能完全符合条件。如果您没有完全符合条件,则无论在哪里显示
范围
都会占用活动工作表,这可能会导致错误。

为了支持此宏,您做了哪些工作?请提供您生成的任何代码(工作或不工作),以便我们可以帮助修复错误和问题。如果需要入门帮助,请在Excel的“开发人员”功能区中尝试使用宏录制器。为了进一步的研究,除了常规的
之外,还可以查看
循环
。复制
粘贴
如果不是
Destination.Value=Source.Value
。嗨,西里尔,我已经重新分享了我上面的代码,如果你能帮我处理循环部分,那就太好了
表单(“conf\u表单”)中有哪些类型的值
?只是数字?你做了什么来支持这个宏?请提供您生成的任何代码(工作或不工作),以便我们可以帮助修复错误和问题。如果需要入门帮助,请在Excel的“开发人员”功能区中尝试使用宏录制器。为了进一步的研究,除了常规的
之外,还可以查看
循环
。复制
粘贴
如果不是
Destination.Value=Source.Value
。嗨,西里尔,我已经重新分享了我上面的代码,如果你能帮我处理循环部分,那就太好了
表单(“conf\u表单”)中有哪些类型的值
?只是数字?嗨,西里尔,非常感谢你的帮助。你上面的代码非常有用。我有一个想法来完成我的宏。再次感谢您的时间:)@sharathkumar如果这回答了您的问题,请标记为已回答,这样就不会在“开放式问题”中显示需要注意的内容
    Mapping Sheet
     +------+------------+------+
    |header 1  |    header 2    |
     +------+------------+------+
    |sam_name  |    sam.value   |
    |John_name |    John.value  | 
    |Car_name  |  Car.value     |
     +------+------------+------+
Option Explicit

Sub test()
    Dim Conf As Worksheet, srcWS As Worksheet, dstWS As Worksheet
    Dim srcRowCt As Long, srcColCt As Long, dstRowCt As Long, dstColCt As Long
    Dim dstLastCol As Long, ValCheck As String
    Set Conf = ThisWorkbook.Sheets("conf_sheet") 'Contains Mapping of headers of source and Target sheet
    Set srcWS = ThisWorkbook.Sheets("Source_sheet")
    Set dstWS = ThisWorkbook.Worksheets("Target_sheet")
    srcRowCt = srcWS.UsedRange.Rows.Count
    srcColCt = srcWS.UsedRange.Columns.Count
    ConfRowCt = Conf.UsedRange.Rows.Count
    ConfColCt = Conf.UsedRange.Columns.Count
    'removed "counter": you're pasting one beyond the last column, so can just find that
    'removed "cnt": this didn't appear to be used at all
    With srcWS
        For i = 2 To ConfRowCt
            ValCheck = UCase(dstWS.Cells(i, 1).Value) 'Makes this check one time outside the other loop so you speed things up
            For j = 1 To srcColCt
                If InStr(1, UCase(.Cells(Conf.Cells(i, 4).Value, j).Value), ValCheck, vbTextCompare) Then
                    dstLastCol = dstWS.Cells(j, dstWS.Columns.Count).End(xlToLeft).Column   'determins last column dynamically; could also just move the "counter" you previously had up here, so you don't need +1 in your other formula
                    dstWS.Cells(1, dstLastCol + 1).Value = ValCheck 'Added in a header to column so the dstLastCol will have somethign to work with AND so you remember what was checked
                    dstWS.Range(dstWS.Cells(2, dstLastCol + 1), dstWS.Cells(wrow, dstLastCol + 1)).Value = .Range(.Cells(2, j), .Cells(srcRowCt, j)).Value 'changed source range to equal the dest range (2:srcRowCt), you had (3:srcRowCt) for source
                End If
            Next j
        Next i
    End With
End Sub