Excel 在VBA中返回布尔值

Excel 在VBA中返回布尔值,excel,boolean,worksheet-function,vba,Excel,Boolean,Worksheet Function,Vba,我有一段代码,用来按名称检查是否存在表单。如果工作表存在,则存在一些“复制”和“过去”功能;如果工作表不存在,则它将创建“的”,并随后创建相同的“复制过去”功能。我无法获取正确的布尔值以返回到主子节点。布尔值始终注册为false(我知道这是默认值)。我尝试了几种不同的方法来纠正这个问题,但仍然存在问题。我真的需要一些帮助,这可能是一个简单的解决办法 Sub BreakOutCategories() Dim catSheet As Worksheet Dim catName As

我有一段代码,用来按名称检查是否存在表单。如果工作表存在,则存在一些“复制”和“过去”功能;如果工作表不存在,则它将创建“的”,并随后创建相同的“复制过去”功能。我无法获取正确的布尔值以返回到主子节点。布尔值始终注册为false(我知道这是默认值)。我尝试了几种不同的方法来纠正这个问题,但仍然存在问题。我真的需要一些帮助,这可能是一个简单的解决办法

Sub BreakOutCategories()

    Dim catSheet As Worksheet
    Dim catName As String
    Dim Range1 As Range
    Dim gRange As Range
    Dim toSheet As Worksheet
    Dim CheckSheet As Boolean
    Dim CreateSheet As Boolean
    Dim i As Long

        Set catSheet = Sheets("MasterList")
        Set Range1 = catSheet.Range("A1", catSheet.Range("A1").End(xlDown))

            For Each gRange In Range1

            i = 0
            catName = gRange.Value

            CheckMySheet (catName)

                If CheckSheet = True Then

                    toSheet = Sheets(gRange.Value)

                    gRange.Offset(0, 1).Copy
                    toSheet.Range("A1", toSheet.Range("A1").End(xlDown)).Offset(1, 0).Paste
                    gRange.Offset(0, 1).Copy
                    toSheet.Range("E1", toSheet.Range("E1").End(xlDown)).Offset(1, 0).Paste

                    gRange.Offset(0, 2).Copy
                    toSheet.Range("B1", toSheet.Range("B1").End(xlDown)).Offset(1, 0).Paste
                    gRange.Offset(0, 2).Copy
                    toSheet.Range("F1", toSheet.Range("F1").End(xlDown)).Offset(1, 0).Paste

                ElseIf CheckSheet = False Then

                    CreateMySheet catName

                    toSheet = (gRange.Value)

                    gRange.Offset(0, 1).Copy
                    toSheet.Range("A1", toSheet.Range("A1").End(xlDown)).Offset(1, 0).Paste
                    gRange.Offset(0, 1).Copy
                    toSheet.Range("E1", toSheet.Range("E1").End(xlDown)).Offset(1, 0).Paste

                    gRange.Offset(0, 2).Copy
                    toSheet.Range("B1", toSheet.Range("B1").End(xlDown)).Offset(1, 0).Paste
                    gRange.Offset(0, 2).Copy
                    toSheet.Range("F1", toSheet.Range("F1").End(xlDown)).Offset(1, 0).Paste

                End If

            Next gRange

End Sub
Public Function CheckMySheet(ByVal catName As String) As Boolean

    Dim theSheet As Worksheet
    Dim CheckSheet As Boolean

        For Each theSheet In ThisWorkbook.Sheets

            If theSheet.Name = catName Then

                CheckSheet = True
                Exit For

            End If

        Next theSheet

End Function
Public Function CreateMySheet(ByVal catName As String) As Boolean

    Dim catSheet As Worksheet
    Dim newSheet As Worksheet
    Dim Range1 As Range
    Dim gRange As Range

        Set catSheet = Sheets("MasterList")
        Set Range1 = catSheet.Range("A1", catSheet.Range("A1").End(xlDown))

        Set newSheet = Sheets.Add(After:=Sheets("Cover"))
        newSheet.Name = catName

        newSheet.Range("A1") = "Line"
        newSheet.Range("E1") = "Line"
        newSheet.Range("B1") = "Item"
        newSheet.Range("F1") = "Item"
        newSheet.Range("C1") = "Units"
        newSheet.Range("G1") = "Sales"

        CreateMySheet = True

End Function
我已经发布了完整的代码,试图给出一个我正在努力实现的良好画面。我还考虑在
CreateMySheet catName
之后执行
Do-Until
循环,以再次检查是否存在该工作表,以防止代码向前移动,直到完全创建工作表


谢谢

您从未设置函数的值,因此,正如您所注意到的,它会返回默认值
False
。通过在末尾添加一行进行修复:

Public Function CheckMySheet(ByVal catName As String) As Boolean

    Dim theSheet As Worksheet
    Dim CheckSheet As Boolean

        For Each theSheet In ThisWorkbook.Sheets
            If theSheet.Name = catName Then
                CheckSheet = True
                Exit For
            End If
        Next theSheet

CheckMySheet = CheckSheet 

End Function

您从未设置函数的值,因此,正如您所注意到的,它返回默认值
False
。通过在末尾添加一行进行修复:

Public Function CheckMySheet(ByVal catName As String) As Boolean

    Dim theSheet As Worksheet
    Dim CheckSheet As Boolean

        For Each theSheet In ThisWorkbook.Sheets
            If theSheet.Name = catName Then
                CheckSheet = True
                Exit For
            End If
        Next theSheet

CheckMySheet = CheckSheet 

End Function

我认为您仍然需要改进您的复制和粘贴,但要开始创建工作表,这里需要修改一些代码,以便在列表中不存在工作表时创建新工作表

Option Explicit

Sub BreakOutCategories()

    Dim catSheet As Worksheet
    Dim catName As String
    Dim Range1 As Range
    Dim gRange As Range
    Dim toSheet As Worksheet
    Dim CheckSheet As Boolean
    Dim CreateSheet As Boolean
    Dim i As Long

    Set catSheet = Sheets("MasterList")
    Set Range1 = catSheet.Range("A1", catSheet.Range("A1").End(xlDown))

    For Each gRange In Range1
        i = 0
        catName = gRange.Value
        If CheckMySheet(catName) Then
            Set toSheet = Sheets(gRange.Value)
            ' sheet exists do your copying
        Else
            CreateMySheet catName
            Set toSheet = Sheets(gRange.Value)
            ' sheets didnt exist
        End If
    Next gRange
End Sub

Private Function CheckMySheet(ByVal catName As String) As Boolean
    Dim theSheet As Worksheet
    For Each theSheet In ThisWorkbook.Sheets
        If StrComp(theSheet.Name, catName, vbTextCompare) = 0 Then
            CheckMySheet = True
            Exit For
        End If
    Next theSheet
End Function

Private Function CreateMySheet(ByVal catName As String) As Boolean
    Dim catSheet As Worksheet
    Dim newSheet As Worksheet
    Dim Range1 As Range
    Dim gRange As Range

    Set catSheet = Sheets("MasterList")
    Set Range1 = catSheet.Range("A1", catSheet.Range("A1").End(xlDown))

    Set newSheet = Sheets.Add(After:=Sheets("Cover"))
    newSheet.Name = catName

    newSheet.Range("A1") = "Line"
    newSheet.Range("E1") = "Line"
    newSheet.Range("B1") = "Item"
    newSheet.Range("F1") = "Item"
    newSheet.Range("C1") = "Units"
    newSheet.Range("G1") = "Sales"

    CreateMySheet = True
End Function
更新
除了您的评论之外,我认为您需要阅读更多关于函数及其工作原理的内容。如果你打算进行编码/编程,那么这是相对容易的,而且绝对是你需要学习的基本知识。我可以推荐作为起点
现在,让我向您展示最简单的示例
在继续之前,请确保您知道
函数
过程
之间的区别

Function ReturnTrue() As Boolean
    ReturnTrue = True
End Function

Function ReturnFalse() As Boolean
    ReturnFalse = False
End Function
上面演示了如何从没有条件的函数返回布尔值。如果您从模块调用该函数,其中一个函数将始终返回true,另一个函数将始终返回false。

下面演示如何根据某些条件从函数返回值。这一次,您希望运行
布尔函数()
,以便更好地理解代码和结果。我希望这有帮助

Function TrueOrFalse(number As Integer) As Boolean
    If number > 0 And number < 255 Then
        TrueOrFalse = True
    Else
        TrueOrFalse = False
    End If
End Function

Sub BooleanFunctions()
    Dim functionResult As Boolean
    functionResult = TrueOrFalse(10)
    MsgBox functionResult
    functionResult = TrueOrFalse(-10)
    MsgBox functionResult
End Sub
函数TrueOrFalse(数字为整数)为布尔值
如果编号>0且编号<255,则
真或假=真
其他的
真或假=假
如果结束
端函数
次布尔函数()
将函数结果设置为布尔值
functionResult=TrueOrFalse(10)
MsgBox函数结果
functionResult=TrueOrFalse(-10)
MsgBox函数结果
端接头

正如您所见,函数将返回的值是函数名以及作为函数中最后一次调用分配给它的任何内容

我认为您仍然需要改进复制和粘贴,但是为了让您开始创建工作表,这里修改了一些代码,以便在列表中不存在工作表时创建新工作表

Option Explicit

Sub BreakOutCategories()

    Dim catSheet As Worksheet
    Dim catName As String
    Dim Range1 As Range
    Dim gRange As Range
    Dim toSheet As Worksheet
    Dim CheckSheet As Boolean
    Dim CreateSheet As Boolean
    Dim i As Long

    Set catSheet = Sheets("MasterList")
    Set Range1 = catSheet.Range("A1", catSheet.Range("A1").End(xlDown))

    For Each gRange In Range1
        i = 0
        catName = gRange.Value
        If CheckMySheet(catName) Then
            Set toSheet = Sheets(gRange.Value)
            ' sheet exists do your copying
        Else
            CreateMySheet catName
            Set toSheet = Sheets(gRange.Value)
            ' sheets didnt exist
        End If
    Next gRange
End Sub

Private Function CheckMySheet(ByVal catName As String) As Boolean
    Dim theSheet As Worksheet
    For Each theSheet In ThisWorkbook.Sheets
        If StrComp(theSheet.Name, catName, vbTextCompare) = 0 Then
            CheckMySheet = True
            Exit For
        End If
    Next theSheet
End Function

Private Function CreateMySheet(ByVal catName As String) As Boolean
    Dim catSheet As Worksheet
    Dim newSheet As Worksheet
    Dim Range1 As Range
    Dim gRange As Range

    Set catSheet = Sheets("MasterList")
    Set Range1 = catSheet.Range("A1", catSheet.Range("A1").End(xlDown))

    Set newSheet = Sheets.Add(After:=Sheets("Cover"))
    newSheet.Name = catName

    newSheet.Range("A1") = "Line"
    newSheet.Range("E1") = "Line"
    newSheet.Range("B1") = "Item"
    newSheet.Range("F1") = "Item"
    newSheet.Range("C1") = "Units"
    newSheet.Range("G1") = "Sales"

    CreateMySheet = True
End Function
更新
除了您的评论之外,我认为您需要阅读更多关于函数及其工作原理的内容。如果你打算进行编码/编程,那么这是相对容易的,而且绝对是你需要学习的基本知识。我可以推荐作为起点
现在,让我向您展示最简单的示例
在继续之前,请确保您知道
函数
过程
之间的区别

Function ReturnTrue() As Boolean
    ReturnTrue = True
End Function

Function ReturnFalse() As Boolean
    ReturnFalse = False
End Function
上面演示了如何从没有条件的函数返回布尔值。如果您从模块调用该函数,其中一个函数将始终返回true,另一个函数将始终返回false。

下面演示如何根据某些条件从函数返回值。这一次,您希望运行
布尔函数()
,以便更好地理解代码和结果。我希望这有帮助

Function TrueOrFalse(number As Integer) As Boolean
    If number > 0 And number < 255 Then
        TrueOrFalse = True
    Else
        TrueOrFalse = False
    End If
End Function

Sub BooleanFunctions()
    Dim functionResult As Boolean
    functionResult = TrueOrFalse(10)
    MsgBox functionResult
    functionResult = TrueOrFalse(-10)
    MsgBox functionResult
End Sub
函数TrueOrFalse(数字为整数)为布尔值
如果编号>0且编号<255,则
真或假=真
其他的
真或假=假
如果结束
端函数
次布尔函数()
将函数结果设置为布尔值
functionResult=TrueOrFalse(10)
MsgBox函数结果
functionResult=TrueOrFalse(-10)
MsgBox函数结果
端接头

正如您所看到的,函数将返回的值是函数名,以及作为函数中最后一次调用分配给它的任何内容。

主列表中的前3项是“转向”。我在
处设置断点,如果CheckSheet=True,则在
处设置断点,如果CheckSheet=False,则在
处设置断点,它会像应该的那样第一次创建指导表。第二次通过它应该看到工作表,CheckSheet应该返回true,它应该只尝试复制和粘贴。相反,CheckSheet仍然返回false,即使我在CheckMySheet函数的末尾添加了
CheckMySheet=CheckSheet
。主列表中的前3项是“转向”。我在
处设置断点,如果CheckSheet=True,则在
处设置断点,如果CheckSheet=False,则在
处设置断点,它会像应该的那样第一次创建指导表。第二次通过它应该看到工作表,CheckSheet应该返回true,它应该只尝试复制和粘贴。相反,CheckSheet仍然返回false,即使我在CheckMySheet函数的末尾添加了
CheckMySheet=CheckSheet
。谢谢!你在复制/过去的东西上是正确的,我现在将开始改进它,但它至少让我达到了这一点。我知道这本身不是一个教室,但要正确返回布尔值,到底需要做些什么呢?谢谢!你在复制/过去的东西上是正确的,我现在将开始改进它,但它至少让我达到了这一点。我知道这本身不是一个教室,但返回布尔值需要做什么呢