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

网友解答:

很明显引用对象不存在。

标签: