【问题标题】:How can I copy a range of cells based on a Header to paste to another worksheet and match the headers?如何根据标题复制一系列单元格以粘贴到另一个工作表并匹配标题?
【发布时间】:2017-10-09 15:57:32
【问题描述】:

我需要一个代码来根据匹配的标题将源工作表 (Acct Total) 中的一系列单元格 (H21:H38) 复制到目标工作表 (COS% Tracking) 上的相应列。但我遇到的问题是标题位于源工作表 (Acct Total) 上的单元格 A6 中。我研究了一下,发现这段代码对其他人有用:

Sub CopyHeaders()
    Dim header As Range, headers As Range
    Set headers = Worksheets("ws1").Range("A1:Z1")

    For Each header In headers
        If GetHeaderColumn(header.Value) > 0 Then
            Range(header.Offset(1, 0), header.End(xlDown)).Copy Destination:=Worksheets("ws2").Cells(2, GetHeaderColumn(header.Value))
        End If
    Next
End Sub

Function GetHeaderColumn(header As String) As Integer
    Dim headers As Range
    Set headers = Worksheets("ws2").Range("A1:Z1")
    GetHeaderColumn = IIf(IsNumeric(Application.Match(header, headers, 0)), Application.Match(header, headers, 0), 0)
End Function

所以我的问题是我不知道从哪里开始编辑此代码以按我的需要工作。此代码通过使用单元格范围上方的标题来工作,但在我的情况下不会这样做。我会附上图片,希望我不会太含糊。

有人可以根据我的需要帮助我编辑此代码吗?

编辑:日期来源的附加图片。 GL Code Tab

【问题讨论】:

  • ` 基于匹配的标题`实际上并没有说明您要复制到哪一列。 ....另外,请将所有代码缩进 4 个空格
  • 这些工作表是否在同一个工作簿中,标题是否基于匹配日期匹配,这些是否格式化为日期?另外,源范围总是 H21:H38 吗?
  • 您是否考虑改用公式?
  • @AntiDrondert 是的,我有,但我需要它是万无一失的(是的,我知道我使用了错误的“完整”)。目标是将此代码添加到现有的宏“开始新期间”,以便在按下该按钮的那一周开始时,信息将被复制到跟踪选项卡并在那里保持一整年。恐怕有人会将单元格 A6 中的周期周更改为错误的周,并搞砸跟踪选项卡。是的,我意识到如果在执行宏之前日期不正确,宏也会发生这种情况。但我祈祷这不会发生。谢谢。

标签: vba excel


【解决方案1】:

请查看以下构造作为解决同一问题的不同方法的起点。有描述性变量,因此您可以了解正在发生的事情。

编辑:由于目标工作表第 3 行被锁定,代码已被修改为使用匹配函数返回找到字符串的列号(如果找到)。

基本上:

设置您的源和目标工作表。

Set sourceWorksheet = wb.Sheets("Acct Total")
Set targetWorksheet = wb.Sheets("COS% Tracking")

定义您的目标值(您尝试匹配的日期)和来源范围

targetDate = Trim$(sourceWorksheet.Range("A6"))
Set sourceRange = sourceWorksheet.Range("H21:H38")

查找目标工作表中值 (targetDate) 所在的列号

colNum = Application.WorksheetFunction.Match(targetDate, searchRange, 0)

添加错误处理以防它不存在,即如果找不到日期(作为字符串)......

ErrHand: 'code in this section.....

设置目标数据的粘贴地址

Set targetRange = .Range(Cells(4, colNum), Cells(21, colNum))

将目标范围设置为等于源范围。

targetRange.Value = sourceRange.Value

酌情调整。

将它们放在一起,您会得到以下内容:

Option Explicit

Public Sub copydata()

    Dim sourceRange As Range
    Dim targetDate As String
    Dim targetRange As Range
    Dim wb As Workbook
    Dim sourceWorksheet As Worksheet
    Dim targetWorksheet As Worksheet
    Dim searchRange As Range

    Set wb = ThisWorkbook
    Set sourceWorksheet = wb.Sheets("Acct Total")
    Set targetWorksheet = wb.Sheets("COS% Tracking")
    targetDate = Trim$(sourceWorksheet.Range("A6"))
    Set sourceRange = sourceWorksheet.Range("H21:H38")
    Set searchRange = targetWorksheet.Rows(3)

    On Error GoTo ErrHand

    Dim colNum As Long    
    colNum = Application.WorksheetFunction.Match(targetDate, searchRange, 0)

    With targetWorksheet
        Set targetRange = .Range(Cells(4, colNum), Cells(21, colNum))
        targetRange.Value = sourceRange.Value
    End With

ErrHand:

    If Err = 1004 Then
        MsgBox "Not found: " & targetDate
        Err.Clear
        Exit Sub
    End If

End Sub

请参阅以下内容:

Finding address of text in worksheet

Moving data between sheets

【讨论】:

  • 评论不适用于扩展讨论或调试会话;这个对话是moved to chat。应酌情将附加信息编辑到问题或答案中。
猜你喜欢
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多