【问题标题】:How to loop through merged cells and read each one for text如何遍历合并的单元格并读取每个单元格以获取文本
【发布时间】:2018-08-01 12:49:39
【问题描述】:

我有一个名为 Sheet3 的 Excel 表,我将单元格合并成 11 x 6 的大方块,然后将它们排成一行。这些块中有 12 个彼此相隔 7 个单元。我定义了每个块的名称,“Car_1”到“Car_12”。我正在尝试编写一个代码块,在其中我可以使用 Car_1 到 Car_12 块创建一个数组,我可以遍历每个块并确定每个块右侧是否写有文本,如果有则 ID右侧的那个块可以打印在工作表上其他地方的单元格中(总共有 12 个块,因此输出范围可以在单元格 "C2" 到 "C13" )相反,如果块中没有写入文本在被关注的右侧没有输出,它只会转到下一个块,直到所有块都被循环通过。然而,无论哪个区块结束,都需要为它采取不同的行动。因此,当程序查看该块时,当它后面的任何点都没有带有文本的块时,它将打印“Right End”而不是 ID。这是我到目前为止所拥有的,但它当然不起作用:

Sub Code()

Dim wb As Workbook
Dim ws As Worksheet
Dim TxtRng As Range

Set wb = ActiveWorkbook
Set ws = wb.Sheets("Sheet3")

Dim Cars(12)
i = 1
For Cars = 1 To 12
If Application.WorksheetFunction.IsText(Range("Car_(i)")) Then

Set TxtRng = ws.Range("C2")
TxtRng.Value = "Yes" 'Car(i) ----> ID
Else
TxtRng.Value = ""    'Blank

        If Application.WorksheetFunction.IsText(Range("Car_12")) Then

        Set TxtRng = ws.Range("C13")
        TxtRng.Value = "Right End"

Next i

        End If
    End If
End Sub

在我的代码中,我只关注在查看 Car_12 时会发生什么,而不是在块右侧没有带有文本的块的任何地方。

【问题讨论】:

  • 有必要使用合并单元格吗?使用未合并的单元格要容易得多......无论如何,您已经编写的代码的确切问题是什么?它没有做什么,你正在努力实现什么?
  • 是的,遗憾的是,我仅限于使用合并单元格,而且我是 VBA 新手,所以我只需要检查我的语法以及如何编写代码来处理最后的块
  • 我基本上需要知道哪个块在被循环通过的每个块的右侧:
  • 就像在单元格“B2”到“B13”中会列出 1 到 12,单元格“C2”到“C13”会有输出(单元格中每个数字的右侧是什么B2 到 B13) 它实际上应该是 1 --> 2、2 --> 3 等等。除非我们说块 Car_3 没有文本,那么当在循环中查看 Car_2 时,Car_4 将是输出
  • 您是否特别想使用IsText - 即如果块中有一个数字,它将被忽略?还是只是想检查块值的长度是否 > 0?

标签: vba excel


【解决方案1】:

您可以使用嵌套循环找到下一辆车。下面的代码在第一个 For 循环中循环通过汽车 1 到 11,然后立即检查嵌套循环中的下一个非空白汽车。一旦找到下一辆车,它就会退出嵌套循环并将该车的索引写入范围C2:C13 中的相关行 - 这里我使用C1 中的iOffsetting 来获取该行.

我发现构建第二个循环来获得“右端”是最简单的 - 只需从 12 号车向后循环并寻找第一对汽车,其中最后一个是空白的,而倒数第二个不是。请注意,如果 Car 12 不为空白,则自动为“Right End”。

Sub Code()
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.Sheets("Sheet3")
    Dim i As Integer, j As Integer, k As Integer

    ws.Range("C2:C13").ClearContents

    ' First loop to compare a car to the rest after it
    For i = 1 To 11
        For j = i + 1 To 12
            If Not IsEmpty(ws.Range("Car_" & i)) And Not IsEmpty(ws.Range("Car_" & j)) Then
                ws.Range("C1").Offset(i).Value = j
                Exit For
            End If
        Next j
    Next i

    ' Loop backwards to find "Right End"
    For k = 12 To 2 Step -1
        If Not IsEmpty(ws.Range("Car_12")) Then
            ws.Range("C1").Offset(12).Value = "Right End"
            Exit For
        ElseIf IsEmpty(ws.Range("Car_" & k)) And Not IsEmpty(ws.Range("Car_" & k - 1)) Then
            ws.Range("C1").Offset(k - 1).Value = "Right End"
            Exit For
        End If
    Next k

End Sub

屏幕截图 - 绝对简化了您的文件,但演示了概念。

可能性 1

可能性 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2015-01-05
    • 1970-01-01
    • 2011-07-02
    • 2012-05-13
    • 2018-01-18
    • 2021-11-21
    相关资源
    最近更新 更多