如果用户跳过行以输入数值,则强制用户在以下可用行中键入数据

时间:2018-06-18 19:41:46

标签: vba excel-vba for-loop if-statement excel

我有一张工作表,用户输入在A7中开始,计算通过宏一直插入到B7中。

我得到了一切,但我需要的是:用户在A列中键入数据,让我们说他们输入数据从A7开始,通过A11,然后跳过A12并输入A13,我想要工作表自动将用户的输入移动到A12中,因此A列中的数据永远不会有空白行。

理想情况下,所有数据都应按顺序排列,并且在A列中输入的数据之间不应有任何空行。

这是我到目前为止提出的代码:

Private Sub worksheet_change(ByVal Target As Range)

Dim r As Integer
Dim c As Integer

1    If Not Intersect(Target, Range("A:C")) Is Nothing Then
        If Target.Row >= Range("FormulaRange").Row + 1 Then
            If Target.Row <= Range("RowTracker").Value + 1 Then
            Dim t
            RWS = Target.rows.Count
            COLS = Target.Columns.Count
                For r = 1 To RWS
                    For c = 1 To COLS
                        If Not IsNumeric(Target.rows.Cells(r, c).Value) Then
                        'Else
                            MsgBox "Please enter only numeric values."
                            Application.Undo
                            'End
                            Else

                        If Target.rows.Cells(r, 2) = "" Then Target.rows.Cells(r, 2) = 0
                        If Target.rows.Cells(r, 3) = "" Then Target.rows.Cells(r, 3) = 0

                        End If
                   Next c
                Next r
            Else

            MsgBox "Please enter data in the next available line."

            Exit Sub
            End If
        End If

    End If

End Sub

现在它检测到我是否跳过行并在A中任意输入给我一个警告,不要这样做但我很乐意它只是接受了我的输入并将其放回到A列的下一个可用行中。

我考虑过做一个Row.Delete,但设置代码的方式是不断检测已删除的行,因为跳过A列中的单元格不断给出错误“请在下一个可用行中输入数据。”

2 个答案:

答案 0 :(得分:2)

缺少关键点是在更改工作表时阻止级联事件。使用Application.EnableEvent = False来阻止此操作。

然后删除带有空格的行将会起作用,就像这样

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rw As Long
    Dim i As Long, j As Long
    On Error GoTo EH
    If Not Application.Intersect(Target, Me.Columns("A:C")) Is Nothing Then
        rw = Me.Cells(Me.Rows.Count, 1).End(xlUp).Row
        ' Prevent a cascade of events
        Application.EnableEvents = False

        For i = rw To 1 Step -1
            'Check for blanks in column A, delete row if found
            If IsEmpty(Me.Cells(i, 1)) Then
                Me.Rows(i).Delete
            End If

            'check for non numeric data
            For j = 1 To 3
                If Not IsNumeric(Me.Cells(i, j)) Then
                    Me.Cells(i, j).ClearContents
                End If
                'Enter Zeros's
                If j > 1 Then
                    If IsEmpty(Me.Cells(i, j)) Then
                        Me.Cells(i, j) = 0
                    End If
                End If
            Next

        Next
    End If
EH:
    ' restore event handling
    Application.EnableEvents = True
End Sub

注意:

  1. 删除行和检查非数字/空格会相互影响,可能是您不希望的方式
  2. 如果用户将列A留空并将数据输入其他列,则会将其删除
  3. 我遗漏了命名范围检查,因为我不确定他们在做什么。你可以恢复以适应。
  4. 在删除之前,最好验证并警告用户

答案 1 :(得分:1)

这样的操作会强制用户只能留在A列的下一行,而无法输入更多信息。

这不是万无一失的,但会让你开始。您可以根据需要进行扩展:

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Column = 1 And Target.Row <> 1 Then
        If Len(Target.Offset(-1)) = 0 Then
            Target.Offset(-1).Select
        End If
    End If

End Sub