选择数据区域对话框操作
选择数据区域对话框操作
引言
进行数据处理过程中,总会遇到这样一些情况:待处理数据存放到第几行第几列,最终结果保存在哪一行哪一列等。如果在代码中将这些数据全部写死,每次执行代码前需要反复的修改很不方便使用
此时我们就可以考虑使用Application.InputBox,它支持用户动态选择一个或多个单元格区域进行后续操作,界面显示大家一定不陌生,它既可以通过鼠标和Shift键选择一个Range区域
对话框引用
关于Application.InputBox详细语法及参数可以参考VBA手册:
https://learn.microsoft.com/zh-cn/office/vba/api/excel.application.inputbox
实际引用很简单,如下代码即可满足基本需要
Set selectedCell = Application.InputBox( _
Prompt:="请用鼠标选择删除表格区域", _
Title:="选择要删除的区域", _
Type:=8) ' Type=8 表示返回 Range 对象
因为Type为8时 Application.InputBox 会返回一个Range对象,所以变量 selectedCell 要定义成Range类型,其他两个参数为提示信息,根据实际情况修改
上述代码执行完毕,我们选择的单元格或是区域信息就全部保存到变量 selectedCell 中了
获取选定区域大小
获取选定区域的大小,就是明确用户选择了几行几列数据
举个例子,假如前台用户选择了区域A21:C23,并将这个区域信息传递给selectedCell
那么我们可以通过selectedCell.Rows.Count及selectedCell.Columns.Count获取这个区域的行数和列数。代码执行返回结果是3行3列,与选择区域信息一致
获取选定区域的单元格位置信息
为了后续的数据处理,我们会需要获取到单元格位置信息,有两种表达方式:
方式一通过行号和列号确定单元格位置信息
此时selectedCell.Cells(1, 1)代表选中区域的第一个单元格,也就是工作表中第21行1列对应的单元格,里面存放了序号是“4”
方式二 直接获取选定区域的单元格地址信息
直接使用.Address获取单元格地址A21
以上两种方式按照实际需要自由选择,能起到事半功倍的效果。同样方法我们可以获取到任意一个选中区域的单元格地址
获取这些数据有什么实际的意义呢 ?接下来举一个简单的实例加以说明
一张工作表中有若干个表格,让用户选择表格中一个区域进行删除操作,数据删除后其下面的数据自动上移,而不影响其他表格数据。删除前后效果图如下
Sub DeleteRowsFromNormalTable()
Dim selectedCell As Range
Dim rowCount As Long
Dim colCount As Long
Dim firstCell As String
Dim lastCell As String
Dim lastRow As Long, firstCellRow As Long, firstCellColumn As Long
Dim i As Long
' 让用户选择表格内的一个单元格
On Error Resume Next
Set selectedCell = Application.InputBox( _
Prompt:="请用鼠标选择删除表格区域", _
Title:="选择要删除的区域", _
Type:=8) ' Type=8 表示返回 Range 对象
On Error GoTo 0
' 检查用户是否取消选择
If selectedCell Is Nothing Then
MsgBox "操作已取消。", vbInformation
Exit Sub
End If
'计算选中区域行数和列数
rowCount = selectedCell.Rows.Count
colCount = selectedCell.Columns.Count
' ' 获取区域第一个单元格的行号
firstCellRow = selectedCell.Cells(1, 1).Row
firstCellColumn = selectedCell.Cells(1, 1).Column
' 获取第一个单元格地址
firstCell = selectedCell.Cells(1, 1).Address(False, False) ' False表示不使用绝对引用(如$A$1)
' 获取最后一个单元格地址
lastCell = selectedCell.Cells(rowCount, colCount).Address(False, False)
i = 1
'表格之间通过空白单元格隔开的,默认只要有空白单元格出现表格结束
Do While Cells(firstCellRow + rowCount + i, firstCellColumn) <> ""
i = i + 1
Loop
'获取该表格最后一行数据所在位置:行号
lastRow = firstCellRow + rowCount + i - 1
selectedCell.Clear '删除区域数据
Range(Cells(firstCellRow + rowCount, firstCellColumn), Cells(lastRow, firstCellColumn + colCount)).Cut
Range(firstCell).Insert Shift:=xlDown
MsgBox "选择区域已删除!"
End Sub

浙公网安备 33010602011771号