Excel - 用实际单元格引用替换偏移公式

时间:2015-05-21 14:16:37

标签: excel excel-vba excel-formula vba

我有一张表从一张非常大的表中提取了数千行数据。表中的一些列从该大表上的每第5行获取数据。为了加快创建单元格引用的过程,我使用OFFSET公式从每第5行抓取一个单元格:

=OFFSET('Large Sheet'!B$2572,(ROW(1:1)-1)*5,,)
=OFFSET('Large Sheet'!B$2572,(ROW(2:2)-1)*5,,)
=OFFSET('Large Sheet'!B$2572,(ROW(3:3)-1)*5,,)
=OFFSET('Large Sheet'!B$2572,(ROW(4:4)-1)*5,,)
=OFFSET('Large Sheet'!B$2572,(ROW(5:5)-1)*5,,)
etc...

OFFSET虽然可以在计算大表时耗尽资源,但我正在寻找一种方法来加速/简化我的公式。有没有简单的方法将OFFSET公式转换为一个简单的单元格引用,如:

='Large Sheet'!B2572
='Large Sheet'!B2577
='Large Sheet'!B2582
='Large Sheet'!B2587
='Large Sheet'!B2592
etc...

我不能只粘贴值。这需要是一个有效的参考,因为大的工作表将会改变。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

如果您想采用VBA方法,可以使用简单的data test; length buyer_code vendor $200; retain buyer_code vendor ''; infile datalines truncover ; input @@; if not (_infile_ =: 'Date:') and not (_infile_ =: 'Time:') and not (_infile_ =: 'Voucher') and not (_infile_ =: 'Nbr I') and not (_infile_ =: '-------') then do; if _infile_ =: 'Buyer Code' then do; buyer_code = cats(scan(_infile_,2,':')); input; end; else if _infile_ =: 'Vendor:' then do; vendor = cats(scan(_infile_,2,':')); input; end; else do; /* REPLACE THESE 2 LINES WITH YOUR INPUT STATEMENT TO INPUT OTHER VARIABLES */ input ; x = _infile_; output; end; end; else do; input; * MOVE INPUT CURSOR TO NEXT LINE WITHOUT ASSIGNING ANYTHING; end; datalines; Buyer Code: BLS BETTIE SM ITH Vendor: 8444 DAT EX- OHMEDA 762100 62245094 / 03/04/15 42097 2142.46 264568 P 1 Las t Recvd Dat e: 12/19/14 1 7 7 1 3971.88 2142.46 Q 762101 62243752 / 03/01/15 42094 16001.6 264568 P 1 Las t Recvd Dat e: 12/19/14 1 7 7 1 3971.88 16001.6 B 762690 62247150 / 03/07/15 42100 1790.38 264568 P 1 Las t Recvd Dat e: 12/19/14 1 7 7 1 3971.88 1790.38 Q 762691 62246387 / 03/06/15 42099 1520.38 264568 P 1 Las t Recvd Dat e: 12/19/14 1 7 7 1 3971.88 1520.38 Q 762692 62246386 / 03/06/15 42099 1070.38 264568 P 1 Las t Recvd Dat e: 12/19/14 1 7 7 1 3971.88 1070.38 Q 762693 62246385 / 03/06/15 42099 1075.19 264568 P 1 Las t Recvd Dat e: 12/19/14 1 7 7 1 3971.88 1075.19 Q 762694 62246384 / 03/06/15 42099 1115.38 264568 P 1 Las t Recvd Dat e: 12/19/14 1 7 7 1 3971.88 1115.38 Q 763572 62253066 / 03/18/15 42111 890.38 264568 P 1 Las t Recvd Dat e: 12/19/14 1 7 7 1 3971.88 890.38 Q 763574 62253064 / 03/18/15 42111 540 264568 P 1 Las t Recvd Dat e: 12/19/14 1 7 7 1 3971.88 540 Q 763805 62255278 / 03/21/15 42114 1520.38 264568 P 1 Las t Recvd Dat e: 12/19/14 1 7 7 1 3971.88 1520.38 Q 764809 62260713 / 04/01/15 42125 8190.48 264568 P 1 Las t Recvd Dat e: 12/19/14 1 7 7 1 3971.88 3971.88 Q 2 Las t Recvd Dat e: 12/19/14 2 7 7 1 3740 3740 Q 3 Las t Recvd Dat e: 12/19/14 3 7 7 1 478.59 478.6 Q 765293 62257450 / 03/26/15 42119 540 264568 P 1 Las t Recvd Dat e: 6 1 574.31 540 Q 765294 62257449 / 03/26/15 42119 720 264568 P 1 Las t Recvd Dat e: 6 1 574.31 720 B Date: 05/01/ 2015 ST. B ARNABAS O SPITAL P age : 2 Time: 8:47am Pay ables Status E xception R pt For 05/01/20 15 R eport: GARPS ESB Voucher Vendor Vendor Payment Po Nb Total Total PO Inv Nbr I nv Nbr/Ln Inv Dat e Due Date Inv Amt Ln Nb Rec'd Dist Inv'd Price Price St ------------ ---------- --- ----------- ----------- -------------- -------- - --------------- -------- --------- ; run; 循环非常快速地生成引用。

以下是一些非常原始代码,可以帮助您入门。它使用硬编码的工作表名称和变量。我只是想展示For部分。

i*5

通过使用Sub CreateReferences() For i = 0 To 12 For j = 0 To 5 Sheet2.Range("H1").Offset(i, j).Formula = _ "=Sheet1!" & Sheet1.Range("A5").Offset(i * 5, j).Address Next Next End Sub Address上的单元格引用构建快速公式。这里唯一的关键是在“summary”行中有一个索引计数单元格,并乘以5以获得对“master”表的引用。我从Sheet1开始,只是为了匹配A5的结果。

结果显示INDEX及以上的公式输入。我正在与上面生成的H1结果进行比较。

results

答案 1 :(得分:2)

这是最后一种不使用VBA或公式的方法。它只是快速而肮脏地使用AutoFilter并删除行。

主要想法

  • 添加对单元格=Sheet1!A1的引用并将其复制以匹配主数据中的行数。
  • B1中添加另一个公式为=MOD(ROW(), 5)
  • 过滤列B并取消选中0(或任何单个数字)
  • 删除所有可见的行
  • 删除B列
  • Voila,每第5行的公式

部分参考图片,这些都是Sheet2

准备好AutoFilter的公式。

formulas with filter

已过滤并准备删除

filtered

删除所有这些行(选择A1,CTRL + SHIFT +向下箭头,SHIFT + SPACE,CTRL + MINUS)

delete rows

删除B列以获得最终结果" pure"公式每隔5行。

result

答案 2 :(得分:0)

以下是使用INDEX代替OFFSET的一种方法。我不确定它是否更快,我想你可以查一下。 INDEX不易变,所以你可以从中获得一些优势。

范围图片,您可以看到Sheet1包含大量数据,Sheet2从该表中每隔5行提取一次。 Sheet1中的数据来自A1:F1000,只报告当前单元格的地址。

sheets

公式使用INDEX,并在A1 Sheet2上向下复制{。}}。

=INDEX(Sheet1!$A$1:$F$1000,ROW()*5,COLUMN())