以 1 为增量编号,从 1 到 N,无需硬编码
Posted
技术标签:
【中文标题】以 1 为增量编号,从 1 到 N,无需硬编码【英文标题】:Numbering in increments of 1, from 1 to N without hard coding 【发布时间】:2014-08-03 20:32:34 【问题描述】:我也在这里问过: http://www.mrexcel.com/forum/excel-questions/796167-numbering-increments-1-1-n.html
我正在使用一个命名单元格,从那个位置开始,向右 13 个位置,我想开始编号,直到它到达最后一个单元格来自同一个命名单元格的 2 个位置的列。我问是因为我的表将要更改,并且有一个命名的引用对此很有好处。
这是我在录制宏并清理其.Select后得到的,它仍然有一个硬编码的目标范围。
这是一个说明性示例:
Sub Macro2()
Range("endofheaders").Offset(0, 13).FormulaR1C1 = "1"
Range("endofheaders").Offset(0, 13).AutoFill Destination:=Range("DZ6:DZ21"), Type:=xlFillSeries
End Sub
我希望这不会变得太混乱,但下一个代码是我以前没有考虑到我的源表将改变其大小时的代码。它到处都有硬编码的范围,这就是为什么当我编辑表格时,它停止工作了。
With Range("EA6:EA" & Range("DN" & Rows.count).End(xlUp).Row)
.Cells(1, 1).Value = 1
.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=1, Trend:=False
End With
提前致谢。
【问题讨论】:
这段代码没有完成什么?动态目的地范围?我也无法连接到您的链接,您能否说明数据样本前后的情况? 是的,目标范围是硬编码的。它的初始位置将始终在同一行,但不在同一列。此外,范围会更小或更大,具体取决于源数据。 最后一个有效行位于哪一列?或者它可以是任何数据最多的列? Btw, this is how you get the effective last row.你能从这里拿它还是你需要一个例子? 好的,我检查了你上一篇文章中的链接,这不是我真正想要的,因为它仍然引用固定列而不是命名单元格,我过去使用过这种方法。现在,最后一个有效行的列位于命名单元格右侧的两列。实际上,我命名的单元格位于单元格 DM6 中,因此它是从单元格 DO6 到最后一行。当我添加或删除列时,这会改变,当然,这就是我使用命名单元格的原因。我希望这是有道理的,并感谢您的宝贵时间。 使用命名范围很聪明:)。顺便说一句,我为您的问题发布了一个可能的解决方案。 【参考方案1】:巧妙地使用命名范围。顺便说一句,试试这个:
Edit1:如果您想坚持使用AutoFill,我已经包含了代码(请参阅注释行)
Sub Test()
Dim rng As Range, rngtofill As Range
Dim lrow As Long, myformula As String
myformula = "your_formula"
With Sheet8 '~~> Change to your actual sheet
Set rng = .Range("endofheaders")
lrow = .Range(Split(rng.Offset(0, 2).Address, "$")(1) _
& .Rows.Count).End(xlUp).Row
Debug.Print lrow
Set rngtofill = .Range(rng.Offset(0, 13).Address, _
Split(rng.Offset(0, 13).Address, "$")(1) & lrow)
Debug.Print rngtofill.Address
rngtofill.Offset(0, -7).FormulaR1C1 = myformula
rngtofill.Formula = "=ROW(A1)"
rngtofill.Value = rngtofill.Value
'rngtofill.Resize(1, 1).FormulaR1C1 = "1"
'rngtofill.Resize(1, 1).AutoFill rngtofill, xlFillSeries
End With
End Sub
我在编号时采用了另一种方法。Debug.Print
的额外行只是为了检查我是否得到正确的值。
如果您想使用 AutoFill,这取决于您。
我已经在代码中注释了它。 HTH。
【讨论】:
正在编号,但没有填写公式。也许我做错了什么,请稍等。 @e561414 哪个公式没有发生? 哦,你说得对,我只谈到了你无法访问的链接中的公式。呵呵,对不起。如果此代码仅用于编号,那么它是完全完美的。顺便说一句,如果我想使用相同的方法粘贴公式怎么办?忘记编号,它属于另一个线程还是我可以更改此代码中的某些内容以满足该需要? @e561414 哦,好的。公式是什么,你想把它放在哪里?如图示数据所示,它距您的 endofheaders 有 6 个偏移量。顺便说一句,是的。看看我是如何输入公式=ROW(A1)
的?嗯,这完全是我使用这种方法的原因。酷吧? :D
@e561414 我没有得到您的公式,但请查看我对如何将其放入代码中的编辑。【参考方案2】:
所有 I 列单元格公式都可以写成:=IF(INDIRECT("E" & ROW()) <> "", <formula>, "")
。
所有P列单元格公式都可以写成:=IF(INDIRECT("E" & ROW()) <> "", ROW() + 1, "")
。
如果这些需要与您的命名参考相关,则应按如下方式编写: I 列:
=IF(INDIRECT("R" & ROW() & "C" & COLUMN(EOH) + 1, FALSE) <> "", <formula>, "")
P 列:
=IF(INDIRECT("R" & ROW() & "C" & COLUMN(EOH) + 1, FALSE) <> "", ROW() + 1, "")
其中 EOH 是您的命名参考。
将这两列的公式向下拖动 1000 多行。完成。
【讨论】:
如果你想摆脱那个讨厌的“标题结尾”命名引用,请来找我。呵呵。 谢谢。对不起,我不明白“R”和“C”是什么意思,所以当我测试它时,它返回了一个错误。至于命名参考,你说得对,我对它的名字不太满意,我会用你的。我想指出,我宁愿通过 VBA 来完成,因为我的目的是让所有内容都通过一个按钮显示,而不是让公式始终存在。 "R" & "C" 是 "R1C1" 单元格引用方法的一部分 - 与 Excel 中默认的 "A1" 不同。实际上,我发现“R1C1”方法更容易使用,因为就像这个答案一样,您可以对行和列引用进行数学计算。做“G”+ 5 要困难得多。 我没有意识到这一点,但是在选项中将设置更改为 R1C1 后,这两个公式完美运行。我将来肯定会使用它们。谢谢大家。 所以这回答了您的问题但未被选中?为什么选择您需要激活的代码才能更改单元格?此外,命名范围是不必要的,就像人们似乎喜欢这个想法一样。以上是关于以 1 为增量编号,从 1 到 N,无需硬编码的主要内容,如果未能解决你的问题,请参考以下文章
WebRTC[44] - WebRTC 在安卓端的视频硬编硬解策略详解