【问题标题】:Can't rename sheets in vba无法在 vba 中重命名工作表
【发布时间】:2016-03-08 02:44:03
【问题描述】:

我正在制作一个简单的脚本,从不同的工作簿中取出一堆工作表并将它们放在一个工作簿上。我必须重命名所有工作表,以便它们与我拥有的其他脚本一起使用。除了我从 eod 循环中得到的工作表之外,所有工作表都被重命名了。前两张纸被重命名得很好,但之后循环中的一张都没有。来自 eod 表的所有工作簿都是 xlsx 格式,其余的是 xls 格式。宏完成后,我放入的每张 xls 表格都会关闭,但所有 xlsx 格式文件都不会。我不知道这是否是问题的一部分。什么会导致这只重命名某些工作表?

     Sub getSheets()
        num = 1
 ----->   ' loop for eod 
        Do Until copyover("Weekly", "EOD Week " & num) = False
            num = num + 1
        Loop

        temp = copyover("Voice_of_the_Customer", "VOC")
        temp = copyover("Daily_Cp%_v2", "COMP")
        temp = copyover("MPJ-Scorecard-QC-Summary", "QC")
        temp = copyover("MPJ-Scorecard-SCOI-Summary", "SCOI")
        temp = copyover("TechUpstreamTransmit", "UPSQ")
        temp = copyover("Daily_CCG_OTG", "MTF")
        temp = copyover("summary", "S7 QC")
        temp = copyover("MPJ-Scorecard-TCF-Summary", "TCF")

    End Sub

Function copyover(SheetAd As String, SheetName As String) As Boolean

    Dim origWork As Workbook
    Dim fileName As String
    Dim copytoFile As Variant
    Dim copytoFile2 As Workbook
    Set origWork = ActiveWorkbook

    tem = MsgBox("Do you want to add " & SheetName, vbYesNoCancel)
    If (tem = vbYes) Then
        copyover = True
        On Error GoTo ErrHandler
        copytoFile = Application.GetOpenFilename _
        (Title:=SheetAd, _
        FileFilter:="Excel Files *.x* (*.x*),")
        Workbooks.Open copytoFile
        Set copytoFile2 = ActiveWorkbook
        copytoFile2.Sheets(SheetAd).Move After:=origWork.Sheets("TechScore")
        'ActiveSheet.Name = SheetName
        origWork.Activate
        origWork.Sheets(SheetAd).Name = SheetName
        'ThisWorkbook.VBProject.VBComponents(SheetAd).Name = "Mudface"
         Workbooks(copytoFile).Close False
    Else
    If (tem = vbNo) Then
          copyover = False
    End If
    End If

ErrHandler:

End Function

【问题讨论】:

  • 如何创建目标文件?它是否可能只有 65536 行,因此无法容纳 xlsx 工作表?
  • 工作表复制得很好,但它不会在循环中重命名第三个。我正在导入的工作表上只有 120 行。
  • 尽可能远离ActiveWorkbook。这真是一条危险的路。将Set origWork = ActiveWorkbook 更改为Set origWork = Workbooks("whateveryourwbnameis.xlsx") 并将Set copytoFile2 = ActiveWorkbook 更改为Set copytoFile2 = Workbooks(copytoFile) 然后,设置你的断点......它将帮助你理解为什么代码没有达到你的预期。
  • 您知道如何单步执行您的代码吗?尝试单步执行您的代码,看看您的函数是否出错
  • 我单步执行了代码,发现错误处理程序隐藏了错误。我摆脱了错误处理程序,我发现我无法命名最后 3 张纸的原因是因为该名称已经在使用中。我之前隐藏了另一个文件,所以我只是删除了它并且它有效。谢谢

标签: excel vba


【解决方案1】:

这对我来说很难理解。看起来你的编码方式相当危险。 origWork 从未初始化。如果您将“选项显式”放在模块/工作表代码中的所有代码之上,它可能会对您有所帮助。我认为你的部分工作基本上是迷失在某个地方的记忆中,并且永远不会在你认为的地方结束。尝试在某些关键行添加断点并检查正在引用哪些工作簿。这是关于 VBA 的一件非常非常好的事情,因为您可以在它运行时调试/编辑变量。

【讨论】:

  • 是的,我很想为他重写代码,但是我今天工作太忙了。 +1 输入我的想法。
【解决方案2】:

如果您只想重命名具有特定名称的某些工作表,我已经制作了几个宏来快速完成此操作:

宏 1

Sub Sheetlist()
Dim x As Integer

Sheets.Add After:=ActiveSheet
ActiveSheet.Name = "sheetlist"
Range("A1").Select
ActiveCell.FormulaR1C1 = "Sheet List"
Range("C1").Select
ActiveCell.FormulaR1C1 = "New List"
For x = 1 To Worksheets.Count
Cells(x + 1, 1).Value = Worksheets(x).Name
Next x
End Sub

这将在您的工作簿中创建一个名为 sheetlist 的工作表,其中将列出您当前工作簿中的所有工作表。您可以使用下一个宏删除您不想重命名的任何工作表名称,但请确保没有空格。

有一个名为“新列表”(C) 的列,您可以在其中放置要调用工作表的名称列表。确保此工作表与 A 列的名称数量相同。

宏 2:

Sub batchrename()
'
' batchrename Macro
'
Dim OldSheetName As String
Dim NewSheetName As String
Dim SheetCount As Integer
Dim NewSheetList As String

NewSheetList = InputBox("How many names are there?") + 1
For SheetCount = 1 To Range("C2:C" & NewSheetList).Count
OldSheetName = Sheets("sheetlist").Cells(SheetCount + 1, 1)
NewSheetName = Sheets("sheetlist").Cells(SheetCount + 1, 3)

Sheets(OldSheetName).Select
ActiveSheet.Name = NewSheetName
Next SheetCount

End Sub

这会将工作表从 A 重命名为 C 中的名称。提示将询问您名称列表在哪里,输入新名称列表的完整范围(例如:C2:C250),然后点击输入。

希望对你有帮助,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多