我有一张表从一张非常大的表中提取了数千行数据。表中的一些列从该大表上的每第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...
我不能只粘贴值。这需要是一个有效的参考,因为大的工作表将会改变。
感谢您的帮助。
答案 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
结果进行比较。
答案 1 :(得分:2)
这是最后一种不使用VBA或公式的方法。它只是快速而肮脏地使用AutoFilter并删除行。
主要想法
=Sheet1!A1
的引用并将其复制以匹配主数据中的行数。B1
中添加另一个公式为=MOD(ROW(), 5)
B
并取消选中0(或任何单个数字) 部分参考图片,这些都是Sheet2
。
准备好AutoFilter的公式。
已过滤并准备删除
删除所有这些行(选择A1
,CTRL + SHIFT +向下箭头,SHIFT + SPACE,CTRL + MINUS)
删除B列以获得最终结果" pure"公式每隔5行。
答案 2 :(得分:0)
以下是使用INDEX
代替OFFSET
的一种方法。我不确定它是否更快,我想你可以查一下。 INDEX
不易变,所以你可以从中获得一些优势。
范围图片,您可以看到Sheet1
包含大量数据,Sheet2
从该表中每隔5行提取一次。 Sheet1
中的数据来自A1:F1000
,只报告当前单元格的地址。
公式使用INDEX
,并在A1
Sheet2
上向下复制{。}}。
=INDEX(Sheet1!$A$1:$F$1000,ROW()*5,COLUMN())