2

我遇到了一个问题,我对 VBA 相当陌生,但学习速度很快。我一直在尝试纠正下面的这段代码,以查看一列并挑选出该列中的数据行所采用的所有可能值,以便在另一段代码中使用。

我无法让阵列工作,我可能只是做错了。如果不清楚,它应该检查 I 列中单元格的值,如果它是一个值(并且如果它尚未存储(代码显示但尚未使用)),则该值存储在数组中,并且数组中的位置和列向下的位置递增。

我还没有看过的另一个问题是如何按名称等排列数组中的值?在这种情况下,值将是 AHU1、AHU2、AHU3 等,最高约为 AHU5 或 6,我还打算实现一些代码,如果需要,将扩展数组(从更小,所以它不会比它需要的大)

编辑:我还没有解决的另一个问题是为什么 If 语句总是导致将值添加到数组中(它没有)

Do
    If IsNull(V1.Range("I" & i)) = False Then 'And V1.Range("I" & i).Value <> (Val(AHUArray(1)) Or Val(AHUArray(2)) Or Val(AHUArray(3)) Or Val(AHUArray(4)) Or Val(AHUArray(5)) Or Val(AHUArray(6)) Or Val(AHUArray(7)) Or Val(AHUArray(8)) Or Val(AHUArray(9)) Or Val(AHUArray(10))) Then   'And (does not equal any other values in the array
            AHUArray(ArrayDim) = V1.Range("I" & i).Text
            i = i + 1
            ArrayDim = ArrayDim + 1
        Else
            i = i + 1
        End If
Loop While i <= LastRow

任何想法?,帮助将不胜感激!

这些是在此代码包含这些问题之前的定义(就像过去一样,但我认为不是?

Dim V1 As Worksheet
Dim LastRow As Long
Dim C As Range
Dim FirstAddress As String
Dim AHUArray(1 To 10) As String
Dim DestCell As Integer
Dim i As Integer
Dim ArrayDim As Integer



Set V1 = ThisWorkbook.Sheets("V1")
Set AHU = ThisWorkbook.Sheets("AHU")

LastRow = V1.Range("A:A").Find("*", V1.Range("A1"), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
DestCell = 3
ArrayDim = 1
i = 3
4

2 回答 2

1

改变

IsNull(V1.Range("I" & i)) = False 

V1.range("I" & i).value <> "" 

当你IsNull这样使用时,你总是会得到真实的,因为你在问,“这个范围值是我刚刚创建并定义的 Null 吗?”

关于动态增长数组,请参阅此答案以获取有关如何执行此操作的示例。

于 2013-08-29T10:36:26.850 回答
0

最后,这就是我管理它的方式。使用 IsNull 实现是愚蠢的,并设法使用 UBound 返回 -1 的方式进行检查功能是否找不到任何东西

   Do
       If IsEmpty(V1.Range("I" & i)) = False And IsInArray(V1.Range("I" & i).Value, AHUArray) = False Then '(does not equal any other values in the array
            AHUArray(ArrayDim) = V1.Range("I" & i).Value
            i = i + 1
            ArrayDim = ArrayDim + 1
        Else
            i = i + 1
        End If
Loop While i <= LastRow

这是另一个检查功能

Function ArrayCountIs(ArrayToCount As Variant) As Integer

Dim i As Integer
Dim ArrayCount As Integer
ArrayCount = 0
i = 0
For i = LBound(ArrayToCount) To UBound(ArrayToCount)
    If Not (ArrayToCount(i)) = "" Then
        ArrayCount = ArrayCount + 1
    End If
Next

ArrayCountIs = ArrayCount

End Function
于 2013-09-02T11:42:53.600 回答