【问题标题】:Nested Loop Excel VBA嵌套循环 Excel VBA
【发布时间】:2018-05-21 16:31:47
【问题描述】:

在下一个 VBA 循环中我需要您的帮助。我在两列中有一些数据,行之间有空白行。这个宏循环遍历一列并找出它是否包含某个字符。如果它是空白的,那么我希望它移动到下一行。如果它包含“Den”,则选择一个特定的工作表(“D-Temp”),否则选择(“M-Temp”)。 选择正确的工作表后,需要根据行号用第二列的数据填充文本框。到目前为止我创建的代码是

Sub Template()

    Dim j As Long
    Dim c As Range, t As Range
    Dim ws As String

    j = 5
    With Sheets("Sample ")
        For Each c In .Range("I3", .Cells(.Rows.Count, "I").End(xlUp))
            If c.Value = "" Then
                Next ' `Not getting how to jump to next one`
            ElseIf c.Value = "DEN" Then
                ws = "D-Temp"
            Else
                ws = "M-Temp"
            End If

        For Each t In .Range("P3", .Cells(.Rows.Count, "P").End(xlUp))
            If t.Value <> "" Then
                j = j + 1
                Sheets("M-Temp").Copy after:=Sheets(Sheets.Count)
                ActiveSheet.Shapes("Textbox 1").TextFrame.Characters.Text = t.Value
                ActiveSheet.Shapes("textbox 2").TextFrame.Characters.Text = t.Offset(, -1).Value
            End If
        Next
    Next
    End With

有什么帮助吗?? 以下是我拥有的示例数据:

Type    Name 1  Name2
DEN     Suyi    Nick
                     'Blank row'
PX      Mac     Cruise

我希望宏识别类型并根据该选择模板工作表(D 或 M),并分别用名称 1 和名称 2 填充该模板上的文本框。

【问题讨论】:

  • 我相信你只需要说“Next j”而不是“Next”。您需要具体说明它应该影响哪个变量。
  • 我的错误。我在想别的事。
  • 请原谅,但是在循环中用不同的值填充 same 文本框有什么意义呢?
  • @JohnyL 每个模板上有两个文本框。我希望宏根据类型用名称 1 和名称 2 填充这些文本框。
  • @prashant 糟糕,我的错……现在我明白了。当您复制时,新工作表是活动工作表。

标签: vba excel


【解决方案1】:

可能是你追求这个:

Option Explicit

Sub Template()
    Dim c As Range

    With Sheets("Sample")
        For Each c In .Range("I3", .Cells(.Rows.Count, "I").End(xlUp)).SpecialCells(xlCellTypeConstants) ' loop through referenced sheet column C not empty cells form row 3 down to last not empty one
            Worksheets(IIf(c.Value = "DEN", "D-Temp", "M-Temp")).Copy after:=Sheets(Sheets.Count) ' create copy of proper template: it'll be the currently "active" sheet
            With ActiveSheet ' reference currently "active" sheet
                .Shapes("Textbox 1").TextFrame.Characters.Text = c.Offset(, 7).Value ' fill referenced sheet "TextBox 1" shape text with current cell (i.e. 'c') offset 7 columns (i.e. column "P") value
                .Shapes("Textbox 2").TextFrame.Characters.Text = c.Offset(, 6).Value ' fill referenced sheet "TextBox 2" shape text with current cell (i.e. 'c') offset 6 columns (i.e. column "O") value
            End With
        Next
    End With
End Sub

【讨论】:

  • @prashant,有什么反馈吗?
  • 抱歉延迟回复。您的代码按我想要的方式工作得非常好。只是一件小事。您已使用 .Specialcells(xlCellTypeConstants) 省略空白单元格。然而,它仍在考虑这些细胞。知道如何纠正吗??
  • 我现在通过对您的代码进行简单的调整得到了这个。非常感谢您的帮助!!
【解决方案2】:

如果我没有误解您当前的嵌套...

With Sheets("Sample ")
    For Each c In .Range("I3", .Cells(.Rows.Count, "I").End(xlUp))

        If c.Value <> "" Then
            If c.Value = "DEN" Then
                ws = "D-Temp"
            Else
                ws = "M-Temp"
            End If
            For Each t In .Range("P3", .Cells(.Rows.Count, "P").End(xlUp))
                If t.Value <> "" Then
                    j = j + 1
                    Sheets("M-Temp").Copy after:=Sheets(Sheets.Count)
                    ActiveSheet.Shapes("Textbox 1").TextFrame.Characters.Text = t.Value
                    ActiveSheet.Shapes("textbox 2").TextFrame.Characters.Text = t.Offset(, -1).Value
                End If
            Next
        End if 'not blank
    Next
End With

【讨论】:

  • 感谢您的意见。您的代码正在跳过空白行并创建模板。但我希望它根据特定的行值填充文本框。我提到了有问题的样本数据。如果我足够清楚,请告诉我。
【解决方案3】:

如果我正确理解了您的问题,您需要稍微更改您的 if/then 逻辑:

Sub Template()

    Dim j As Long
    Dim c As Range, t As Range
    Dim ws As String

    j = 5
    With Sheets("Sample ")
        For Each c In .Range("I3", .Cells(.Rows.Count, "I").End(xlUp))
            If c.Value <> "" Then
                If c.Value = "DEN" Then
                    ws = "D-Temp"
                    Exit For
                Else
                    ws = "M-Temp"
                    Exit For
                End If
            End If
        Next
        For Each t In .Range("P3", .Cells(.Rows.Count, "P").End(xlUp))
            If t.Value <> "" Then
                j = j + 1
                Sheets("M-Temp").Copy after:=Sheets(Sheets.Count)
                ActiveSheet.Shapes("Textbox 1").TextFrame.Characters.Text = t.Value
                ActiveSheet.Shapes("textbox 2").TextFrame.Characters.Text = t.Offset(, -1).Value
            End If
        Next
    End With
End Sub

您可能需要添加代码以确保将 ws 设置为某个值(并非所有列都是空白的)。

【讨论】:

  • 以上代码仅创建“D”模板,尽管“I”列中有值。我已经用示例数据编辑了我的问题。让我知道是否足够清楚。
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2017-11-21
  • 2016-02-26
相关资源
最近更新 更多