【问题标题】:Fill an Array with Values to the next empty Row用值填充数组到下一个空行
【发布时间】:2019-07-18 19:22:42
【问题描述】:

我正在尝试从 Excel 工作表中的用户输入填充数组。目前,我的工作表只列出了两个目标,但我希望用户能够根据需要定义无限数量的目标。 我的代码:

停止调试,我在 Targets (i, 1) 行上得到一个超出范围的下标。 while 在特定列中查找值并向下行,直到它检测到空白然后停止。一旦检测到要放入我的数组中,我不知道如何获取值。

我尝试在循环内和 while 循环内移动目标的 ReDim。

Dim max_I As Byte, tgt_N As Double
Dim Targets()
Dim RadarRangeDenomenator()
Dim RelativePower()
Dim PowerAmplitude()

Call Activ8_Sheet("Signal")

tgt_N = 0
max_I = 0

While Cells(max_I + 8, 3).Value <> ""
    tgt_N = tgt_N + 1
    max_I = max_I + 1
    For i = 1 To max_I
        Targets(i, 1) = Cells(max_I + 8, 3)
    Next i
    Stop
Wend

ReDim Targets(tgt_N)

MsgBox (Targets(1, 1))

我想要的是在 Excel 工作表上列出值的一维数组(多行但只有 1 列)。

【问题讨论】:

  • 为了记录,您对 ".. 的评论有一个单维数组 ..." 和以下语句 "(很多行但只有1 列)” 自相矛盾。具有 1 列的数组仍然是二维数组 - 第 2 维是 1 到 1。
  • 另外,您在该行收到的 Subscript out of Range 错误的原因是您没有对数组进行预维度化.这通常在静态的基础上完成:Dim myArray(1 To 10, 1 To 1) 或可以使用 ReDim 语句动态完成:Dim myArray() ReDim myArray(1 To LastRow, 1 To 1)。

标签: arrays excel vba


【解决方案1】:

无需循环单元格,只需一次将整个范围分配给数组。此方法会自动创建一个二维数组,因为工作表本身是二维的。

如果您希望列中的最后一个单元格,您可以使用此方法:

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Signal")

Dim StartRng As Range, EndRng As Range
Set StartRng = ws.Range("C8")
Set EndRng = ws.Cells(Rows.Count, 3).End(xlUp)

Dim Targets() As Variant
Targets = ws.Range(StartRng, EndRng).Value

ws.Cells(Rows.Count, 3).End(xlUp) 将从工作表的最后一行向上扫描列。一旦找到一个非空单元格,它就会将该单元格用于范围。这意味着在该列上方仍可能有空单元格。

但是,如果您只想要列中下一个空单元格的单元格值,则可以改用:

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)

Dim StartRng As Range, EndRng As Range
Set StartRng = ws.Range("C8")
Set EndRng = StartRng.End(xlDown)

Dim Targets() As Variant
Targets = ws.Range(StartRng, EndRng).Value

StartRng.End(xlDown) 从您之前指定的开始范围开始,然后向下。它将向下扫描,直到找到包含值的最后一个单元格(在空白之前)并将其用作它的范围。这意味着仍有其他单元格的数据低于此范围 - 因为它只拾取第一个空单元格之前的单元格。


您可以使用此循环测试数组

Dim i As Long
For i = LBound(Targets) To UBound(Targets)
    Debug.Print Targets(i, 1)
Next

确保您的价值观符合您的期望。

【讨论】:

  • 所以如果它检测到空白就会停止? .End(xlUp) 在这种情况下是什么意思?
  • .End(xlUp) 将找到列中的最后一行。如果您实际上想要空白之前的最后一个单元格(因此其下方可能仍有数据),您可以将 EndRng 替换为:Set EndRng = StartRng.End(xlDown)。我将更新答案以包括这两个品种。
猜你喜欢
  • 1970-01-01
  • 2021-10-15
  • 2015-09-05
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-12
相关资源
最近更新 更多