Sub 遍历旧员工并创建新员工工作表() Dim x%, y% y = Sheets.Count For x = 2 To y '工作表循环 k = k + 1 '新员工递增 If Cells(k + 1, 1) <> Sheets(x).Name Then Sheets.Add(after).Name = Cells(k + 1, 1) '如果目录中有不同员工,则创建工作表 End If Next End Sub 不知道哪里不对劲,救救孩子
是需要按照目录表的名字建立工作表吗,可以关闭错误后直接建立,已经存在的表不会变化,例如这样写: Sub 遍历旧员工并创建新员工工作表() Dim arr, i& On Error Resume Next '关闭报错 arr=Sheets("目录").UsedRange For i = 2 To UBound(arr) Sheets.Add(after:=Sheets(Sheets.Count)).Name = Trim(arr(i,1)) Next i End Sub
Sub 遍历旧员工并创建新员工工作表() Dim arr, i&, st as worksheet arr=Sheets("目录").UsedRange For i = 2 To UBound(arr) arr(i,1) = Trim(arr(i,1)) On Error Resume Next '关闭报错 Set st = Nothing Set st = Sheets(arr(i,1)) On Error Goto 0'打开报错 If st Is Nothing Then Sheets.Add(after:=Sheets(Sheets.Count)).Name = arr(i,1)) Next i End Sub
On Error Resume Next For I = 0 To 2 Cells(I, 1) = I Next Sub 遍历旧员工并创建新员工工作表() Dim x%, y% y = Sheets.Count For x = 2 To y '工作表循环 k = k + 1 '新员工递增 If Cells(k + 1, 1) <> Sheets(x).Name Then Sheets.Add(after).Name = Cells(k + 1, 1) '如果目录中有不同员工,则创建工作表 End If Next End Sub 代码分析一下 Dim x%, y% 这里表扬一下比较规范, 很多人喜欢 Dim x,y as integer 其实这样表达 x 并不是 integer y = Sheets.Count 这个没问题,Y=4 For x = 2 To y '工作表循环 循环开始 x=2 k = k + 1 '新员工递增 这里 K没有定义变量,收回前面的表扬 K默认为0 那么现在K=1 If Cells(k + 1, 1) <> Sheets(x).Name Then 代入变量x=2 这句的判断就是 当前表格单元格 A1 的值 是否等于 第二张表的名称 如图所示 第二张表Name是张一 A1=第二张表的.name 进入下一个循环x=3 k=k+1 k=2 A2=sheet(3).name 继续下一个循环 直到 X=4 ,K=3 程序结束,你的代码 从未进入IF 的子代码中。。。 这事思路上的错误。。。 我也不多废话了,直接上代码 Sub a() Dim I%, Arr Arr = Application.WorksheetFunction.Transpose(Range([A2], _ Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)).Value) For I = 1 To UBound(Arr) SS (Arr(I)) Next End Sub Function SS(X As String) Dim D As String On Error Resume Next D = Sheets(X).Name If Err.Number = 0 Then Exit Function Sheets.Add(after:=Sheets(Sheets.Count)).Name = X End Function 说明: 把A列数据 放入 Arr数组, 像你直接用 Cells(k + 1, 1) 这个是当前表格 如果还是如此循环,那么在第一次建立表格后,会跳到新的表格,然后Cells(k + 1, 1)这个值,接下来的就会变成空白了。 子程序, D = Sheets(X).Name 让变量D 等于 名字的表格,看似废话,但是作用就是看这个D能不能被赋值 如果表格存在,D就是有值的,如果表格不存在就会报错。 然后查看Err的值,如果是0 表示表格存在,退出子程序 如果表格不存在,Err的值就是非0,那么就按名称建立表格 把On Error Resume Next 放入子程序的好处是,主程序该报错还是要报错。。。 举个例子 你建立表格后,还要把数据写入 举个例子 A1 A2 A3 写入 0 1 2 然后你写错了就像这样 for i=0 to 2 cells(i,1)=i next 因为单元格没有 A0 所以 当I=0的时候 会报错 但是因为On Error Resume Next的缘故 他会继续执行 于是 最后的结果是 A1 A2 有 1 和 2 但是 A3没有 程序也不报错。。。。 你可以试一下 for i=0 to 2 cells(i,1)=i next 和 On Error Resume Next For I = 0 To 2 Cells(I, 1) = I Next 这2段代码,你就明白了 为什么我要把 On Error Resume Next 放入子程序