Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在新工作簿上运行复制的宏时创建的运行时错误_Excel_Vba_Runtime Error - Fatal编程技术网

Excel 在新工作簿上运行复制的宏时创建的运行时错误

Excel 在新工作簿上运行复制的宏时创建的运行时错误,excel,vba,runtime-error,Excel,Vba,Runtime Error,我有一个宏,它在一个工作簿上运行得非常好,但是当我将它复制到一个新工作簿中使用时,它抛出了“运行时错误13类型不匹配” 宏的功能是读取值列表并创建新列表,不包括代码中指定的字符串。 我试图使用的数据集位于B96:B110中,我需要将结果放在从单元格C96开始的列表中 到目前为止,我唯一更改的代码部分是工作表的名称、原始列表的范围引用以及结果需要到达的位置 Option Explicit Private Sub compileList() Dim arr(), i As Long, list

我有一个宏,它在一个工作簿上运行得非常好,但是当我将它复制到一个新工作簿中使用时,它抛出了“运行时错误13类型不匹配”

宏的功能是读取值列表并创建新列表,不包括代码中指定的字符串。
我试图使用的数据集位于B96:B110中,我需要将结果放在从单元格C96开始的列表中

到目前为止,我唯一更改的代码部分是工作表的名称、原始列表的范围引用以及结果需要到达的位置

Option Explicit

Private Sub compileList()


Dim arr(), i As Long, list As Object
Dim exclusions(), found As Boolean, j As Long

exclusions = Array("examplestring1", "examplestring2", "(examplestring3)", "Example String 4")

With Worksheets("somemacros")

    arr = .Range("B96:B110" & .Cells(.Rows.count, "B").End(xlUp).Row).Value


    Set list = CreateObject("System.Collections.ArrayList")
    For i = LBound(arr, 1) To UBound(arr, 1)
        found = False
        With list
            For j = LBound(exclusions) To UBound(exclusions)
                If InStr(arr(i, 1), exclusions(j)) > 0 Then
                   found = True
                   Exit For
                End If
            Next
            If Not found Then .Add arr(i, 1)
        End With
    Next i

    .Range("C96").Resize(list.count, 1) = Application.WorksheetFunction.Transpose(list.ToArray)

End With

End Sub
在原始工作簿中,代码工作正常,但是当我尝试在新工作簿中执行代码时,会出现错误消息,并引用以下代码段:

Application.WorksheetFunction.Transpose(list.ToArray)
我以前将几个宏复制到不同的工作簿中,没有任何问题。据我所知,当数据类型不正确匹配时,会出现类型不匹配错误,我完全不知道这里是如何创建不匹配的,因此,如果有人能向这个新手解释此问题背后的原因,以便他将来可以避免此问题,我们将不胜感激

如果我遗漏了任何重要信息,请随时告诉我


非常感谢

一个问题是以下几行:

arr = .Range("B96:B110" & .Cells(.Rows.count, "B").End(xlUp).Row).Value
如果所需范围为硬编码值B96:B110,则可使用以下代码:

arr = .Range("B96:B110").Value
如果所需范围应从B96开始,并转到最后一行,则使用:

arr = .Range("B96:B" & .Cells(.Rows.count, "B").End(xlUp).Row).Value
请注意,更改在硬编码字符串中。因为有一个函数可以找到合适的行号,所以不需要将它包含在文本字符串中


解释


这部分代码:
.Cells(.Rows.count,“B”).End(xlUp)。Row
, 查找列B中包含数据的最后一行。如果最后一行是2,则返回2;如果是3,则返回3,以此类推

当该代码被如此使用时:

arr = .Range("B96:B110" & .Cells(.Rows.count, "B").End(xlUp).Row).Value
它将最后一行号追加到字符串地址的末尾。例如,如果包含数据的最后一行是2,则范围从单元格B96到B1102。如果最后一行是97,则查看的最终范围是B96到B11097(11000和97)。假设您的工作表中包含数据的最后一行至少有数百行,那么最终的范围将是从B96到至少B110100(超过十万,超过一百万分之一)


这是一个非常大的阵列的大量细胞。难怪
.Transpose
函数出现了问题。

这更像是一个“您是否打开并再次关闭了它”类型的问题,但那是
应用程序.WorksheetFunction.Transpose…
行实际出现在
范围(“C96”)…
行下的新行吗?我是说。。。我无法想象这是因为这会导致编译错误,但这是我所看到的代码中最明显的错误。
.Transpose
函数可能会在被转置的数组或范围太大时出错。这一行
arr=.Range(“B96:B110”和.Cells(.Rows.count,“B”).End(xlUp).Row.Value
在我看来是有问题的,因为如果范围是
B96:B110
,那么为什么最后一行的行号也被追加到末尾?如果最后一行是110,那么这一行实际上是在说
arr=.Range(“B96:B110110).Value
;这使得
arr
非常大。不,它只是以这种方式显示在这里,在excel的编辑器中它是一行如果我没弄错的话,它不应该读
.Range(“C96”)。调整大小(2,list.count)
?因为您要从列表中转置生成的二维数组?第二个维度是
2
行和
列表。count
这里是保存结果所需的列数。(我认为这不一定是导致错误的原因,如果是,则是某种间接导致错误的原因)@user3014192很酷。我也这么认为。我已经更新了这个问题,以反映我们的想法,这样我们就不会对这个问题感到困扰。