Excelmacros用于创build新的工作表

我试图循环通过连续的一些列,并创build新的工作表与我所在的当前列/行的值的名称。

Sub test() Range("R5").Select Do Until IsEmpty(ActiveCell) Sheets.Add.Name = ActiveCell.Value ActiveCell.Offset(0, 1).Select Loop End Sub 

这段代码创build了第一个从R5开始的正确的代码,但是看起来macros切换到该工作表并且没有完成任务。

Sheets.Add自动将您的select移动到新创build的工作表(就像手动插入新工作表一样)。 因此,偏移量基于现在已经成为您的select的新工作表的单元格A1 – 您select一个空单元格(因为工作表是空的)并且循环终止。

 Sub test() Dim MyNames As Range, MyNewSheet As Range Set MyNames = Range("R5").CurrentRegion ' load contigeous range into variable For Each MyNewSheet In MyNames.Cells ' loop through cell children of range variable Sheets.Add.Name = MyNewSheet.Value Next MyNewSheet MyNames.Worksheet.Select ' move selection to original sheet End Sub 

这将更好地工作….您将名称列表分配给Rangetypes的对象variables,并在For Each循环中执行此操作。 完成后,将select放回原来的位置。

Sheets.Add将自动使您的新工作表成为活动工作表。 你最好的办法是把variables声明给你的对象(这总是最佳实践)并引用它们。 看到我已经做了如下:

  Sub test() Dim wks As Worksheet Set wks = Sheets("sheet1") With wks Dim rng As Range Set rng = .Range("R5") Do Until IsEmpty(rng) Sheets.Add.Name = rng.Value Set rng = rng.Offset(0, 1) Loop End With End Sub 

从列表中命名工作表时,应始终使用error handling

  • 表格名称中的无效字符
  • 表名太长
  • 复制表单名称

请更改Sheets("Title")以匹配标题表的表格名称(或位置)

下面的代码使用variables数组而不是表格名称的范围,但出于性能原因,closuresScreenUpdating可能会对用户产生最大的影响

 Sub SheetAdd() Dim ws1 As Worksheet Dim ws2 As Worksheet Dim strError As String Dim vArr() Dim lngCnt As Long Dim lngCalc As Long Set ws1 = Sheets("Title") vArr = ws1.Range(ws1.[r5], ws1.[r5].End(xltoRight)) If UBound(vArr) = Rows.Count - 5 Then MsgBox "sheet range for titles appears to be empty" Exit Sub End If With Application .ScreenUpdating = False .EnableEvents = False lngCalc = .Calculation End With For lngCnt = 1 To UBound(vArr) Set ws2 = Sheets.Add On Error Resume Next ws2.Name = vArr(lngCnt, 1) If Err.Number <> 0 Then strError = strError & vArr(lngCnt, 1) & vbNewLine On Error GoTo 0 Next lngCnt With Application .ScreenUpdating = True .EnableEvents = True .Calculation = lngCalc End With If Len(strError) > 0 Then MsgBox strError, vbCritical, "These potential sheet names were invalid" End Sub 

这可能是最简单的。 没有error handling,只是一次性的代码来创build工作表

 Sub test() Workbooks("Book1").Sheets("Sheet1").Range("A1").Activate Do Until IsEmpty(ActiveCell) Sheets.Add.Name = ActiveCell.Value Workbooks("Book1").Sheets("Sheet1").Select ActiveCell.Offset(0, 1).Select Loop End Sub