将数组传递给函数时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 String
或Dim 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
用函数体中的IsInArray2
replaceIsInArray
。
总是有一个好习惯
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