【问题标题】:Loop for a string with inbuilt macro with multiple validations循环使用具有多个验证的内置宏的字符串
【发布时间】:2018-02-26 15:54:35
【问题描述】:

我对 VBA 很陌生。因此很难从代码中获取一些重要的东西。

我有一个为两个字符串编写的宏。第一个字符串是一个带有我正在验证的值的字符串,第二个字符串,在第一个字符串之后,充满了验证消息。 我需要做的是构建一个循环,如果下一个字符串填充了数据,它将重复写入的宏。附图片。

例如现在我填充了字符串 = A7:G7 和 A8:G8,我需要填充下一个字符串 A9:G9 和 A10:G10

代码示例:

'Field 2 (E7) should not exceed 52 characters, it should not be blank'
    If Len(oCell) < 52 And Len(oCell) <> 0 Then
        ThisWorkbook.Sheets("Tool").Range("E8").Value = ""

    ElseIf Len(oCell) > 52 And Len(oCell) <> 0 Then
        ThisWorkbook.Sheets("Tool").Range("E8").Value = "Exceeding"

    Else: ThisWorkbook.Sheets("Tool").Range("E8").Value = "Cannot be blank"


End If
        End With

我希望这是有道理的。谢谢

enter image description here

enter image description here

[在此处输入图片描述][2]

enter image description here

enter image description here

【问题讨论】:

  • 对不起,但这对我来说没有意义。您的图片包含许多空白单元格。你的问题到底是什么?
  • 您好,我刚刚附上了一张新图片,其中我用数据填充了字符串。问题是:如果我有数据 A9 到 G9 的字符串字段,我该如何验证,重新运行编写的宏

标签: excel loops iteration vba


【解决方案1】:

如果我的理解正确,您正在尝试创建一个循环(您的示例专门使用单元格 E8)并且不确定如何实现这一点。遍历行的基本 For 循环的结构如下:

Dim i as Long, lr as Long
lr = Cells(Rows.Count, 1).End(xlUp).Row 'Dynamically finds last row, based on column 1 (A)
For i = 8 to lr Step 1
    'Do something using i
Next i

我们现在可以修复您的代码以利用 i,这样:

Sheets("Tool").Range("E" & i).Value = ""

Sheets("Tool").Cells(i, "E").Value = ""

看着你的例子,我有点困惑......什么是oCell(具体来说是哪一列),输出应该在哪里?

从您的示例中,我看起来正在评估 E7 并且输出在 E8 中...您是遍历列还是向下行?需要有关您的源数据的更多信息。


编辑:

Dim i as Long, lr as Long
lr = Cells(Rows.Count, 1).End(xlUp).Row 'Dynamically finds last row, based on column 1 (A)
For i = 8 to lr Step 2
    If len(Cells(i-1,5)) < 52 AND len(Cells(i-1,5)) <> 0 then
        Sheets("Tool").Cells(i,5).Value = ""
    ElseIf len(Cells(i-1,5)) > 52 then
        Sheets("Tool").Cells(i,5).Value = "Exceeding"
    End If
        Sheets("Tool").Cells(i,5).Value = "Cannot be blank"
Next i

编辑 2:此代码向下 E 列

Dim i As Long, lr As Long
lr = Cells(Rows.Count, 1).End(xlUp).Row 'Dynamically finds last row, based on column 1 (A)
For i = 7 To lr Step 2
    Select Case Len(Cells(i, 5))
        Case 0
            Cells(i + 1, 5).Value = "Cannot be blank"
        Case Is < 52
            Cells(i + 1, 5).Value = ""
        Case Is > 52
            Cells(i + 1, 5).Value = "Exceeded"
    End Select
Next i

编辑 3:此代码在第 7 行正确

Dim i As Long, lc As Long
lc = Cells(5, Columns.Count).End(xltoLeft).Column
For i = 4 To lc Step 1 'looks like you're going 1 by 1 across row 7
    Select Case Len(Cells(7, i))
        Case 0
            Cells(8, i).Value = "Cannot be blank"
        Case Is < 52
            Cells(8, i).Value = ""
        Case Is > 52
            Cells(8, i).Value = "Exceeded"
    End Select
Next i

编辑 4:此代码向下并向右

Dim i As Long, j As Long, lr As Long, lc As Long
lr = Cells(Rows.Count, 4).End(xlUp).Row 'Based on last row in column D
'lc = Cells(5, Rows.Count).End(xlToLeft).Column 'Based on last column in row 5 'Not needed, commented out, known end in Column 68
For i = 7 To lr Step 2
    For j = 4 to 68 Step 1 'From D (4) to BP (68)
        Select Case Len(Cells(i, j))
            Case 0
                Cells(i + 1, j).Value = "Cannot be blank"
            Case Is < 52
                Cells(i + 1, j).Value = ""
            Case Is > 52
                Cells(i + 1, j).Value = "Exceeded"
        End Select
    Next j
Next i

【讨论】:

  • 对,你没看错,E7是输入,E8是输出。抱歉,我忘了复制:oCell = ThisWorkbook.Sheets("Tool").Range("E7").Value。我正在经历向下的行。我的源数据会从另一张表中复制过来,我已经写了映射,但是只针对这两个字符串,也需要考虑一下
  • @inconsistent 因此,您将评估源数据 E7 并在 E8 上输出。然后你会评估 E9,E10 上的输出,评估 E11,E12 上的输出吗?
  • 是的)完全是我的计划
  • @inconsistent 然后使用 For 循环中的第 2 步,每隔一个循环执行一次操作。然后你需要你的 if 语句依赖于 i-1 并且你的输出依赖于 i。确保您的循环转到最后一行 + 1。
  • 谢谢,但到目前为止我没有实现这一点。如果你能给出一个书面的例子,那就太好了
【解决方案2】:

因为我找到了解决问题的最终方法,所以我决定在这里分享它,以防有人也遇到它。

我试图在我的源代码中添加一个循环,因此我不必重复该操作。 在我的情况下,最好的循环是 While,因为我不知道我需要重复多少次操作。

While 'My conditions'
Dim endPoint, validPoint as Long 
   'Code'
endpoint = endpoint + 1
validPoint = validPoint +2
Wend

我创造了条件 端点 = '用我的数据' validPoint = '我的验证信息'

所以循环将遍历数据,然后验证数据,直到例如检查所有数据。

我的代码示例:

'Field 1 (D7) can only be populated with NEW or CANC'

If ThisWorkbook.Sheets("Tool").Range("D" & endPoint).Value = "NEW" Or ThisWorkbook.Sheets("Tool").Range("D" & endPoint).Value = "CANC" Then
    ThisWorkbook.Sheets("Tool").Range("D" & validPoint).Value = ""

ElseIf (ThisWorkbook.Sheets("Tool").Range("D" & endPoint).Value <> "NEW" Or ThisWorkbook.Sheets("Tool").Range("D" & endPoint).Value <> "CANC") And (ThisWorkbook.Sheets("Tool").Range("D" & endPoint).Value) <> 0 Then
    ThisWorkbook.Sheets("Tool").Range("D" & validPoint).Value = "error, wrong format"

Else: ThisWorkbook.Sheets("Tool").Range("D" & validPoint).Value = "Cannot be blank"

End If

感谢 stackoverflow 用户给予我的热情和帮助。谢谢各位!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-30
    • 2020-12-30
    • 2018-09-15
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多