我有一张工作表,用户输入在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列中的单元格不断给出错误“请在下一个可用行中输入数据。”
答案 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 :(得分: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