2017-10-18 14 views
2

Je souhaite que mon programme commence un comptage à un emplacement spécifique défini par une variable. Je sais que vous pouvez utiliser rn = sh.Cells(9, 1) par exemple, et la variable rn tient maintenant l'emplacement de cells(9,1). Mais quand j'utilise la rn variable dans ma commande de compte, je reçois l'erreur suivante:VBA Plage utilisant une variable pour définir un emplacement

Method 'Range' of object' _worksheet' failed

Voici mon code:

Option Explicit 
Sub Struc_Equa() 
Dim n As Integer 

End sub 
Sub countN(n) 

Dim sh As Worksheet 
Dim rn As Range 
Dim SheNa As String 
SheNa = ActiveSheet.Name 
Set sh = ThisWorkbook.Sheets(SheNa) 

Set rn = sh.Cells(9, 1) 

' The command below does not work 
'n = sh.Range(rn, sh.Range(rn).End(xlToRight)).Columns.Count 

' I am able to do what I want but in a inefficient way (shown below) 
'n = sh.Range("A9", sh.Range("A9").End(xlToRight)).Columns.Count 
rn.Activate 
MsgBox (n) 

End Sub 

Pourquoi cette erreur se passe?

Répondre

1

Essayez ceci:

n = sh.Range(rn, rn.End(xlToRight)).Columns.Count 

Il suit la chaîne ([Cell1], [Cell2]) syntaxe.
Rappelez-vous que rn est déjà une adresse de plage entièrement référencée, donc vous pouvez l'utiliser directement comme arguments pour l'objet Range. En savoir plus sur Range Syntax.

Pourquoi votre code d'origine at-il échoué?

Parce que basé sur this article, dans Range (arg) syntaxe, arg noms de la gamme.
Et prendre note que Range Object La propriété par défaut est Value.
donc votre code:

sh.Range(rn).End(xlToRight) 

évalue réellement la valeur de rn et fournit comme arg pour la gamme (de arg) syntaxe. Si la valeur de cette cellule n'est pas une adresse valide de cellule ou de plage (ou un nom comme l'article mentionné), une erreur sera générée. Au-dessus de fait comme ci-dessous évalue:

sh.Range("value from rn range object").End(xlToRight) 

Si vous essayez de changer la valeur de cette cellule avec une cellule valide ou nom de plage/adresse, cela fonctionnera. Par exemple:

With sh 
    Set rn = .Cells(9, 1) 
    rn.Value2 = "A9" 
    n = .Range(rn, .Range(rn).End(xlToRight)).Columns.Count 
    MsgBox n 
End With 

En bref:

  1. Range (arg) attend un nom de plage valide ou une adresse.
  2. Plage ([cellule1], [cellule2]) attend une référence d'objet plage valide.
+0

C'était exactement le problème. Pouvez-vous expliquer plus loin ce qui n'allait pas avec le code original? –

+0

@MaxHollander Voir ma mise à jour. J'espère que c'est plus clair maintenant. ;) – L42

+0

Avez-vous beaucoup d'expérience avec C++ j'ai quelques questions concernant sa capacité etc –