2010-11-19 38 views
1

Erreur d'exécution 13. Incompatibilité de type. Mais je ne peux pas comprendre pourquoi. De l'aide?Obtention de "erreur: incompatibilité de type" dans VBA

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 

Lorsque je tente d'utiliser d'autres cellules de test est très bien, le problème est avec les .... mais ils sont des nombres à l'intérieur « ttotal_comission » pourquoi VBA prend comme autre chose?

+0

que comparez-vous ici "TotalCRng.Rows (I)> 0" l'indice de la ligne ou une valeur de cellule? – Arseny

Répondre

3

Le problème est que Rows(I) renvoie un objet de plage, pas une valeur entière. Vous devez entièrement qualifier vos déclarations comme ceci: TotalCRng.Rows(I).Cells(1, 1).Value ou éventuellement TotalCRng.Cells(1, 1).Value. Écrit tel quel, Excel renverra la valeur à partir de Rows (I) s'il s'agit d'une seule cellule, auquel cas la propriété value de la plage est appelée, mais sinon augmentera l'erreur d'incompatibilité de type que vous voyez car vous êtes essayer de comparer une plage à un entier.

Exemple:

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

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

Aussi, gardez à l'esprit que seule la cellule supérieure gauche d'une gamme fusionnée retournera en fait une valeur.

2

Vous pouvez utiliser utiliser une construction comme celle-ci:

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

Si vous essayez de vérifier la valeur des cellules dans chaque ligne, vous devez parcourir les cellules et comparer les valeurs individuellement.

Si les plages ne sont que des colonnes simples, au lieu de faire défiler chaque ligne, vous pouvez parcourir chaque cellule pour obtenir le même effet.

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