在excel VBAmacros中识别和使用相对variables?

好的,所以我有一个电子表格,我想使用这个代码(和更多),但我得到的问题。 我想把A行和find我应该使用的[-x](请参阅RC [StartColumn]),然后自动填充其余部分。 然后我希望能够重复列A-AF的步骤。

所以基本上我想执行下面的第一个计算,第二个计算在旁边,我希望能够在文档的任何地方启动它。 然后,我希望能够将每行的每一行复制到我select的第一个单元格。

问题是我对Macros非常陌生,通过观察我的macros观logging结果并稍微玩一下,就把它放在一起,但是现在的水平已经变得太高级了,如果可能的话,我想在今天之前完成。 难道有人可以指教我吗?可以教我的方法,以便将来我可以自己做到这一点?

Sub ConcatenateStep1() Dim StartColumn As Integer StartColumn = 1 - ActiveCell.Column ActiveCell.FormulaR1C1 = _ "=IF(AND(RC14=R[1]C14),IF(OR(ISNUMBER(FIND(LOWER(RC[StartColumn]),LOWER(R[1]C[StartColumn]),1)),ISNUMBER(FIND(LOWER(R[1]C[StartColumn]),LOWER(RC[StartColumn]),1))),IF(LEN(RC[StartColumn])<LEN(R[1]C[StartColumn]),R[1]C[StartColumn],RC[StartColumn]),CONCATENATE(RC[StartColumn],"", "",R[1]C[StartColumn])),IF(AND(RC14<>R[1]C14,RC14<>R[-1]C14),RC[StartColumn],"" ""))" Range("AK2").Select Set SourceRange = Range("AK2") Set fillRange = Range("AK2:AK22000") SourceRange.AutoFill Destination:=fillRange Range("AL2").Select ActiveCell.FormulaR1C1 = _ "=IF(AND(RC14=R[1]C14,RC14<>R[-1]C14),IF(OR(R[1]C[-1]="" "",ISNUMBER(FIND(LOWER(RC[-1]),LOWER(R[1]C[-1]),1)),ISNUMBER(FIND(LOWER(R[1]C[-1]),LOWER(RC[-1]),1))),IF(LEN(RC[-1])<LEN(R[1]C[-1]),R[1]C[-1],RC[-1]),CONCATENATE(RC[-1],"", "",R[1]C[-1])),IF(AND(RC14<>R[1]C14,RC14<>R[-1]C14),RC[-1],"" ""))" Set SourceRange = Range("AL2") Set fillRange = Range("AL2:AL22000") SourceRange.AutoFill Destination:=fillRange Range("AL2").Select End Sub 

这只是一个部分的答案。

这些令人难以置信的冗长而复杂的公式是实现任何你想实现的最好方式吗?

第一个公式中有两个错误,当macros尝试将其放置在单元格中时,Excel将不接受它。

  • 该公式是一个包含StartColumn的长string。 但是StartColumn是一个variables。 您需要用" & StartColumn & "replaceStartColumn每一个出现。

  • 在一个string中,结果中所需的每个双引号都必须用两个双引号replace。 在CONCATENATE(RC[StartColumn],"", "",R[1]C[StartColumn]) ,双引号没有加倍,尽pipe在公式的末尾有双引号。

Excel将接受以下(这意味着它在语法上是正确的),虽然我不明白它的目的,所以它可能在逻辑上是不正确的:

 ActiveCell.FormulaR1C1 = _ "=IF(AND(RC14=R[1]C14),IF(OR(ISNUMBER(FIND(LOWER(RC[" & StartColumn & _ "]),LOWER(R[1]C[" & StartColumn & "]),1)),ISNUMBER(FIND(LOWER(R[1]C[" & _ StartColumn & "]),LOWER(RC[" & StartColumn & "]),1))),IF(LEN(RC[" & _ StartColumn & "])<LEN(R[1]C[" & StartColumn & "]),R[1]C[" & StartColumn & _ "],RC[" & StartColumn & "]),CONCATENATE(RC[" & StartColumn & _ "],"""", """",R[1]C[" & StartColumn & _ "])),IF(AND(RC14<>R[1]C14,RC14<>R[-1]C14),RC[" & StartColumn & "],"" ""))" 

CONCATENATE(RC[StartColumn],"", "",R[1]C[StartColumn])CONCATENATE(RC[StartColumn],R[1]C[StartColumn])

我同意MP24,在我或其他人可以进一步帮助你之前,你必须澄清你的问题。 macroslogging器logging语法正确的VBA,但它不是很好的VBA。 它不知道你的目标,所以当一个熟练的程序员将他们结合起来,logging个别的键盘操作。 使用Select或使用ActiveCell几乎不是一个好主意,但macroslogging器别无select,只能这样做。

第2部分

尽pipeExcel允许macros放置第一个论坛,但后来却抱怨这个公式包含循环引用。 午夜过去了,我明天再看

第3部分

再看看你的第一个公式,我相信我昨晚错误地parsing了它。 我现在相信连接function是正确的。 此外,看起来循环引用取决于macros启动时的ActiveCell的位置。 我可以通过select不同的起始位置来清除这个错误。

我目前试图parsing你的公式给出:

 Outer: "=IF(X1,X2,X3)" X1: AND(RC14=R[1]C14) X2: IF(X4,X5,X6) X3: IF(X7,RC[StartColumn],"" "") X4: OR(X8,X9) X5: IF(X10,R[1]C[StartColumn],RC[StartColumn]) X6: CONCATENATE(RC[StartColumn],"", "",R[1]C[StartColumn]) X7: AND(RC14<>R[1]C14,RC14<>R[-1]C14) X8: ISNUMBER(X11) X9: ISNUMBER(X12) X10: LEN(RC[StartColumn])<LEN(R[1]C[StartColumn]) X11: FIND(LOWER(RC[StartColumn]),LOWER(R[1]C[StartColumn]),1) X12: FIND(LOWER(R[1]C[StartColumn]),LOWER(RC[StartColumn]),1) 

我已经使用macros来放置公式,以便稍后在用户input值时给出更改的结果。 你想改变结果? 如果不是,用VBAreplace这个公式几乎肯定会给出更易于理解和更易维护的代码。

我不赞成这样的公式。 我知道,许多人成功地使用复杂的公式,并对结果感到满意。 但是,我花了太多的时间去收拾那些已经离开的聪明人留下的碎片。 需要多长时间才能得到这样的公式是正确的? 在六个月或十二个月之后,需要多长时间修改一个稍微不同的结果? 根据我的经验,六到十二个月后需要修改的人经常不是原作者。 使用VBA,作者可以留下评论,说明代码在做什么,但是用作者不能做的公式。 聪明的作者并不总是留下他们应该的评论,但至lessVBA代码通常比复杂的公式更容易解码。