Arrays excel vba对函数和数组的实验

Arrays excel vba对函数和数组的实验,arrays,function,vba,excel,Arrays,Function,Vba,Excel,我正在试验一些东西: 有一个包含名称的列表,我想做的是读取数组中的单元格值(这部分有效),然后对工作表中的每个单元格进行检查,如果给定的单元格与数组中的字符串相同,请执行某些操作 但不幸的是,我得到了“类型不匹配”错误 顺便说一句,我知道这没有多大意义,我可以在服务器功能中找到一些东西,但请相信我,我有我的理由。:-) 编辑:修复了一些问题,现在看起来是这样的(现在我得到的对象不支持method的这个属性) 如果有帮助,你也可以试试。您只需要添加一个名为“Servers”的单元格,并在其下写一些

我正在试验一些东西:

有一个包含名称的列表,我想做的是读取数组中的单元格值(这部分有效),然后对工作表中的每个单元格进行检查,如果给定的单元格与数组中的字符串相同,请执行某些操作

但不幸的是,我得到了“类型不匹配”错误

顺便说一句,我知道这没有多大意义,我可以在服务器功能中找到一些东西,但请相信我,我有我的理由。:-)

编辑:修复了一些问题,现在看起来是这样的(现在我得到的对象不支持method的这个属性)

如果有帮助,你也可以试试。您只需要添加一个名为“Servers”的单元格,并在其下写一些随机单词。现在,它应该在msgbox“ok”中写入x次,其中x是您写入的行数,位于名为“Servers”的单元格下

一,

二,

三,


我认为可能是您在测试中将c定义为一个范围,但在服务器需要布尔值时使用c调用服务器

我认为可能是您在测试中将c定义为一个范围,但当服务器需要布尔值时,使用c调用服务器

我想你可以把你的函数浓缩起来:

首先,您需要将数组生成块包含到主sub中。
将其包含在函数服务器中会降低代码执行速度,因为它需要在每次调用服务器函数时生成数组

Edit1:现在已在测试中尝试。我已经重新编写了你的函数,并对你的sub做了一些改进

Sub test()
    Dim j As Integer
    Dim c As Range, c1 As Range
    Dim x As Integer, y As Integer
    Dim i As Long '~~> added it just to check how many is shown in MsgBox

    For Each c In Sheets("Topology").UsedRange.Cells
        '~~> generate array if "Servers" is encountered
        If c.Value = "Servers" Then
            Dim srvname() As String
            j = 0
            y = c.Column: x = c.Row + 1
            With Sheets("Topology").UsedRange
                Do Until IsEmpty(.Cells(x, y))
                    ReDim Preserve srvname(j)
                    srvname(j) = .Cells(x, y).Value
                    x = x + 1
                    j = j + 1
                Loop
            End With
            '~~> use the generated Array of values here
            i = 1
            For Each c1 In Sheets("Topology").UsedRange.Cells
                If IsInArray(c1.Value, srvname) Then
                    MsgBox "ok" & i
                    i = i + 1
                End If
            Next c1
        End If
    Next c
End Sub

新函数如下:(实际上,您不需要它,您可以直接在main Sub中调用Match函数)


也许你这样做只是为了测试?我只是认为用于生成数组的工作表必须与要比较服务器名称的工作表不同。

我认为您可以压缩您的函数:

首先,您需要将数组生成块包含到主sub中。
将其包含在函数服务器中会降低代码执行速度,因为它需要在每次调用服务器函数时生成数组

Edit1:现在已在测试中尝试。我已经重新编写了你的函数,并对你的sub做了一些改进

Sub test()
    Dim j As Integer
    Dim c As Range, c1 As Range
    Dim x As Integer, y As Integer
    Dim i As Long '~~> added it just to check how many is shown in MsgBox

    For Each c In Sheets("Topology").UsedRange.Cells
        '~~> generate array if "Servers" is encountered
        If c.Value = "Servers" Then
            Dim srvname() As String
            j = 0
            y = c.Column: x = c.Row + 1
            With Sheets("Topology").UsedRange
                Do Until IsEmpty(.Cells(x, y))
                    ReDim Preserve srvname(j)
                    srvname(j) = .Cells(x, y).Value
                    x = x + 1
                    j = j + 1
                Loop
            End With
            '~~> use the generated Array of values here
            i = 1
            For Each c1 In Sheets("Topology").UsedRange.Cells
                If IsInArray(c1.Value, srvname) Then
                    MsgBox "ok" & i
                    i = i + 1
                End If
            Next c1
        End If
    Next c
End Sub

新函数如下:(实际上,您不需要它,您可以直接在main Sub中调用Match函数)


也许你这样做只是为了测试?我只是认为用于生成数组的工作表必须与要比较服务器名称的工作表不同。

请突出显示错误所在的行。现在,当我运行子测试()时,会出现一个msgbox,上面写着:运行时错误13:键入不匹配在“Do”之后,添加
Debug.Print x,y
。在每个单元格的
之后,添加
Debug.Print cell.address
。这将缩小范围。然后,您可以在问题区域停止并单循环(F8)。请参见请突出显示错误显示的行。当我运行子测试()时,会出现一个msgbox,上面显示:运行时错误13:键入不匹配在“Do”之后,添加
Debug.Print x,y
。在每个单元格的
之后,添加
Debug.Print cell.address
。这将缩小范围。然后,您可以在问题区域停止并单循环(F8)。见@Divin3,我认为上面的答案由RowanC给出。将
函数服务器(ByVal issrvname作为布尔值)
更改为此
函数服务器(issrvname)
即可。但是当然,您可以显式地使用
ByVal/ByRef
以及类型。像
函数服务器(ByVal issrvname作为字符串)
。如果您能为您确定的问题提供解决方案,这将有助于OP(并使他/她高兴):)这有帮助,但现在我得到的对象不支持method@Divin3我认为上面的答案是罗万克的钉子。将
函数服务器(ByVal issrvname作为布尔值)
更改为此
函数服务器(issrvname)
即可。但是当然,您可以显式地使用
ByVal/ByRef
以及类型。像
函数服务器(ByVal issrvname作为字符串)
。如果您能为您确定的问题提供解决方案,这将有助于OP(并使他/她高兴):)这有帮助,但现在我得到的对象不支持method的这个属性。你是个天才,脚本还有一些其他问题。我试着让它尽快工作你这样做只是为了测试吗?我只是认为用于生成数组的工作表必须与要比较服务器名称的工作表不同。你是对的,我想在其他工作表上也使用这个。但如果这一部分起作用,剩下的就很容易了。:-)@如果你已经在函数中使用了它,那么同样的事情也可以在子函数中完成。假设你有一个名为Test2的子函数,你也可以通过ByRef传递它。您可以这样创建sub:sub Test2(arr作为变体),然后在主sub中调用该sub。有一个我不理解的问题。它用下一列的值填充数组我意识到i必须是0而不是1,因为0是数组的第一个元素,但我不明白,它是如何到达下一行的,以及为什么我必须编写
y=c。Column-1
要使它正常工作,你是个天才,脚本还有一些其他问题。我试着让它尽快工作你这样做只是为了测试吗?我只是认为用于生成数组的工作表必须与要比较服务器名称的工作表不同。你是对的,我想在其他工作表上也使用这个。但如果这一部分起作用,剩下的就很容易了。:-)@如果你已经在函数中使用了它,那么同样的事情也可以在子函数中完成。假设你有一个名为Test2的子函数,你也可以通过ByRef传递它。您可以这样创建sub:sub Test2(arr作为变体),然后在主sub中调用该sub。有一个我不理解的问题。它用下一个数组的值填充数组
Sub test()


Dim c As Range

For Each c In Sheets("Topology").UsedRange.Cells

    If server(c) = True Then
   MsgBox "ok"
    End If

Next c

End Sub
Sub test()
    Dim j As Integer
    Dim c As Range, c1 As Range
    Dim x As Integer, y As Integer
    Dim i As Long '~~> added it just to check how many is shown in MsgBox

    For Each c In Sheets("Topology").UsedRange.Cells
        '~~> generate array if "Servers" is encountered
        If c.Value = "Servers" Then
            Dim srvname() As String
            j = 0
            y = c.Column: x = c.Row + 1
            With Sheets("Topology").UsedRange
                Do Until IsEmpty(.Cells(x, y))
                    ReDim Preserve srvname(j)
                    srvname(j) = .Cells(x, y).Value
                    x = x + 1
                    j = j + 1
                Loop
            End With
            '~~> use the generated Array of values here
            i = 1
            For Each c1 In Sheets("Topology").UsedRange.Cells
                If IsInArray(c1.Value, srvname) Then
                    MsgBox "ok" & i
                    i = i + 1
                End If
            Next c1
        End If
    Next c
End Sub
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))
End Function