【问题标题】:mapping column headers from one sheet to another将列标题从一张表映射到另一张表
【发布时间】:2016-04-28 16:25:46
【问题描述】:

我想将列从一个工作表映射到另一个工作表,这是我尝试过的代码:

Dim x As Integer
x = 2
Do Until Sheets("Sheet1").Range("A" & x).Value = ""
Sheets("Sheet2").Range("C" & x).Value = Sheets("Sheet1").Range("A" & x).Value
x = x + 1
Loop
x = 2
Do Until Sheets("Sheet1").Range("B" & x).Value = ""
Sheets("Sheet2").Range("A" & x).Value = Sheets("Sheet1").Range("B" & x).Value
x = x + 1
Loop
x = 2
Do Until Sheets("Sheet1").Range("C" & x).Value = ""
Sheets("Sheet2").Range("B" & x).Value = Sheets("Sheet1").Range("C" & x).Value
x = x + 1
Loop

在 worksheet1 中我有:

  A                 B            C 
1 applicationname applicationid number 
2 applcation1          1          123 
3 applcation2          2          454 
4 applcation3          3          897

在 worksheet2 中我得到:

  A                 B            C 
1  appid           num        appname              
2   1              123        applcation1          
3   2              454        applcation2          
4   3              897        applcation3 

问题是还有很多其他列,这段代码似乎很长..我需要循环以便 applicationid 映射到 appid 等等..我想知道是否有一种方法可以根据标题(第一行中的数据),如果我也想复制空单元格,谁能告诉我该怎么做? 我可以知道我是否可以有一个像界面说 sheet3 这样的工作表,我可以在其中填写所需的映射,如

     A                       B
 1   Application Name        App Name
 2   Application ID          AppID
 3   Technology              Tech
 4   Business Criticality    Bus Criticality
 5   IT Owner                IT Owner
 6   Business Owner    BusOwner                                                            and accordingly map them?thanks in advance

【问题讨论】:

  • 在下面查看我的答案。我所给出的可能是矫枉过正,真的,但它实际上很简单。你不需要在这里复制,只是一个价值引用。这更快,更不容易出错。 :)

标签: excel vba


【解决方案1】:

试试这个:

Sub Map()

    Dim Sh1 As Worksheet, Sh2 As Worksheet
    Dim HeadersOne() As String
    Dim HeadersTwo() As String

    With ThisWorkbook
        Set Sh1 = .Sheets("Sheet1") 'Modify as necessary.
        Set Sh2 = .Sheets("Sheet2") 'Modify as necessary.
    End With

    HeadersOne() = Split("applicationname,applicationid,number", ",")
    HeadersTwo() = Split("appname,appid,num", ",")

    For HeaderIter = 1 To 3
        SCol = GetColMatched(Sh1, HeadersOne(HeaderIter - 1))
        TCol = GetColMatched(Sh2, HeadersTwo(HeaderIter - 1))
        LRow = GetLastRowMatched(Sh1, HeadersOne(HeaderIter - 1))

        For Iter = 2 To LRow
            Sh2.Cells(Iter, TCol).Value = Sh1.Cells(Iter, SCol).Value
        Next Iter
    Next HeaderIter

End Sub

Function GetLastRowMatched(Sh As Worksheet, Header As String) As Long
    ColIndex = Application.Match(Header, Sh.Rows(1), 0)
    GetLastRowMatched = Sh.Cells(Rows.Count, ColIndex).End(xlUp).Row
End Function

Function GetColMatched(Sh As Worksheet, Header As String) As Long
    ColIndex = Application.Match(Header, Sh.Rows(1), 0)
    GetColMatched = ColIndex
End Function

如果这有帮助,请告诉我们。

后续编辑:

这是一种设置界面的方法。

假设您的设置与我的相似...

表 1:

Sheet2(我故意弄乱了标题):

界面表:

运行代码后的结果:

这是代码。 进行相应修改并确保您的标题准确无误。

Sub ModdedMap()

    Dim Sh1 As Worksheet, Sh2 As Worksheet, Sh3 As Worksheet
    Dim HeadersOne As Range, HeadersTwo As Range
    Dim hCell As Range

    With ThisWorkbook
        Set Sh1 = .Sheets("Sheet1") 'Modify as necessary.
        Set Sh2 = .Sheets("Sheet2") 'Modify as necessary.
        Set Sh3 = .Sheets("Interface") 'Modify as necessary.
    End With

    Set HeadersOne = Sh3.Range("A1:A" & Sh3.Range("A" & Rows.Count).End(xlUp).Row)

    Application.ScreenUpdating = False

    For Each hCell In HeadersOne

        SCol = GetColMatched(Sh1, hCell.Value)
        TCol = GetColMatched(Sh2, hCell.Offset(0, 1).Value)
        LRow = GetLastRowMatched(Sh1, hCell.Value)

        For Iter = 2 To LRow
            Sh2.Cells(Iter, TCol).Value = Sh1.Cells(Iter, SCol).Value
        Next Iter

    Next hCell

    Application.ScreenUpdating = True

End Sub

Function GetLastRowMatched(Sh As Worksheet, Header As String) As Long
    ColIndex = Application.Match(Header, Sh.Rows(1), 0)
    GetLastRowMatched = Sh.Cells(Rows.Count, ColIndex).End(xlUp).Row
End Function

Function GetColMatched(Sh As Worksheet, Header As String) As Long
    ColIndex = Application.Match(Header, Sh.Rows(1), 0)
    GetColMatched = ColIndex
End Function

【讨论】:

  • 感谢 BK201 的回复...我尝试运行此宏,但出现运行时错误,提示“类型不匹配”并且“GetColMatched =ColIndex”行正在突出显示...请让我知道如何解决它
  • @user3172566: Function GetColMatched -- 在这里?或者GetColMatched = ColIndex——在这里?
  • 不过,我必须说,这不会对我产生任何错误,无论是复制还是以其他方式。你能检查一下你的标题和我的一样吗?我仅基于您上面的标题。 :)
  • 非常感谢......它工作得很好......我可以知道我是否可以有一个像界面说 sheet3 这样的工作表,我可以在其中填写所需的映射,如应用程序名称应用程序名称应用程序 ID AppID 技术技术业务关键性总线 关键性 IT 所有者 IT 所有者 业务所有者 总线所有者并相应地映射它们?
  • @user3172566:感谢您的接受。回复:您的查询——当然可以!这是对上述代码的简单操作。我很快就会发布一个变化。 :)
【解决方案2】:

在这种情况下,无需一次复制一个单元格。不是出于任何性能原因(除非您拥有大量数据,否则您可能不会遇到任何性能问题) - 只是如果您在每列一次操作中将列直接从 Sheet1 复制到 Sheet2,代码会更简单。

第一步是确定 Sheet1 中要复制的总行数。关于如何在 Excel 中获取已使用的行数有很多观点,但最简单的可能是在工作表上使用表达式 UsedRange.Rows.Count(我们减去 1,因为我们没有复制标题行):

Dim row_count As Long

row_count = Sheets("Sheet1").UsedRange.Rows.Count - 1
Range("Sheet1!A2").Resize(row_count).Copy Range("Sheet2!C2")
Range("Sheet1!B2").Resize(row_count).Copy Range("Sheet2!A2")
Range("Sheet1!C2").Resize(row_count).Copy Range("Sheet2!B2")

我会很满意这样做,每列要复制一行。仍然有重复的代码,但我认为它是可以管理的。

【讨论】:

  • 非常感谢Tmdean的回复...但我需要根据列标题(第一行中的数据)进行映射,因为列的顺序可能会改变..再次感谢您跨度>
猜你喜欢
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多