2010-12-14 67 views
0

J'ai une colonne dont l'en-tête est une plage de B1: C1. les données sont plus commeLecture de la valeur à partir d'une plage fusionnée (Excel)

+ ---- + ---- +

| En-tête |

+ ---- + ---- +

| H2 | H3 |

+ ---- + ---- +

| 1 | 2 |

| 3 | 4 |

+ ---- + ---- +

J'ai une variable nommée RNG tels que

Set rng = Range("B1:C1") 

en utilisant maintenant la variable RNG, je veux sélectionner la valeur "H3" ou « 2 ", ou" 4 ". J'ai utilisé la syntaxe suivante

rng.Offset(1,1).value 

et isntead de me donner « H3 » il m'a donné la valeur de d2 i.e. suivant Colum.

+0

À quoi ça sert? range ("B1: C1"). offset (1,1) IS gamme C2: D2, mais si B1: C1 sont fusionnées, leur décalage (1,1) est D2. Essayez avec votre clavier si ce n'est pas clair: cliquez sur cellule fusionnée, appuyez sur la flèche droite, puis sur la flèche vers le bas. –

Répondre

3

Il n'existe pas de moyen simple pour corriger ce comportement inattendu. Ma compréhension est que, en ce qui concerne les cellules fusionnées, la référence pour le décalage est basée sur l'ensemble de la cellule et que les cellules fusionnées sont traitées comme une cellule au lieu de nombreuses cellules.

Dans votre exemple, si Range("B1:C1") est fusionné alors la colonne suivante (c.-à-Offset(0,1)) est la colonne D. Excel considère la plage fusionnée en tant que cellule unique et ainsi d'un point de vue visuel la colonne suivante est la colonne D et le long pas colonne C. Cela peut être source de confusion à mon avis.

La meilleure façon de contourner cela est d'éviter d'utiliser des cellules fusionnées en-têtes, mais plutôt utiliser Centre Across Selection mise en forme:

1) De-fusion Range ("B1: C1")

2) Sélectionner la plage ("B1: C1")> format> cellules

3) Dans la boîte de dialogue horizontale sélectionnez 'Centré sur plusieurs'

Si vous le faites alors le code suivant fonctionnera:

Sub GetOffsets() 
    Dim rng As Range 
    Set rng = Range("B1") 

    Debug.Print rng.Offset(1, 0) // H2 
    Debug.Print rng.Offset(2, 0) // 1 
    Debug.Print rng.Offset(3, 0) // 3 
    Debug.Print rng.Offset(1, 1) // H3 
    Debug.Print rng.Offset(2, 1) // 2 
    Debug.Print rng.Offset(3, 1) // 4 
End Sub 
+0

bien que j'ai changé ma logique pour quelque chose d'autre mais merci pour votre aide :) –

1

Si vous avez vraiment besoin d'utiliser des cellules fusionnées, Excel a ce "problème" quand il s'agit de décalages de cellules fusionnées. Dans votre cas ci-dessus, il est logique que la cellule D2 devienne décalée (1,1) de B1.

Une solution consiste à utiliser des décalages imbriqués:

Vous avez votre variable:

Set rng = Range("B1:C1") 

Ensuite, utilisez les réglages suivants à votre code:

rng.Offset(1,0).offset(0,1).value 

De cette façon, vous devez d'abord décalage par rang, pour descendre à B2, puis décalé par colonne pour atteindre C2.