Получение "ошибка: несоответствие типов" в VBA - PullRequest
1 голос
/ 19 ноября 2010

Получаю ошибку во время выполнения 13.Несоответствие типов.Но я не могу понять, почему.Любая помощь?

Sub Separate_with_OR_without_comission()

Dim I As Integer
Dim WRng As Range
Dim NoRng As Range
Dim NameRgn As Range
Dim TotalCRng As Range

Set WRng = Range("with_comission")
Set NoRng = Range("without_comission")
Set NameRgn = Range("total_comission_name")
Set TotalCRng = Range("ttotal_comission")

 For I = 1 To NameRgn.Rows.Count
    If TotalCRng.Rows(I) > 0 Then           // ERROR HERE
        WRng.Rows(I) = NameRgn.Rows(I)
    End If
    If TotalCRng.Rows(I) < 1 Then           // AND HERE
        NoRng.Rows(I) = NameRgn.Rows(I)
    End If
 Next I
End Sub

Когда я пытаюсь использовать другие тестовые ячейки в порядке, проблема с этими .... но они являются числами внутри "ttotal_comission", почему VBA воспринимает это как что-то еще?

Ответы [ 3 ]

3 голосов
/ 19 ноября 2010

Проблема в том, что Rows(I) возвращает объект диапазона, а не целочисленное значение. Вы должны полностью квалифицировать свои утверждения следующим образом: TotalCRng.Rows(I).Cells(1, 1).Value или, возможно, TotalCRng.Cells(1, 1).Value. Написанный как есть, Excel вернет значение из Rows (I), если оно окажется одной ячейкой, в этом случае вызывается свойство значения диапазона, но в противном случае возникнет ошибка несоответствия типов, которую вы видите, потому что вы попытка сравнить диапазон с целым числом.

Пример:

'no error
Debug.Print Sheet1.Range("B1")

'type mismatch error
Debug.Print Sheet1.Range("B1:B12")

Кроме того, имейте в виду, что только верхняя левая ячейка объединенного диапазона будет фактически возвращать значение.

2 голосов
/ 19 ноября 2010

Вы можете использовать такую ​​конструкцию:

for each c in range("rangeName1")
    'if the source range is 3 columns to the right, same row'
    c = c.offset(0,3).value  
next c
0 голосов
/ 19 ноября 2010

Если вы пытаетесь проверить значение ячеек в каждой строке, вам нужно пройтись по ячейкам и сравнить значения по отдельности.

Если диапазоны - это просто отдельные столбцы, а не циклически проходить через каждыйСтрока, вы можете пройти через каждую ячейку для того же эффекта.

 For I = 1 To NameRgn.Rows.Count
    For j = 1 to NameRgn.rows(I).cells.count
    If TotalCRng.Rows(I).cells(j).value > 0 Then           // ERROR HERE
        WRng.Rows(I).cells(j) = NameRgn.Rows(I).cells(j)
    End If
    If TotalCRng.Rows(I).cells(j).value < 1 Then           // AND HERE
        NoRng.Rows(I).cells(j) = NameRgn.Rows(I).cells(j)
    End If
    Next j
 Next I
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...