2011-10-03 103 views
0

因此,我正在运行一个循环以从另一个工作表上的一列中获取数据,并且希望在列中的数据结束后停止,但我遇到了一些问题找到结束循环的条件。VBA Excel - 基于单元格区域值的循环

Do While values(i) <> 0 

Set xcell = Range(Cells(x + 3, 2), Cells(x + 3, 2)) 
Set ycell = Range(Cells(y + 3, 2), Cells(y + 3, 2)) 
x = x + 1 
y = y + 1 

ycell.Formula = "='\\Drcs8570168\shasad\[CR Status.xlsx]Sheet1'!" & xcell.Address 

values(i + 1) = xcell.Value 
i = i + 1 

Loop 

我试图给每个小区分配给一个变量与阵列和运行循环,直到空白细胞开始进行记录。它告诉我下标超出范围。

+0

你怎么声明** values()**? –

回答

1

你intialized变量i和阵列values

循环之前:

i=0 
Redim Preserve valus(i) 
values(i)=1 'or else we will never enter the loop 

在循环(循环语句之前的最后几行):

i = i + 1 
Redim Preserve values(i) 
values(i) = xcell.Value 

但是,你甚至不需要数组values(也就是说,如果你将不会在代码中的其他任何地方使用它),只需将最后一个单元格值存储在i中。

循环之前:

i = 1 'or we won't enter the loop 
while i<>0 'starting the loop 

这里来你的循环代码,然后循环结束前:

i = xcell.Value 
Loop 

编辑: 但是,如果你有一个实际的0作为细胞值在列表中,循环将在列表结束之前停止,因此您可能需要确认您的单元格是否包含任何字符:

假设:

Dim i as Variant 

在最后一个例子循环条件之后还可以:

while i<>"" 

而且这只会停止,如果小区确实是空的(=没有内容)

+0

所以我把 ReDim保留值(i) 值(i)= 1 但它仍然说超出范围 而且我希望保持数组中的单元格内容,这就是为什么我不是只是使用我的循环。 – user960358

+0

其实,我之前没有注意到的一件事是,我得到了循环中第一个单元格的输出,但是后来出现“类型不匹配”错误。 – user960358

+0

对不起,犯了一个错误。代码确实有效,只是忘记了redim行。 – user960358

1

您可以尝试使用一个函数来找到最后一行,如它的数据:不是

Function LastRow(wks As Worksheet) As Long 
    On Error GoTo ErrHandle 
    LastRow = wks.Cells.Find("*", After:=wks.Cells(1, 1), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
    Exit Function 
ErrHandle: 
    LastRow = 0 
End Function 
+0

如果不包含可选参数,会发生什么情况? –

+0

说实话,我甚至不知道为什么这个论点是可选的。前一段时间我刚刚写了这个,当时我第一次学习VBA,我真的不记得为什么我这样写。我编辑了我的帖子以使参数成为必需。 – ApathyCorps

+0

该函数将返回表单中* anywhere *的最后使用行,但用户需要在特定列(或多列)中使用最后一行。因此,虽然我会使用Reafidy的方法,但我建议您定制“查找”来搜索离散列以适用于此问题。干杯。 – brettdj

2

首先:

Set xcell = Range(Cells(x + 3, 2), Cells(x + 3, 2)) 

使用刚:

Set xcell = Cells(x + 3, 2) 

但是,我怀疑你甚至需要循环。尝试是这样的:

Dim vValues As Variant 

'// Get the range of cells you want to work with 
With Range("B3", Cells(Rows.Count, "B").End(xlUp)) 
    '// Add the formula, excel will automatically fill in series 
    .Formula = "='\\Drcs8570168\shasad\[CR Status.xlsx]Sheet1'!A1" 
    '// Build an array from the values 
    vValues = .Value 
End With 
+0

嗯,我想尝试一下,但我不熟悉这些命令。即使你不想使用循环,你会知道我为什么不工作? – user960358

+0

这些命令可能看起来有点复杂,但它们确实不是。它所做的就是获取b列的已使用单元格,然后用公式填充它们并从中填充和排列它们。请编辑您的帖子以包含整个代码,我需要看到声明以及x和y的初始值等。 – Reafidy

+0

+1。更有效的方法 – brettdj