Vba代码报错?
网友解答: '从字面来分析: bg.Name = Sheet1.Cells(i, l)'其完整写法如下: bg.Name = Sheet1.Cells(i, l).Value'意思是:工
'从字面来分析: bg.Name = Sheet1.Cells(i, l)
'其完整写法如下: bg.Name = Sheet1.Cells(i, l).Value
'意思是:工作表bg的名称和Sheet1.Cells(i,l)里存储的值相同
'结合你前面的代码:
'If Sheets.Count 1 then这段实际上就是把除了名称为"Sheet1"的工作表以外的其他工作表都删除了。
'下面For each bg In Sheets,这一行实际就没意义了,因为Sheets里总共就只有一个成员。
'没有文档,尝试猜测一下你的意思:
'1、L记录用户输入的列号,从下文看,L是列号,并不是行
'2、关闭删除表时的提示
'3、删除除"Sheet1"以外的所有工作表
'4、开启提示,这里应该是True
'5、然后重新根据"Sheet1"的(2-最后行L列)的内容新建一系列工作表
'6、然后从Sheet1中筛选数据,并逐个存储到新建的一系列工作表中去
'以下我先抱个歉:
'1.代码可读性实在是太差了
'2.逻辑上不清楚的地方比较多
'我稍微理一下,仅供参考:
Sub SheetSplit()
Application.ScreenUpdating = False '关闭屏幕刷新,提高执行效率
Dim i&, j&, aRow&
Dim bk As Workbook
Dim sht As Worksheet
Dim shtNew As Worksheet
Set bk = ThisWorkbook
j = InputBox("以哪一列为基准?")
'删除工作表
Application.DisplayAlerts = False
For Each sht In bk.Worksheets
If sht.Name < "Sheet1" Then sht.Delete
Next sht
Application.DisplayAlerts = True
'重建工作表
Set sht = bk.Worksheets("Sheet1")
aRow = sht.Range("A" & sht.Rows.Count).End(xlUp).Row
For i = 2 To aRow
If False = SheetExist(bk, sht.Cells(i, L)) Then
Set shtName = bk.Worksheets.Add(After:=bk.Worksheets(bk.Worksheets.Count))
shtNew.Name = sht.Cells(i, j).Value
'实际可以这么简写,但是新手没有判断能力,不推荐
'bk.Worksheets.Add(After:=bk.Worksheets(bk.Worksheets.Count)).Name = sht.Cells(i, j).Value
End If
Next i
'拆分数据
For i = 2 To bk.Worksheets.Count
'这里实在猜不下去了,又来了一个"A1:D1943"列,Field:=4,实在猜不透想作甚
'算了,继续猜,假设是对用户输入的"L"列做筛选
Set shtNew = bk.Worksheets(i)
sht.Range(sht.Cells(1, 1), sht.Cells(1943, L)).AutoFilter Field:=L, Criterial:=shtNew.Name
sht.Range("A1:" & L & aRow).Copy shtNew.Range("A1") '这两行代码未验证,直接抄的你的
Next i
Application.ScreenUpdating = True
End Sub
Function SheetExist(bk As Workbook, ByVal shtName As String) As Boolean
Err.Clear
On Error Resume Next
Dim shtTemp As Worksheet
Set shtTemp = bk.Worksheets(shtName)
SheetExist = (Err.Number = 0)
End Function
网友解答:很明显引用对象不存在。