Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 检查值是否在数组中,以及是否为';让我们不要把它加在最后_Arrays_Vba - Fatal编程技术网

Arrays 检查值是否在数组中,以及是否为';让我们不要把它加在最后

Arrays 检查值是否在数组中,以及是否为';让我们不要把它加在最后,arrays,vba,Arrays,Vba,我试图创建一个只有唯一值(信号名)的数组。例如,我的电子表格如下所示 电压 电压 电压 现在的 现在的 现在的 等等 我有32个信号,但是,我希望它能工作,即使我不知道我有32个信号,即17个信号 信号(“电压”、“电流”等) 在下面的代码中 我意识到我正在尝试在一个循环中重新分配一个数组,这就是问题所在。我只是想不出另一种方法。我宁愿把它作为数组问题,而不是字典或集合问题 Public Sub Signals() Dim myArray() As Variant Dim Signals()

我试图创建一个只有唯一值(信号名)的数组。例如,我的电子表格如下所示

电压 电压 电压 现在的 现在的 现在的 等等

我有32个信号,但是,我希望它能工作,即使我不知道我有32个信号,即17个信号

信号(“电压”、“电流”等)

在下面的代码中

我意识到我正在尝试在一个循环中重新分配一个数组,这就是问题所在。我只是想不出另一种方法。我宁愿把它作为数组问题,而不是字典或集合问题

Public Sub Signals()

Dim myArray() As Variant
Dim Signals() As Variant
Dim element As Variant
Dim intA As Integer

WsName = ActiveSheet.Name

intRows = Sheets(WsName).Range("B2", Sheets(WsName).Range("B" & Sheets(WsName).Rows.Count).End(xlUp)).Rows.Count
intRows = intRows + 1

ReDim Signals(1)
Signals(1) = Sheets(WsName).Cells(4, 2).Value

For intA = 4 To intRows
    For Each element In Signals()
        If element <> Sheets(WsName).Cells(intA, 2) Then
            ReDim Signals(UBound(Signals) + 1) 'This throws the error
            Signals(UBound(Signals)) = Sheets(WsName).Cells(intA, 2).Value
        End If
    Next element
Next


End Sub
公共子信号()
Dim myArray()作为变量
Dim Signals()作为变量
作为变体的Dim元素
作为整数的Dim intA
WsName=ActiveSheet.Name
intRows=Sheets(WsName).Range(“B2”、Sheets(WsName).Range(“B”)和Sheets(WsName).Rows.Count.End(xlUp)).Rows.Count
intRows=intRows+1
重拨信号(1)
信号(1)=表(WsName).单元格(4,2).值
对于intA=4至intRows
对于信号()中的每个元素
如果元素表(WsName).Cells(intA,2),则
ReDim Signals(UBound(Signals)+1)'这会引发错误
信号(UBound(Signals))=纸张(WsName).单元格(intA,2).值
如果结束
下一个元素
下一个
端接头

代码如何不工作-运行时错误“10”数组被临时修复或锁定。

几天前,我在一个类似的问题中发布了一个使用数组解决此问题的解决方案-在您的案例中使用B列,这样就可以了

除了此解决方案之外,您当前的代码中还存在一些问题-您正在对当前数组中的每个元素进行测试,而没有首先检查它们,您没有使用
ReDim Preserve
,并且您需要
(0到0)
,而不仅仅是单个
(0)
(1)
。您还将子例程命名为“Signals”,同时尝试在子例程中声明变量“Signals”。。。那会引起各种各样的问题

Sub Test()

Dim list() As Variant
Dim inlist As Boolean
Dim n As Long, i As Long, j As Long, endrow As Long, colnum As Long

ReDim list(0 To 0)
inlist = False
j = 0
colnum = 2 'Column B in this case
endrow = Cells(Rows.Count, colnum).End(xlUp).Row

For n = 1 To endrow
    For i = 0 To UBound(list)
        If list(i) = Cells(n, colnum).Value Then
            inlist = True
            Exit For
        End If
    Next i

    If inlist = False Then
        ReDim Preserve list(0 To j)
        list(j) = Cells(n, colnum).Value
        j = j + 1
    End If

    inlist = False
Next n

For i = 0 To UBound(list)
    Debug.Print list(i)
Next i

End Sub
更简单的解决方案得益于@user10829321的建议:

Sub Test()

Dim list() As Variant
Dim n As Long, i As Long, j As Long, endrow As Long, colnum As Long

ReDim list(0 To 0)
j = 0
colnum = 2 'Column B in this case
endrow = Cells(Rows.Count, colnum).End(xlUp).Row

For n = 1 To endrow
    If IsError(Application.Match(Cells(n, colnum).Value, list, 0)) Then
        ReDim Preserve list(0 To j)
        list(j) = Cells(n, colnum).Value
        j = j + 1
    End If
Next n

For i = 0 To UBound(list)
    Debug.Print list(i)
Next i

End Sub

几天前,我在一个类似的问题中发布了一个使用数组来解决这个问题的解决方案——在您的案例中使用B列,这样就可以了

除了此解决方案之外,您当前的代码中还存在一些问题-您正在对当前数组中的每个元素进行测试,而没有首先检查它们,您没有使用
ReDim Preserve
,并且您需要
(0到0)
,而不仅仅是单个
(0)
(1)
。您还将子例程命名为“Signals”,同时尝试在子例程中声明变量“Signals”。。。那会引起各种各样的问题

Sub Test()

Dim list() As Variant
Dim inlist As Boolean
Dim n As Long, i As Long, j As Long, endrow As Long, colnum As Long

ReDim list(0 To 0)
inlist = False
j = 0
colnum = 2 'Column B in this case
endrow = Cells(Rows.Count, colnum).End(xlUp).Row

For n = 1 To endrow
    For i = 0 To UBound(list)
        If list(i) = Cells(n, colnum).Value Then
            inlist = True
            Exit For
        End If
    Next i

    If inlist = False Then
        ReDim Preserve list(0 To j)
        list(j) = Cells(n, colnum).Value
        j = j + 1
    End If

    inlist = False
Next n

For i = 0 To UBound(list)
    Debug.Print list(i)
Next i

End Sub
更简单的解决方案得益于@user10829321的建议:

Sub Test()

Dim list() As Variant
Dim n As Long, i As Long, j As Long, endrow As Long, colnum As Long

ReDim list(0 To 0)
j = 0
colnum = 2 'Column B in this case
endrow = Cells(Rows.Count, colnum).End(xlUp).Row

For n = 1 To endrow
    If IsError(Application.Match(Cells(n, colnum).Value, list, 0)) Then
        ReDim Preserve list(0 To j)
        list(j) = Cells(n, colnum).Value
        j = j + 1
    End If
Next n

For i = 0 To UBound(list)
    Debug.Print list(i)
Next i

End Sub

一个可选的解决方案(如果可能不需要的话),使用脚本字典提供数组

Public Function Signals(ByRef this_worksheet_range As excel.Range) As Variant()

Dim myArray()       As Variant
Dim element         As Variant
Dim interim_dic     As Scripting.Dictionary

    myArray = this_worksheet_range.values2

    Set interim_dic = New Scripting.Dictionary

    For Each element In myArray
        If Not interim_dic.Exists(element) Then
            interim_dic.Add Key:=element, Item:=element
        End If
    Next

    Signals = interim_dic.Items

End Function

一个可选的解决方案(如果可能不需要的话),使用脚本字典提供数组

Public Function Signals(ByRef this_worksheet_range As excel.Range) As Variant()

Dim myArray()       As Variant
Dim element         As Variant
Dim interim_dic     As Scripting.Dictionary

    myArray = this_worksheet_range.values2

    Set interim_dic = New Scripting.Dictionary

    For Each element In myArray
        If Not interim_dic.Exists(element) Then
            interim_dic.Add Key:=element, Item:=element
        End If
    Next

    Signals = interim_dic.Items

End Function

默认情况下,一维阵列是基于零的,而不是基于1的
ReDim信号(1)
创建一个包含两个元素的
信号(0到1)
数组,一个都没有。如果使用脚本.dictionary,您的问题就会消失。@Freeflow OP清楚地指出问题是关于数组的,关于字典和集合的信息是不需要的。我理解OP对集合或字典答案不感兴趣,但使用字典是OP使用的数组最简单的方法欲望。使用scripting.dictionary,您可以使用.items方法获得项目数组。因此,我建议使用字典作为获取所需数组的中间步骤。FWIW数组基于零只是默认设置
Option Base
控制隐式大小数组的下限,默认值为
Option Base 0
。也。。。将其保留为“数组问题”会使其成为效率低下的O(n^2)解决方案。调整阵列大小是一项成本高昂的操作,重复调整阵列大小会产生严重的开销。如果从一开始就不知道需要多少项,那么就不应该使用数组。知道要使用什么数据结构以及何时使用它们比知道如何滥用数组更重要。默认情况下,一维数组是基于零的,而不是基于1的
ReDim信号(1)
创建一个包含两个元素的
信号(0到1)
数组,一个都没有。如果使用脚本.dictionary,您的问题就会消失。@Freeflow OP清楚地指出问题是关于数组的,关于字典和集合的信息是不需要的。我理解OP对集合或字典答案不感兴趣,但使用字典是OP使用的数组最简单的方法欲望。使用scripting.dictionary,您可以使用.items方法获得项目数组。因此,我建议使用字典作为获取所需数组的中间步骤。FWIW数组基于零只是默认设置
Option Base
控制隐式大小数组的下限,默认值为
Option Base 0
。也。。。将其保留为“数组问题”会使其成为效率低下的O(n^2)解决方案。调整阵列大小是一项成本高昂的操作,重复调整阵列大小会产生严重的开销。如果从一开始就不知道需要多少项,那么就不应该使用数组。知道要使用什么数据结构以及何时使用它们比知道如何滥用数组更重要。
inlist=True
后面应该跟着
exit for
但是
iserror(application.match(单元格(n,colnum).Value,list,0))
如果没有循环的数组中没有匹配项,则为真。@user10829321感谢您的建议-我已在我的答案中添加了更简单的解决方案。@user10829321很好,我感谢您的批评,您是对的。我承认这是一个错误的回答