将数组传递给函数时Variant与Stringtypes不匹配

我有函数返回当前表的列表:

Function getListOfSheetsW() As Variant Dim i As Integer Dim sheetNames() As Variant ReDim sheetNames(1 To Sheets.Count) For i = 1 To Sheets.Count sheetNames(i) = Sheets(i).name Next i getListOfSheetsW = sheetNames End Function 

然后,我有函数,返回TRUE或FALSE取决于是否在needle

 Function IsInArray2(ByVal needle As String, haystack() As String) As Boolean Dim element As Variant For Each element In haystack If element = needle Then IsInArray = True Exit Function End If Next element IsInArray = False End Function 

我的目标是创build一个新的子程序,它将首先检查具有给定名称的表是否已经存在,如果没有,则创build新的子程序。 我试过以下内容:

 Sub CreateNewSheet(ByVal dstWSheetName As String) Dim srcWSheetName As String ' Dim sheetNames() As String Dim sheetNames() As Variant sheetNames = getListOfSheetsW() Dim sheetCount As Integer If IsInArray2(dstWSheetName, sheetNames) Then MsgBox "Sheet with following name: " & dstWSheetName & " already exists" Else srcWSheetName = ActiveSheet.name sheetCount = Sheets.Count ' CREATE NEW SHEET ' Worksheets(dstWsheetName).Delete Sheets.Add.name = dstWSheetName ' Q: why 6 instead of 5 ' Worksheets("Test").Move after:=Worksheets("Sheet5") Worksheets(dstWSheetName).Move After:=Worksheets(sheetCount + 1) ' SWITCH TO SRC SHEET Worksheets(srcWSheetName).Activate End If End Sub 

我这样称呼它:

 Sub CallCreateNewSheet() Call CreateNewSheet("test") End Sub 

我想问题是与Dim sheetNames() As StringDim sheetNames() As Variant

当我使用Dim sheetNames() As String我得到

运行时错误“13”:types不匹配

当我使用Dim sheetNames() As Variant我得到:

编译错误:types不匹配:数组或预期的用户定义types

我以前有类似的问题,但定义sheetNames作为数组在这里没有帮助。 什么是问题,这两个不同的错误是什么意思?

如果从键入数组切换到variables数组,您将避免所有这些问题。

在你的第一个函数中,删除这一行:

  Dim sheetNames() As Variant 

从这里改变你的第二个function的定义线:

 Function IsInArray2(ByVal needle As String, haystack() As String) As Boolean 

对此:

 Function IsInArray2(ByVal needle As String, haystack) As Boolean 

在你的sub,改变这一行:

 Dim sheetNames() As Variant 

对此:

 Dim sheetNames 

如何像一个新的脚本:

 Sub NewSheetByName(SName as String) Dim oldSheet as Object For Each oldSheed in ThisWorkbook.Sheets if oldSheet.Name = Sname Then MsgBox "Sheet with following name: " & SName & " already exists" Exit Sub End If Next oldSheet = ActiveSheet Sheets.Add.Name = SName ActiveSheet.Move , Worksheets(Sheets.Count) oldSheet.Activate End Sub 

variables必须在sinc中。

在两个过程中以相同的方式声明variablessheetNames

Sub CreateNewSheet(ByVal dstWSheetName As String)

Function getListOfSheetsW() As Variant

将其声明为: Dim sheetNames() As String

还要注意Function IsInArray2总是返回False 。 为了纠正这个IsInArray用函数体中的IsInArray2replaceIsInArray

总是有一个好习惯

Option Explicit

在模块的开始。

然而,它将节省所有麻烦来validation工作表的存在,只是将目标工作表分配给一个variables,它会给出一个错误,如果工作表不存在,variables将不会返回任何结果。 尝试这个:

 Dim Wsh As Worksheet On Error Resume Next Set Wsh = Workbook(x).Worksheets("Test") On Error GoTo 0 If Wsh Is Nothing Then Add Worksheet