制作Excel宏以便快速输入数据::: VBA ::: Excel :::

时间:2008-12-16 08:40:43

标签: excel vba excel-vba ms-office

我有一份工作可以将调查结果(纸质形式)输入excel。 我从未在Office中写过任何宏:(

这是我基本上需要的东西:

  1. 我有预定义的列(| A | B | ... | AG | AH |)
  2. 所有调查都分组。来自同一组的所有调查都很少(如预定义)相同的列。它总是与“定义”组
  3. 相同的列
  4. 所有其他调查答案均为数字类型[1..10]。
  5. 列与servey中的答案的顺序不同
  6. 我想要接受我的输入的宏(例如'1575'),并首先将预定义值放到该'组'到| A | | B | | C |,然后是| E | = 1,| D | = 5,| F | = 7,| G | = 5,并自动开始进入下一行。
  7. 任何可以让我知道如何在欢迎

    中编写此宏的线索

    非常感谢您阅读此内容......

    EDIT1:我想问题不够明确...... 我需要宏来读取我的键盘输入('1575')并将整数'1''5''7'和'5'写入预定义的行。现在,我有一个创建表单的想法,但我需要事件处理程序,当我按下一个键时会将焦点更改为下一个输入,因为我想避免一直按TAB ...

3 个答案:

答案 0 :(得分:3)

在我看来,你需要一个只有一个文本框的小用户表单,一个显示数据输入顺序的范围,比如说:

A组| E | D | F | ģ

和表格一起使用一些代码,说:

Dim LastCol As Integer
Dim CurRow As Integer


Private Sub UpdateCells()
Dim Col As Variant
Dim ColumnOrder As Range

'Range that specifies data entry order'
Set ColumnOrder = Range("A3:A15")

LastCol = LastCol + 1

If LastCol > WorksheetFunction.CountA(ColumnOrder) Then
    LastCol = 1
    CurRow = CurRow + 1
End If

Col = Range("A3").Offset(0, LastCol)
Range(Col & CurRow) = TextBox1.Value
TextBox1 = ""

End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
    UpdateCells
End If
End Sub

Private Sub UserForm_Initialize()
CurRow = ActiveCell.Row
End Sub

编辑重新评论

在Excel中,最后一行可能有点棘手,因为Excel不会更新范围 删除后直到保存工作簿。其中一个可能适合:

Function FindLastRow()
'Assuming that data starts in A1'
r = ActiveSheet.UsedRange.Rows.Count
c = ActiveSheet.UsedRange.Columns.Count
FindLastRow = r
End Function

Sub LastRow()
LastRowA = ExecuteExcel4Macro("GET.DOCUMENT(10)")
LastRowB = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
End Sub

更多信息:http://www.tek-tips.com/faqs.cfm?fid=2115

答案 1 :(得分:1)

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim sText As String

    Application.EnableEvents = True

    If Target.Column = 1 Then  'Four digits entered in col A
        sText = CStr(Target.Value) 'convert to string
        If Len(sText) = 4 Then
            Target.Offset(0, 4).Value = Left$(sText, 1) 'write to E
            Target.Offset(0, 3).Value = Mid$(sText, 2, 1) 'D
            Target.Offset(0, 5).Value = Mid$(sText, 3, 1) 'F
            Target.Offset(0, 6).Value = Mid$(sText, 4, 1) 'G
        End If
    End If

    Application.EnableEvents = True

End Sub

如果在A栏中输入四位数字,则会将它们分散到正确的列。它位于工作表的模块中,而不是标准模块。

答案 2 :(得分:-1)

如果我正确理解了这个问题,您希望用户只能输入数字,而无需使用输入或箭头来完成输入。

例如,输入“1253216 ...”而不是“1 2 5 ...”

如果是这样,遗憾的是没有与进入公式栏的单个字符相对应的事件。唯一与远程相关的事件是选择更改和更改。但是,我认为没有任何方法可以将这些用于此目的(在公式栏输入过程中不会触发它们)。

一个想法:使用文本格式创建和输入列,并指示用户在一个大字符串中键入答案(如“1253216”等),然后将公式放在每个其他单元格中,从而解析出第n个字符输入列并将其更改为值。例如:

将范围名称“输入”应用于A列,范围名称“N”应用于第1行,然后在任何其他单元格中,将此公式:

=VALUE(MID(Inputs,N,1))

缺点是,用户在完成输入整个数字串并输入或箭头后才会知道是否出现了错误。