如何在函数中输入范围对象并在VBA中返回数组?

时间:2018-01-29 03:18:14

标签: arrays excel vba excel-vba

我有一个根据特定标准生成细胞范围的程序。 我还有一个函数,它将单元格范围对象作为输入并返回一个数组。但是,如果我在一个过程中调用该函数,我会收到此错误。 “编译错误:无法分配给数组”我的语法有问题吗?感谢。

var trElements = driver.FindElements(By.TagName("tr"));
List<string> strrr = new List<string>(); 
foreach (var tr in trElements)
{
    IWait<IWebElement> wait = new DefaultWait<IWebElement>(tr);
    wait.Timeout = TimeSpan.FromSeconds(10);
    try
    {
        wait.Until(element => element.Text.Trim().Length > 1);
        strrr.Add(element.Text.Trim());
    }
    catch (WebDriverTimeoutException)
    {
        strrr.Add("");
    }
}

程序有点长,所以我只会显示相关的行

int SCROLL_PAUSE_TIME = 1;
int SCROLL_LENGTH = 500;
var jsExecutor = driver as IJavaScriptExecutor;
int pageHeight = Int32.Parse((string)jsExecutor.ExecuteScript("return document.body.scrollHeight"));
int scrollPosition = 0;
while (scrollPosition < pageHeight)
{
    scrollPosition = scrollPosition + SCROLL_LENGTH;
    jsExecutor.ExecuteScript("window.scrollTo(0, " + scrollPosition + ");");
    System.Threading.Thread.Sleep(SCROLL_PAUSE_TIME);
}
var trElements = driver.FindElements(By.TagName("tr"));

3 个答案:

答案 0 :(得分:2)

试一试......

Function DBReader(DBMarker As Range) As Variant
    Dim arr(5) As String
    'Read data
    arr(0) = DBMarker.Value
    arr(1) = DBMarker.Offset(1, 1).Value
    arr(2) = DBMarker.Offset(2, 1).Value
    arr(3) = DBMarker.Offset(0, 2).Value
    arr(4) = DBMarker.Offset(1, 2).Value
    arr(5) = DBMarker.Offset(2, 2).Value
    DBReader = arr()
End Function

Public Sub LogSum()
    'Declare variables

    Dim CellDB As Range
    Dim DBInfo() As String         'Stores info from function

    Set CellDB = bookLOG.Worksheets(j).UsedRange.Find("Ref:", LookIn:=xlValues)
    DBInfo = DBReader(CellDB)       'Returns Array from function???
End Sub

答案 1 :(得分:1)

我怀疑问题是你试图将你的函数设置为刚刚在DBReader函数的最后一行填充的数组。

DBReader = arr()可能失败,因为DBReader是一个函数,而不是一个数组。

答案 2 :(得分:1)

因此,您需要考虑几个问题。

首先,让我们从您的子程序开始。

在分配之前,您正在声明一个包含6个元素的数组。让我们将Dim DBInfo(5)更改为Dim DBInfo()

,将其留空

您还应该在子例程中添加一个检查,以确保您没有CellDB的空对象。在该行之后添加如下内容:

If CellDB Is Nothing Then...

Nothing {/ p>>创建规则。

Public Sub LogSum()
    'Declare variables
    ...
    Dim DBInfo() As String

    ...
    Set CellDB = bookLOG.Worksheets(j).UsedRange.Find("Ref:", LookIn:=xlValues)
    ...
    DBInfo = DBReader(CellDB)
    ...
End Sub

接下来,我们可以查看您的功能本身。在声明As String的末尾,您希望将其作为数组传递,以便您可以使用As String()指定为数组。

此外,您的行DBReader = arr()的语法拼写错误。您应该将其保留为DBReader = arr

Function DBReader(DBMarker As Range) As String()
    Dim arr(5) As String
    'Read data
    arr(0) = ActiveWorksheet.DBMarker.Value
    arr(1) = ActiveWorksheet.DBMarker.Offset(1, 1).Value
    arr(2) = ActiveWorksheet.DBMarker.Offset(2, 1).Value
    arr(3) = ActiveWorksheet.DBMarker.Offset(0, 2).Value
    arr(4) = ActiveWorksheet.DBMarker.Offset(1, 2).Value
    arr(5) = ActiveWorksheet.DBMarker.Offset(2, 2).Value
    DBReader = arr
End Function

此外,一般情况下,不建议您使用ActiveWorksheet来声明工作表。您可以通过添加另一个参数来将其传递给您的函数,例如:
Function DBReader(DBMarker As Range, ws As WorkSheet)...

你的功能还能运作吗?也许吧。
您是否希望稍后在开始将其用于其他工作表时进行调试?值得怀疑的。
现在让你自己头疼,这样你以后就不必进行不必要的调试了。

最后,我并不完全确定你对DBInfo的意图,但那是一维数组。这意味着如果您要将此数组粘贴到工作表中,除非您要转置它,否则它将会水平显示。 你现在可以通过将它变成二维数组来使自己变得更容易。