如何添加“ .Cells”解决运行时错误13?

时间:2018-10-27 18:34:57

标签: excel vba runtime-error

您能解释一下this post的解决方案吗? 我遇到了同样的问题,但无法理解添加“ .Cells”如何解决运行时错误13“类型不匹配”的问题?

3 个答案:

答案 0 :(得分:2)

这实际上是一个好问题。

因为Columns是一个独特的对象(具有自己的属性和方法),与Cells (这是Range的最小单位)

在您引用的帖子中,我们希望将Cells放在单个列中而不是工作表中的Columns上。

答案 1 :(得分:2)

错误13是由传递给Clean函数的参数不匹配引起的。此函数需要string,但此处传递了array

为什么要数组?因为myCell.Value是一个数组。在这种情况下,myCell是指整个单元格列。 HTH

Option Explicit

Sub test()
    Dim myCell As Variant
    Dim myValue As Variant

    For Each myCell In Columns("G:G")
        Debug.Print TypeName(myCell) ' Range
        Debug.Print myCell.Address ' $G:$G
        Debug.Print myCell.Cells.Count ' e.g. 1048576

        myValue = myCell.Value
        Debug.Print TypeName(myValue) ' Variant()
        Debug.Print IsArray(myValue) ' True

        ' Here comes the type mismatch from
        ' It is because Clean accepts not an array, but a string
        WorksheetFunction.Clean (myCell.Value)

        ' It fails beause of mismatch argument typy which is passed to Clean function
        myCell.Value = WorksheetFunction.Trim(WorksheetFunction.Clean(myCell.Value))
    Next
End Sub

因此Columns("G:G")返回一列中所有单元格的Range。该代码可以写为像这样显示它。

Sub CellsOfColumn()
    Dim myColumn As Range
    Dim myCell As Range

    For Each myColumn In Columns("G:G")
        Debug.Print TypeName(myColumn) ' Range 
        Debug.Print myColumn.Address ' $G:$G
        Debug.Print myColumn.Cells.Count ' e.g. 1048576
        For Each myCell In myColumn.Cells
            Debug.Print TypeName(myCell) ' Range
            Debug.Print myCell.Address ' $G$1, $G$2, $G$3, $G$4 ...
            Debug.Print myCell.Cells.Count ' 1, 1, 1, 1, ...
            ' This now works because 
            ' myCell.Value is now a single value not an array,
            ' where myCell refers not to column, but to a single cell  
            myCell.Value = WorksheetFunction.Trim(WorksheetFunction.Clean(myCell.Value))
        Next
    Next
End Sub

答案 2 :(得分:2)

Worksheet.Columns(或Worksheet.Columns(1))返回由整个列组成的范围对象。如果要遍历该列的各个单元格,则需要指定.Cells属性。

范围对象 表示一个单元格,一行,一列,包含一个或多个连续单元格块或3-D范围的单元格选择”

因此,要根据返回的确切内容确定要循环的内容。

例如,在这里我们创建一个范围对象,该对象由三列组成:

    Dim myRange As Range, myRangeObj As Range

Set myRange = Range(Columns(1), Columns(3))
For Each myRangeObj In myRange
    Debug.Print myRangeObj.Address
Next myRangeObj

以上内容将返回:

$A:$A
$B:$B
$C:$C

但是,如果您更改“ myRange”以引用单个单元格:

 Set myRange = Range(Columns(1), Columns(3)).Cells

然后上面的代码将返回每一列中每个单元格的地址。

输出缩短

$A$1
$B$1
$C$1
$A$2
$B$2
$C$2
$A$3
$B$3
$C$3
$A$4
$B$4
$C$4
$A$5
$B$5
$C$5
$A$6
$B$6
$C$6
$A$7
$B$7
$C$7
$A$8
$B$8
$C$8
$A$9
$B$9
$C$9
$A$10
$B$10
$C$10
...
相关问题