首页 > 解决方案 > 在 Excel VBA 中定义动态范围,良好的编码实践

问题描述

我目前正在尝试为 excel 学习 VBA,并且在将我的头脑围绕定义范围时遇到了一些麻烦。我来自 matlab 背景,如果我想引用矩阵中的单元格,(row#,column#) 是最好的方法。看来,在 excel 中,这通常会产生问题,因为“本机”单元格引用是“LetterNumber”。

我无法创建动态引用范围的代码。例如,如果我有一个数据表,并且想要选择从“X 字符串的第一个实例”到“Y 字符串的最后一个实例”的区域。使用“find”命令的一些变体返回row#/column#。

在某些地方,我已经成功使用:“.Range(.Cells(Row#,Column#),.Cells(Row#,Column#))”

但似乎 excel 不喜欢这种表示法,并且根据我要查找的数据是在活动工作表上还是在另一个工作簿等上,它往往会导致问题。

我只是因为我对 Matlab 的熟悉而看错了,我需要习惯使用“范围(”A5:B6)“吗?如果是这样,有没有一种很好的方法来动态创建该范围而无需超级做作"range(columnString & number ":" columnString2 & number2" 样式结构?这些看起来非常麻烦。

我一直在谷歌上尽力而为,但似乎我的问题恰好位于“非常基本且被教程涵盖”和“太简单而无法被特定问题涵盖”之间的边界上。任何指向 excel VBA 的“良好编码实践”以及如何始终如一地引用事物的教程链接将不胜感激。

我正在使用的一些示例伪代码:

Dim allRelevantVars as allRelevantTypes  
With Sheets("sheet1")
    stringStartRow = .Range("A:A").Find(what:=targetString, after:=.Range("A1")).Column  
    stringEndRow = .Range("A:A").Find(what:=targetString, after:=.Range("A1"), searchdirection:=xlPrevious).Row  
    Set rng = Range(Cells(stringStartRow, 1), Cells(stringEndRow, 1))  
End With

此时,如果我选择我的范围,它会在活动工作表上选择它。我认为有一些解决方法,包括简单地多次更改我的活动表,但这似乎很麻烦,我不禁觉得有更好的方法。

我宁愿不要用回形针和橡皮筋创建代码,而是尝试以从长远来看对我有益的方式来学习东西。

标签: excelvba

解决方案


推荐阅读