1

我的工作是输入调查结果(以纸质形式)以取得优异成绩。我从未在 Office 中编写过任何宏 :(

这是我基本上需要的:

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

任何能让我知道如何编写这个宏的东西都非常受欢迎

非常感谢您阅读本文...

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

4

3 回答 3

3

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

A组 | E | D | F | G

还有一些与表格一起使用的代码,例如:

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

于 2008-12-16T12:23:39.703 回答
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 列中输入四位数字,这会将它们分散到正确的列中。它进入工作表的模块,而不是标准模块。

于 2008-12-18T22:49:58.157 回答
-1

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

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

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

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

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

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

缺点是,用户在完成输入整个数字字符串并按下回车键或箭头之前,不会知道他们是否犯了一些错误。

于 2008-12-16T21:35:58.527 回答