level 1
虽然我看不懂,但是你这一行不用写这么麻烦。sheet("sheet1").range("A1").end(xldown)+1
这个就能表示第一个空白行行号
2023年02月12日 00点02分
2
第一个是sheets,少打了一个s
2023年02月12日 00点02分
@川页从 Excel vba不需要设东西的,有问题只有可能是代码问题
2023年02月12日 23点02分
level 1
Sub 存储表格()
'=========================使用方法=========================
'在导入表格中,用选区选择需要复制的行号。
'运行宏后,选区中的每一行,将会被复制到储存表格中。
'选区中的行将会被删除。
'注1:自行修改基础参数
'=========================设计大纲=========================
'检测基础参数是否有效,包括检测以下七种情况:
' 1、导入表格名称为空
' 2、储存表格名称为空
' 3、导入表格不存在
' 4、储存表格不存在
' 5、导入表格与储存表格输入了同一名称
' 6、导入表格的有效数据行号不为正整数
' 7、导入表格的有效数据行号不为正整数
'检测选区是否在导入表格中,如果不在,则提示并停止运行
'获取选区范围,分割并依次检测选区中的每一行
'每计算一行,将该行的第一列改为"<已导入>",以此防止重复运算
'将选区内的每一行复制至储存表格末尾(包括值、格式、行号,但不包括列宽)
'删除所有的已导入行
'提示导入完成
'=========================基础参数=========================
Dim ImportSheet As String '导入表格名称
ImportSheet = "销售清单"
Dim SaveSheet As String '储存表格名称
SaveSheet = "历史清单"
Dim ImportValidDataRow As Integer '导入表格的有效数据是从第几行开始的(防止计算表格抬头)
ImportValidDataRow = 2
Dim SaveValidDataRow As Integer '储存表格的有效数据是从第几行开始的(防止计算表格抬头)
SaveValidDataRow = 2
'==========================================================
On Error GoTo Err1 '如果出现错误,跳转至Err1并停止计算
'以Name属性获取表格名称,判断工作簿是否存在
Dim ImportSheetCode As String
Dim SaveSheetCode As String
For Each Sheet In Sheets
If ImportSheet = Sheet.Name Then ImportSheetCode = Sheet.CodeName
If SaveSheet = Sheet.Name Then SaveSheetCode = Sheet.CodeName
Next
'排除基础参数输入错误的情况
If ImportSheet = "" Then MsgBox "基础参数中,导入表格名称不能为空。", vbOKOnly, "基础参数错误": Exit Sub
If SaveSheet = "" Then MsgBox "基础参数中,储存表格名称不能为空。", vbOKOnly, "基础参数错误": Exit Sub
If ImportSheetCode = "" Then MsgBox "基础参数中,导入表格不存在。", vbOKOnly, "基础参数错误": Exit Sub
If SaveSheetCode = "" Then MsgBox "基础参数中,储存表格不存。", vbOKOnly, "基础参数错误": Exit Sub
If ImportSheet = SaveSheet Then MsgBox "基础参数中,导入表格名称不能与储存表格名称相同。", vbOKOnly, "基础参数错误": Exit Sub
'一个数下取整后不等于其本身,则这个数不是整数
If ImportValidDataRow <> Abs(Int(ImportValidDataRow)) Or ImportValidDataRow <= 0 Then MsgBox "基础参数中,导入表格的有效数据行号必须为正整数。", vbOKOnly, "基础参数错误": Exit Sub
If SaveValidDataRow <> Abs(Int(SaveValidDataRow)) Or SaveValidDataRow <= 0 Then MsgBox "基础参数中,储存表格的有效数据行号必须为正整数。", vbOKOnly, "基础参数错误": Exit Sub
If Selection.Worksheet.Name <> ImportSheet Then
'如果选区不在"销售清单"中,提示选择销售清单中的区域并停止计算
MsgBox "请于销售清单中建立选区,以导入历史清单。", vbOKOnly, "存储表格"
Exit Sub
End If
'选区可能会有多个,多个选区之间以逗号分割
Dim Sel As Variant '保存选区位置
Sel = Split(Replace(Selection.Address, "$", ""), ",") '去除列表中的“$”号,并以“,”分割
For j = 0 To UBound(Sel)
With Sheets(ImportSheet).Range(Sel(j))
For i = .Row To .Row + .Rows.Count - 1 '逐一计算选区中的每一行
'由于选区间行号有可能重叠,每计算一行,将该行第一列改为“<已导入>”
'如果该行第一列为“<已导入>”,或者这一行为表格抬头,或者这一行在空白行之后,则跳过计算
If Sheets(ImportSheet).Cells(i, 1) <> "<已导入>" And i >= ImportValidDataRow And i < TheLastRow(ImportSheet) Then
Sheets(ImportSheet).Rows(i).Copy
'在历史清单末尾,插入复制单元格。
'如果历史清单第二行为空,则插入第二行,否则,插入在End(xlDown)后
'防止没有数据时End(xlDown)返回表格末尾
Sheets(SaveSheet).Rows(TheLastRow(SaveSheet)).Insert Shift:=xlDown
Sheets(ImportSheet).Cells(i, 1) = "<已导入>"
End If
Next
End With
Next
Dim WorkTime As Integer '工作次数,记录本次工作储存了多少行数据
'从销售清单末尾向前逐行检测(删除一行时,之后的每一行行号会减少一,容易出错,故逆向逐行检测)
For i = TheLastRow(ImportSheet) To 2 Step -1
'如果这一行已经导入,删除整行
If Sheets(ImportSheet).Cells(i, 1) = "<已导入>" Then
Sheets(ImportSheet).Rows(i).Delete Shift:=xlUp
WorkTime = WorkTime + 1
End If
Next
'完成导入,弹出提示
If WorkTime = 0 Then
MsgBox "未在选区内找到有效数据。", vbOKOnly, "存储表格"
Else
MsgBox "已完成导入,本次导入了 " & WorkTime & " 行。", vbOKOnly, "存储表格"
End If
Exit Sub
Err1:
End Sub
'输入工作簿名称,返回表格末尾空白行
Function TheLastRow(SheetName As String) As Integer
With Sheets(SheetName).UsedRange
TheLastRow = .Row + .Rows.Count
End With
End Function
2023年02月13日 03点02分
5
"导入表格的有效数据是从第几行开始的(防止计算表格抬头)"指的是你表格一般前面几行会用来写"名称"、"单位"、"数量"之类的,这些抬头不允许进入计算。这个值应该填写(抬头总行数+1)
2023年02月13日 03点02分
选区选择行号并不一定需要选择一整行,只要选择到这一行中随意一个单元格,都可以进行储存。可以使用Ctrl进行多选,一次性储存多个选区
2023年02月13日 03点02分
感谢3楼提供的更好地获取空白行的方法
2023年02月13日 03点02分
该宏不会储存跨行的合并单元格,但会正常删除该行。如果第一列出现跨行合并单元格,该宏无法正常运行。但由于一般的数据表中不可能存在合并单元格,该问题并不在考虑范围。
2023年02月13日 03点02分