Excel VBA定义标准用户输入字段

时间:2014-12-11 19:40:26

标签: excel vba input field cell

我有7列代表7种不同的(让我们称之为)输入源。

每列的第1行都有每个来源的名称。

每列的第2行是第4列中所有行的总和。例如:A2 = SUM(A4:A1048576)

由于我习惯于对每一列进行随机输入,我希望每列的第3行是标准用户输入字段,以便每列第3行输入的任何值都附加到该列的第一个空单元格中,由某些事件触发(按键,按钮,sheetupdate?)。也就是说,“A3”中列“A”的第一个条目将被置于“A4”中,“A3”的第二个条目应被置于“A5”中,依此类推。每列独立地相同。另外,如果可能的话,我希望最后清除第3行中的单元格。

我该怎么做? 请回答完整的教程解释或重要的教程解释,因为我对EXCEL和VBA的经验几乎没有。

1 个答案:

答案 0 :(得分:0)

对于其他找到此答案的人,请了解每列都独立于其他列,因此如果行数因列而异,则无关紧要。

将以下代码粘贴到您计划使用的工作表中。这将仅监视第3行中的更改(但所有列 - 您可以更改为仅监视要监视的七列)。

当在第3行中检测到更改时,确定该列,然后找到该列的最后使用的ROW。输入的值将移至第一个可用行,第3行中输入的值将被删除,第2行中的SUM将更新以反映新的和范围。

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ColName     As String
Dim lLastRow    As Long     ' Saves Last Row for any column
Dim lColumn     As Long

    ' This will monitor changes made in row 3 only.
    ' - move entered value to end of column
    ' - erase row 3 value entered
    ' - change 'SUM' in row 2 to reflect new row

    On Error GoTo Enable_Events         ' Need this! If error, need to enable events!!
    If Target.Row <> 3 Then Exit Sub    ' Only track row 3 changes
    Application.EnableEvents = False    ' Turn off event tracking because we make changes

    lColumn = Target.column     ' Get column that's being used.

    With ActiveSheet            'Find the last used row in a Column
        lLastRow = .Cells(.Rows.Count, Target.column).End(xlUp).Row
    End With

    Cells(lLastRow + 1, Target.column).value = Target.value     ' Move value to end
    Target.value = ""               ' Clear value entered

    ' Get Column name (A, B, C...) then create new SUM
    ColName = Left(Cells(1, lColumn).Address(False, False), 1 - (lColumn > 26))
    Cells(2, lColumn).Formula = "=SUM(" & ColName & "4:" & ColName & lLastRow + 1 & ")"

Enable_Events:
    Application.EnableEvents = True
End Sub