Как добавление ".Cells" решает ошибку времени выполнения 13? - PullRequest
0 голосов
/ 27 октября 2018

Не могли бы вы объяснить решение из этого поста ?У меня та же проблема, но я не могу понять, как добавление «.Cells» решает проблему ошибки 13 времени выполнения «несоответствие типов»?

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Ошибка 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
0 голосов
/ 28 октября 2018

Worksheet.Columns (или Worksheet.Columns(1)) возвращает объект диапазона, который состоит из целых столбцов. Если вы хотите просмотреть отдельные ячейки этого столбца, вам нужно указать свойство .Cells.

A Range Object представляет ячейку, строку, столбец, выборку ячеек, содержащих один или несколько непрерывных блоков ячеек, или трехмерный диапазон ".

Таким образом, в зависимости от того, что именно возвращается, определяется, через что проходит петля.

Например, здесь мы создаем объект диапазона, который состоит из трех столбцов:

    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
...
0 голосов
/ 27 октября 2018

На самом деле это хороший вопрос.

Это потому, что Columns - это отдельный объект (со своими собственными свойствами и методами) , который совершенно отличается от Cells (что является наименьшей единицей из Range) .

В сообщении, на которое вы ссылаетесь, мы хотим зациклить Cells в одном столбце, а не Columns в части рабочего листа.

...