【问题标题】:Create new worksheet创建新工作表
【发布时间】:2017-03-06 05:54:34
【问题描述】:

我有一个工作簿,其中包含工作表,工作表名称中包含“benefits”文本。例如;医疗福利或牙科福利。总会有至少一个,但也可能有几个。

我正在尝试编写一个宏,该宏将在工作表名称中找到带有文本“benefits”的工作表,并且在第 40 行中至少有一个单词 TRUE 的实例。

当满足这两个条件时,我需要使用相同的工作表名称创建一个新工作表,但将文本“Benefits”替换为文本“Final”,换句话说;如果工作表 MEDICALBenefits 在第 40 行的一个或多个单元格中为 TRUE,则将创建一个名为 MEDICALFinal 的新工作表。

同样,如果工作表 DENTALBenefits 在第 40 行的一个或多个单元格中为 TRUE,则将创建一个名为 DENTALFinal 的新工作表。

然后我需要它遍历所有工作表,在名称中查找“Benefits”并在第 40 行查找 TRUE,然后创建一个新工作表。

这是我目前拥有的代码,但需要帮助命名新工作表。

约旦

 'Look for worksheet names *benefits* with checkbox(s) = true
Sub CreateFinalWorksheet()
    Dim sh As Worksheet
    Dim iVal As Integer
    Application.ScreenUpdating = False
    For Each sh In ActiveWorkbook.Sheets
        iVal = Application.WorksheetFunction.CountIf(Range("40:40"), "TRUE")
        If (LCase$(sh.Name) Like "*benefits*") And (iVal > 0) Then Call AddWorksheet
    Next sh
    Application.ScreenUpdating = True
End Sub


'Called from CreateFinalWorksheet.
'Add worksheet with same sheet name replacing *benefits* with *final*
Sub AddWorksheet()
    Dim sh As Worksheet
    With ThisWorkbook
        Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count))
        ws.Name = "MedicalFinal"
    End With
End Sub

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    编辑在 OP 澄清后,他想找到所有“*好处”表

    在

    iVal = Application.WorksheetFunction.CountIf(Range("40:40"), "TRUE")
    

    您缺少当前的sh 工作表参考,因此您希望编写如下:

    iVal = Application.WorksheetFunction.CountIf(sh.Range("40:40"), "TRUE")
    

    对于上述内容和您的主要问题,我会如下:

    Sub CreateFinalWorksheet()
        Dim sh As Worksheet
    
        Application.ScreenUpdating = False
        For Each sh In ActiveWorkbook.Sheets
            If (LCase$(sh.Name) Like "*benefits") Then
                If WorksheetFunction.CountIf(sh.Rows(40), "TRUE") = 0 Then AddWorksheet sh.Name
            End If
        Next sh
        Application.ScreenUpdating = True
    End Sub
    
    Sub AddWorksheet(shtName As String)
        Dim sh As Worksheet
        With ThisWorkbook
            .Sheets.Add(After:=.Sheets(.Sheets.count)).Name = Replace(LCase$(shtName), "benefits", "Final")
        End With
    End Sub
    

    【讨论】:

    • 我尝试了这两个建议并且都创建了一个新的工作表 MEDICALFinal,但没有循环到下一个工作表 DENTALBenefits 来创建下一个新的工作表 DENTALFinal。我想在调用 sub 之后它会返回到第一个宏并循环遍历其余的工作表。我对 VBA 很陌生,不知道如何进行必要的修改。
    • @JordanCA57,请参阅编辑后的答案。如果它解决了您的问题,请通过单击答案旁边的复选标记将其从灰色切换为已填充,将其标记为已接受。谢谢
    • 我只需要将等于更改为大于。我明白了。其余的我会去弄清楚。这对学习很有帮助。
    【解决方案2】:

    在您的AddWorksheet 例程中添加一个参数,让它成为“好处”工作表

    If (LCase$(sh.Name) Like "*benefits*") And (iVal > 0) Then AddWorksheet sh
    
    Sub AddWorksheet(benef as worksheet)
        ....
        ws.name = Replace(benef.name, "benefits", "Final", , vbTextCompare)
    

    最后,你还可以在这个sub里面做其他事情,比如从参数工作表benef复制一些数据。

    【讨论】:

    • 它会创建一个新的工作表 MEDICALFinal,但不会循环到下一个工作表 DENTALBenefits 以创建下一个新工作表 DENTALFinal。我想在调用 sub 之后它会返回到第一个宏并循环遍历其余的工作表。
    • @JordanCA57 确实如此,我展示的只是一种修改您的例程并调用它的方法。还要考虑在您的代码中修复与问题无关的其他一些问题,即限定您的范围..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    相关资源
    最近更新 更多