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