答案1
其他答案使用了 Excel 的内置数据表。这提供了一种强大的机制,无需 VBA 即可在数据列表中添加/编辑/删除数据行。数据表单具有以下功能
- 从功能区/快速访问工具栏激活时,它默认为第一个数据行,但允许直观导航到后续行
- 数据列表中的所有字段(列)都是可编辑的,并且提供了单独的一行文本框来更改每个字段
在某些情况下,这些功能可能不太理想 - 例如当数据项包含非常长的文本字符串时。
作为数据表单的替代方案,以下解决方案使用用户窗体。用户表单比数据表单提供了更大的灵活性,但缺点是需要 VBA 编码和一些设计技能。所示的用户表单基于对 OP 要求的以下假设
- 用户表单的主要要求是查看和更改列中的内容注1,笔记2,笔记2和注4数据列表
- 这姓名和用户身份列仅用于标识数据行。这两列中的值是正确的,不需要更改
- 不需要用户窗体提供添加或删除数据列表行的功能
- 应该能够灵活地在数据列表的行之间移动
- 用户窗体应该能够被打开和关闭
用户窗体显示在下面的屏幕截图中。
用户表单的行为
- 当工作表处于“表单模式”(见下文 4.)时,选择单身的任何列标题内的单元格注1,笔记2,注3或者注4显示相应内容笔记项目,以及姓名和用户身份行首的值。笔记涉及 (注1,笔记2,注3或者注4) 由用户窗体中大文本框左侧的标签表示。用户窗体是模态的,因此用户必须与窗体交互才能继续。
- 大号文字笔记用户可以更改文本框。标有“保存更改”的按钮将文本框的当前内容写入相应的笔记工作表单元格并“关闭”用户窗体(将其从显示中删除)。标有“取消”的按钮也会“关闭”用户窗体,但不会更新相应的笔记细胞。
- 用户表单中不提供导航功能。相反,用户可以“关闭”表单(使用两个按钮之一)并可以使用标准 Excel 界面导航到其他单元格。只要工作表上当前选定的单元格满足上述 1. 中指定的条件,表单就会重新出现。
- 工作表将保持“表单模式”,直到使用“关闭”按钮(表单右上角的标准“X”)关闭用户表单。可以通过运行宏将工作表重新置于“表单模式”
FormMode
。
结构和组织
- 数据(包括标题行和姓名和用户身份列包含在名为
MyData
- 用户窗体名为
EditForm
。该窗体包含 5 个标签、1 个文本框、2 个按钮和标题栏上的标准“关闭按钮”。EditForm
具有一个布尔属性EditOn
,用于确定“窗体模式”是打开还是关闭。 - 有一个 VBA 模块声明了几个
Public
变量intDataRow
,intDataColumn
它们是包含单元格的行和列MyData
,提供了笔记文本框显示在 中EditForm
。该模块还包含一个宏FormMode
,它只需通过分配即可打开“表单模式”EditForm.EditOn = True
。 - 工作表包含
MyData
一个Worksheet_SelectionChange
程序。此程序测试- “表单模式”是否开启
- 工作表上是否选择了单个单元格
- 此单元格是否包含在笔记列
MyData
(标题行之后)如果任何测试失败,该过程将不执行任何操作。否则,它将计算所选单元格的intDataRow
和值,并通过其方法显示。intDataColumn
EditForm
Show
- EditForm 模块包含以下步骤:
Property Let
以及用户窗体的Property Get
属性EditOn
UserForm_Activate
事件过程。该事件由 (见上文 4.)触发EditForm.Show
,并根据intDataRow
和的当前值从工作表中填充用户窗体intDataColumn
。- “保存更改”和“取消”按钮的按钮
_Click
程序。前者使用Range("MyData").Cell(intDataRow,intDataColumn)
用户窗体的文本框的内容进行更新。这两个程序都通过窗体的方法从显示中删除用户窗体(“关闭”它)Hide
。
VBA 项目的屏幕截图如下所示。
该表单虽然基础但功能齐全。显然可以进行调整和改进以满足需求。它提供的模型与 Excel 的数据表单不同。
使用的 VBA 代码如下所示。
包含 MyData 范围的工作表代码
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not EditForm.EditOn Then
Exit Sub
End If
If Target.Rows.Count > 1 Or _
Target.Columns.Count > 1 Then
Exit Sub
End If
If Target.Row < Range("MyData").Row + 1 Or _
Target.Row > Range("MyData").Row + Range("MyData").Rows.Count - 1 Or _
Target.Column < Range("MyData").Column + 2 Or _
Target.Column > Range("MyData").Column + Range("MyData").Columns.Count - 1 Then
Exit Sub
End If
intDataRow = 1 + Target.Row - Range("MyData").Row
intDataColumn = 1 + Target.Column - Range("MyData").Column
EditForm.Show
End Sub
表单代码 EditForm
Option Explicit
Private pEditMode As Boolean
Public Property Let EditOn(bValue As Boolean)
pEditMode = bValue
End Property
Public Property Get EditOn() As Boolean
EditOn = pEditMode
End Property
Private Sub UserForm_Activate()
Name_Field.Caption = Range("MyData").Cells(intDataRow, 1)
UserID_Field.Caption = Range("MyData").Cells(intDataRow, 2)
NoteLabel.Caption = "Note" & (intDataColumn - 2) & ":"
Note_Field.Value = Range("MyData").Cells(intDataRow, intDataColumn)
End Sub
Private Sub CancelButton_Click()
Me.Hide
End Sub
Private Sub SaveButton_Click()
Range("MyData").Cells(intDataRow, intDataColumn) = Note_Field.Value
Me.Hide
End Sub
模块代码
Option Explicit
Public intDataRow As Integer
Public intDataColumn As Integer
Sub FormMode()
EditForm.EditOn = True
End Sub
答案2
以下是如何添加 VBA 宏来显示 数据表 当前行。
在 Excel 中 显示“开发工具”选项卡
将工作簿另存为启用宏的
.xlsm
文件(不是.xlsx
)转到“开发人员”选项卡
单击“Visual Basic”
选择菜单项插入 > 模块
在打开的文本编辑器中,复制以下文本:
Option Explicit Sub CurrRowForm() SendKeys "{DOWN " & ActiveCell.Row - 2 & "}{TAB 3}" Application.DisplayAlerts = False ActiveSheet.ShowDataForm Application.DisplayAlerts = True End Sub
按Ctrl+保存,然后按+S 退出 VBA 编辑器 AltQ
测试新的宏:
您可以通过以下方式为宏指定热键:
- 进入开发人员 > 宏
CurrRowForm
确保选择了宏- 单击“选项”
- 选择您的快捷键
- 单击“确定”
您也可以CurrRowForm
在功能区中添加宏按钮。
答案3
我还没有读到任何提及Windows 中数据选项卡、Data Entry
组、键上的内置 Excel 数据表单的评论。Alt A Y 2
公式是只读的,单元格保护得以维护;但是,无法更改字段的高度或宽度。
字段会自动加宽,但只能加宽到一定程度。您可以设置热键来避免使用功能区键序列。