使Excelmacros快速input数据::: VBA ::: Excel :::

我有一份工作要input调查结果(纸质表格),以达到最佳效果。 我从来没有写在办公室的任何macros:(

在这里,我基本上需要:

  1. 我有预定义的列(| A | B | … | AG | AH |)
  2. 所有的调查分组。 来自同一组的所有调查都没有(如预定义的)相同的列。 它总是与“定义”组相同的列
  3. 所有其他调查答案都是数字types[1..10]。
  4. 列的顺序与servey中的回答不相同
  5. 我想要macros将采取我的input(例如'1575'),并首先将预定义的值,以该'组'| A | | B | | C |,然后| E | = 1,| D | = 5,| F | = 7,| G | = 5,并自动开始input下一行。

任何会给我一个线索如何编写这个macros,而不仅仅是欢迎

非常感谢您阅读此…

编辑1:我想问题是不够清楚…我需要macros将读取我的键盘input('1575')和写入整数'1''5''7'和'5'预定义的行。 现在,我有一个想法来创build一个窗体,但是我需要事件处理函数,当我按下一个按键时,会将焦点改变为下一个input,因为我想避免一直按Tab键。

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

A组| E | D | F | G

和一个小代码一起去的forms,说:

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

 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中input四位数字,则会将它们分散到正确的列中。 它放在工作表的模块中,而不是一个标准模块。

如果我正确理解问题,则希望用户只能input数字,而不使用input或箭头来完成input。

例如,键入“1253216 …”而不是“1 2 5 …”

如果是这样,不幸的是没有任何事件对应于单个字符进入公式栏。 唯一与远程相关的事件是“select更改”和“更改”。 但是,我不认为有什么办法可以将它们用于此目的(在公式栏input过程中不会触发它们)。

一个想法:用文本格式创build和input列,并指示用户在一个大的string中input答案(如“1253216”等),然后将公式分配到input列中第n个字符的每个其他单元格并将其更改为一个值。 例如:

将范围名称“input”应用到列A,范围名称“N”到第1行,然后在任何其他单元格中,input以下公式:

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

缺点是,用户不知道他们是否犯了一些错误,直到他们完成键入整个string并按回车或箭头。