【问题标题】:Conditional Data Extraction using dynamic range使用动态范围进行条件数据提取
【发布时间】:2021-06-07 07:06:44
【问题描述】:

我必须根据单元格名称与工作表名称匹配从多个列中复制数据范围。但是,在某些匹配的工作表名称的情况下,我们有 30 个数据,在某些情况下,我们可能有 20 个数据或任何其他值,“A”列中每个 ID 的数据范围是不同的。我当前的代码使我能够从“组合”工作表中提取数据到具有匹配工作表名称的模板工作表。我如何使代码动态并根据 A 列中更改的工作表名称提取数据,而不是使用匹配范围的偏移量提取 30 个数据(每个钻孔名称之后有一些空白单元格,直到“A”列中的下一个名称需要考虑用于开发 VBA 代码)并从 M 和 S 列复制与该名称对应的数据,并根据匹配的工作表名称粘贴到 E 和 G 列的模板工作表中。目前我只能从一列中提取数据,代码需要动态更新:

Sub SPT()
Dim wkSht As Worksheet
Dim cell As Range

For Each cell In Sheets("Combine").Range("A5:A116").Cells

    For Each wkSht In ThisWorkbook.Worksheets
    
        If cell.Value = wkSht.Name Then
       
            Sheets("Combine").Range(cell.Offset(0, 12), cell.Offset(29, 12)).Copy wkSht.Range("G22")
        End If
    
    Next wkSht

Next cell
End Sub

【问题讨论】:

  • 所以如果总是从main sheet 复制12 行,copy paste 的问题是什么?因为即使包含空白值,复制同一行也不会有任何问题。
  • 行复制选项必须相对于带有工作表名称的单元格 A 值是动态的。特定偏移量处的相应列也必须根据范围内的工作表名称匹配复制到不同的工作表中,现在我想从多列而不是一列复制数据。

标签: excel vba


【解决方案1】:

复制粘贴过程会根​​据Col H中的单元格值偏移,请测试运行,谢谢:

Sub SPT()
Dim wkSht As Worksheet
Dim cell As Range
Dim lastrow As Long, blankRow As Long, offsetRow As Long

lastrow = Sheets("Combine").UsedRange.Rows.Count

For Each cell In Sheets("Combine").Range("A2", "A" & lastrow).Cells

    For Each wkSht In ThisWorkbook.Worksheets
    
        If cell.Value = wkSht.Name Then
        
            If cell.End(xlDown).Row > lastrow Then
                blankRow = lastrow
            Else
                blankRow = cell.End(xlDown).Row - 1
            End If
            
            offsetRow = Application.WorksheetFunction.RoundDown(Sheet1.Cells(blankRow, 8).Value, 0)
            Sheets("Combine").Range(cell.Offset(0, 12), cell.Offset(offsetRow, 12)).Copy wkSht.Range("G22")
            Sheets("Combine").Range(cell.Offset(0, 18), cell.Offset(offsetRow, 18)).Copy wkSht.Range("E22")
        End If
    
    Next wkSht

Next cell
End Sub

假设您在Col A 中的最后一个工作表名称是第 14 行,下面是空白数据

当你使用键盘快捷键ctrl + down arrow key时,它会跳转到第100万行,因为我知道这种情况会发生但我不想获得row 1mil,因此我将设置blankRow = lastrow(i.e. 20)

【讨论】:

  • 我们必须使其动态并依赖于“A”的单元格值,而不是将偏移行从 0 固定到 29。例如,第一场比赛名称从 A2 开始,第二场比赛名称从 A15 开始,第三场比赛名称从 A26 开始。在这种情况下,对应于 BH1、BH2 和 BH3 工作表名称的偏移行将从 0 到 14、0 到 11 和 0 到 10(最后一个范围值)。如何实现:link
  • 好的,我明白你的意思了,让我试试吧,问题不大。
  • 您可以查看我编辑的答案,应该可以按照您的期望正常工作
  • 它不适用于最后一个匹配项,因为它在数据输入后下方有空单元格。但是,使用范围指的是什么?另外我不明白代码的以下部分: If cell.End(xlDown).Row > lastrow Then blankRow = lastrow Else blankRow = cell.End(xlDown).Row - 1 End If offsetRow = Application.WorksheetFunction.RoundDown (Sheet1.Cells(blankRow, 8).Value, 0)
  • 请花点时间研究一下,所有代码的解释都可以在网上找到...关于你的最后一场比赛,我不知道,你可以手动更改它或计算调整和我想我现在可以结案了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2022-07-04
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 2017-05-19
相关资源
最近更新 更多