excel 使用WorksheetFunction更改列号和行号

z9smfwbn  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(140)

我的问题是关于语法/概念:我想用一个for循环创建一个列表,其中包含一个根据循环函数改变列输入的公式。
我能找到的最接近的:Excel VBA Loop on columns
我尝试的特定方法提取列(t,u,v.)中的“第一个not-NA()”索引位置,即C6,C7,C8相对于列N,我想要我的结果)。
想要的结果是,这段代码应该由for循环中的单个表达式运行:

Range("N109").Select
ActiveCell.Formula2R1C1 = "=MATCH(TRUE,INDEX(R[-103]C[6]:R[3769]C[6]<>0,),0)"
Range("N110").Select
ActiveCell.Formula2R1C1 = "=MATCH(TRUE,INDEX(R[-104]C[7]:R[3768]C[7]<>0,),0)"
Range("N111").Select
ActiveCell.Formula2R1C1 = "=MATCH(TRUE,INDEX(R[-105]C[8]:R[3767]C[8]<>0,),0)"
...

我的尝试:

For i = 1 To 40
    Dim x, y, z As Variant '(or Integer, neither works)
        x = -102 - i
        y = 5 + i
        z = 3770 - i

Range("N" & (108 + i)).Select

'A1 and A2 are two different attempts to make this work
A1:    ActiveCell.Formula2R1C1 = "=MATCH(TRUE,INDEX(R[x]C[y]:R[z]C[y]<>0,),0)"
A2:    ActiveCell.value = WorksheetFunction.Match(TRUE,INDEX(R[x]C[y]:R[z]C[y]<>0,),0)"

我尝试(在for循环之外),将其中一个范围直接写入函数,但是这给出了一个错误代码。

A3:    ActiveCell.Formula2R1C1 = "=MATCH(TRUE,INDEX(Range("T6:T3878"))<>0,),0)"

ndasle7k

ndasle7k1#

为了在公式R1C1中应用变量,你必须以特定的方式编写它,例如:

R[" & x & "]C[" & y & "]

我希望这能帮助你,
问候

3ks5zfa0

3ks5zfa02#

我不太熟悉“相对重复”的语法,所以我没有得到你的建议卢卡斯工作,我想我犯了更多的错误...然而,我现在使用了“绝对的,细胞级的”参考系统(我现在已经学会了语法):

Sub Get_position_of_first_non_NA_value()
Dim srNum, NumOfSeries As Integer
Dim strCellRange As String
NumOfSeries=Range("J106")
For srNum = 1 To NumOfSeries
    strCellRange = Range(Cells(7, 26 + srNum), Cells(2407, 26 + srNum)).Address
    Range("k" & (124 + srNum)).Formula2 = "=MATCH(TRUE,INDEX(" & strCellRange & ">0,),0)" 'The
   '[ ">0,) ]-part can be switched with e.g. [ "<150,) ], if you want first value under 150, which is not NA()...
Next
End Sub

相关问题