VBA创建新的工作表(如果不存在)

时间:2018-09-06 08:19:34

标签: excel vba excel-vba

我目前正在使用VBA宏,该宏从工作表中获取数据并将其复制到另一个。 如果目标工作表不存在,则应创建目标工作表,然后从我的数组中写入数据。

问题:
我有一个功能来测试工作表是否已经存在。 如果是这种情况,我的宏将成功写入我想要的数据。但是,如果工作表不存在,VBA将显示错误,您可以在下面看到。 在列表Workbook.Worksheets中没有这样命名的工作表,但无论如何我都会收到该错误。

这是我的相关代码:
(如果缺少一些东西来理解问题,我也可以填写缺少的部分)

DataTemplate

在主Sub中,我使用了以下代码:

Function sheetExists(sheetToFind As String) As Boolean
    Dim Sheet As Worksheet
    For Each Sheet In Worksheets
        If sheetToFind = Sheet.Name Then
            sheetExists = True
            Exit Function
        End If
    Next Sheet
    sheetExists = False
End Function

确切的错误:

  

1004无法将工作表重命名为与另一个工作表,参考对象库或Visual Basic引用的工作簿相同的名称

首先它执行成功,但是在我手动删除工作表之后,发生了错误。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

指定要查看的工作簿:

  /**
    * a not so fancy way of failing asap, on first failing link in the control chain
    * @return true if valid, false if not
    */
  def isValid(): Boolean = {

    val lst = List(
      isValidForEmptyDF() _,
      isValidForFoo() _,
      isValidForBar() _
    )

    !lst.exists(!_()) // and fail asap ...
  }

  def isValidForEmptyDF()(): Boolean = {
    val specsAreMatched: Boolean = true

    try {
      if (df.rdd.isEmpty) {
        msg = "the file: " + uri + " is empty"
        !specsAreMatched
      } else {
        specsAreMatched
      }
    } catch {
      case jle: java.lang.UnsupportedOperationException => {
        msg = msg + jle.getMessage
        return false
      }
      case e: Exception => {
        msg = msg + e.getMessage()
        return false
      }
    }

  }

也并非必须必须 For Each Sheet In ThisWorkbook.Sheets 而不是Sheets,因为Worksheets仅包含工作表,而Worksheets也包含图表等。所以我们也必须检查这些名称!
Sheets必须为Sheet

您可以使功能更灵活:

Dim Sheet As Object

因此您可以称之为:

  • Function sheetExists(sheetToFind As String, Optional InWorkbook As Workbook) As Boolean If InWorkbook Is Nothing Then Set InWorkbook = ThisWorkbook Dim Sheet As Object For Each Sheet In InWorkbook.Sheets If sheetToFind = Sheet.Name Then sheetExists = True Exit Function End If Next Sheet sheetExists = False End Function 默认使用sheetExists("SheetName"),或者
  • ThisWorkbook指定一个特定的工作簿。

或者,您可以使用

sheetExists("SheetName", Workbooks("MyWorkbook"))

如果工作簿中有很多工作表,则可能会更快一些。