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