【问题标题】:Dynamic source / adjust array reference according to last col动态源/根据最后一列调整数组引用
【发布时间】:2021-09-08 08:26:36
【问题描述】:

我将一个 ID 与两个数据透视表进行比较,然后从每个数据透视表的特定列中返回匹配的值。

以前,数据透视表的列数是固定的,但现在我面临的数据透视表在最后一列方面有所不同。

我的尝试是使用代码行

   LastColContract = wsContractPivot.Cells(1, Columns.Count).End(xlToLeft).Column

为了在ContractPivot中找到最后一列然后换行

rwReport.Columns("G").Resize(1, 7).Value = _

rwReport.Columns("G").Resize(1, lastColContract).Value = _

但我正在努力告诉 Excel 然后扩展数组列以在 H 之后添加其他列。

所以如果 lastcol 是 10,那么我需要代码来开始列出从 B 列开始的 10 列。 如果 lastcol 为 12,则 B 等为 12 列。

    For Each c In wsReport.Range("F3", wsReport.Cells(Rows.Count, "F").End(xlUp)).Cells
    
    c.Offset(0, 1).Resize(1, 50).ClearContents
    
    MfrName = c.Value 'read this once....
    Set rwReport = c.EntireRow
    
    '1st Database Match "ContractSpend"
    m = Application.Match(MfrName, wsContractPivot.Columns("A"), 0)
    If Not IsError(m) Then
       With wsContractPivot.Rows(m)
        
        'starting column
                rwReport.Columns("G").Resize(1, 7).Value = _
               Array(.Columns("B").Value, .Columns("C").Value, _
                     .Columns("D").Value, .Columns("E").Value, _
                     .Columns("F").Value, .Columns("G").Value, .Columns("H").Value)
            'Extended Cost
            
        End With
    Else
        'no match...
    End If

【问题讨论】:

  • 我从这里开始 - peltiertech.com/referencing-pivot-table-ranges-in-vba 这应该可以帮助您在代码中引用相关范围
  • 谢谢,但我无法在动态而非静态的情况下调整数组引用。
  • 如果 lastcol 是 10,那么我需要代码来开始列出从 B 列开始的 10 列。如果 lastcol 是 12,那么从 B 开始的 12 列你的意思是 11 和13?这听起来像lastcol+1
  • 不完全是。当最后一个列是 7 时,我需要数组引用列 B、C、D、E、F、G、H。如果最后一个列是 10,我需要排列参考列 B、C、D、E、F、G、H、I、J、K。我找不到告诉代码相应地调整列的解决方案。
  • Worksheet.Columns property 承认数字...这不可行吗?还是循环?

标签: excel vba dynamic pivot-table


【解决方案1】:

试试这样的:

'...
'...
Set pt = wsContractPivot.PivotTables(1)    'or use specific name

'https://peltiertech.com/referencing-pivot-table-ranges-in-vba/
numCols = pt.TableRange1.Columns.Count - 1 'PT width-1

For Each c In wsReport.Range("F3", wsReport.Cells(Rows.Count, "F").End(xlUp)).Cells
    
    c.Offset(0, 1).Resize(1, 50).ClearContents
    
    MfrName = c.Value 'read this once....
    Set rwReport = c.EntireRow
    
    m = Application.Match(MfrName, wsContractPivot.Columns("A"), 0)
    
    If Not IsError(m) Then
       
       rwReport.Columns("G").Resize(1, numCols).Value = _
           wsContractPivot.Cells(m, "B").Resize(1, numCols).Value
       
    End If
Next c
'...
'...

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 2021-11-21
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2015-08-11
    相关资源
    最近更新 更多