Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 comment Identifier le type Rows où columns

patricktoulon

XLDnaute Barbatruc
bonjour à tous
comment peut on identifier le type Rows ou Columns avec un argument rows ou columns
j'explique
j'ai une fonction dans la quelle j'injecte un argument rng.rows ou rng .columns
je voudrais identifier le type d'object et non "Range"

VB:
Sub test()
Dim rng As Range

Set rng = [A1:A20]
mafiontion rng, rng.Rows

Set rng = [A1:H10]
mafiontion rng, rng.Columns
End Sub

Function mafonction(r As Range, RowColumns)
MsgBox TypeName(RowColumns)
End Function
 
Solution
donc si je ne veux pas intégrer ces deux lignes dans une fonction
je me fait une fonction perso
VB:
Sub test()
    Dim rng As Range
    '-----------------------------------------
    Set rng = [A1:A10]
    MsgBox GetTypeRange(rng.Rows)

    Set rng = [A1:A10]
    MsgBox GetTypeRange(rng.Columns)
'-----------------------------------------
    Set rng = [A1:J1]
   MsgBox GetTypeRange(rng.Rows)

    Set rng = [A1:J1]
     MsgBox GetTypeRange(rng.Columns)
 '-----------------------------------------
    Set rng = [A1:J10]
    MsgBox GetTypeRange(rng.Rows)

    Set rng = [A1:J10]
     MsgBox GetTypeRange(rng.Columns)
End Sub

Function GetTypeRange(Rowcolumns As Range)
 Dim X As Boolean
 X = Rowcolumns(1).Address = Rowcolumns.Rows(1).Address...

patricktoulon

XLDnaute Barbatruc
re
bonsoir @Dranreb j'ai pensé à un truc comme ça mais c'est pas 100% valable
notement pour une plage de ligne et colonne du même nombre
j'ai essayé aussi une variable tableau temporaire et test du ubound(tbl,,2) mais là encore choux blanc casiment pour la même raison
je ne pense pas que ce soit possible je vais faire autrement
 

patricktoulon

XLDnaute Barbatruc
re
hah!! peut être que si finalement
le resultat est bizarre mais bon j'ai recommencé 10 fois et ca semble être un point de comparaison
VB:
Sub test()
Dim rng As Range

Set rng = [A1:A20]
Mafonction rng, rng.Rows

Set rng = [A1:A20]
Mafonction rng, rng.Columns
End Sub

Function Mafonction(r As Range, RowColumns As Range)
MsgBox RowColumns(1).Cells.Count


End Function
 

patricktoulon

XLDnaute Barbatruc
bon ben ça semble être bon
je pense avoir fini par trouver
VB:
Sub test()
Dim rng As Range

Set rng = [A1:a20]
Mafonction rng, rng.Rows

Set rng = [A1:a20]
Mafonction rng, rng.Columns
End Sub

Function Mafonction(r As Range, RowColumns As Range)
x = RowColumns(1).Address = RowColumns.Rows(1).Address
MsgBox Array("colonnes", "lignes")(Abs(x))
End Function
testé avec différentes plages de cellules
 

Dranreb

XLDnaute Barbatruc
Mais pourquoi tester l'adresse ?
Mon idée c'était que si c'est un Range.Rows son Item(1).Rows.Count = 1 et pas son Item(1).Columns.Count et
si c'est un Range.Columns son Item(1).Columns.Count = 1 et pas son Item(1).Rows.Count.
 

Dranreb

XLDnaute Barbatruc
Non, je n'ai pas testé, mais même si elle est carrée, avec un For Each In on récupère des lignes si c'est un .Rows et des colonnes si c'est un .Columns, alors je pensais que c'était pareil avec son item 1, et donc qu'il pouvait avoir plusieurs lignes mais une seule colonne ou l'inverse.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
cet exemple t'aidera mieux a comprendre
une plage de 10 lignes et 10 colonnes
VB:
Sub test()
    Dim rng As Range

    Set rng = [A1:j10]
    Mafonction rng, rng.Rows

    Set rng = [A1:j10]
    Mafonction rng, rng.Columns
End Sub

Function Mafonction(r As Range, RowColumns As Range)
    Dim texte As String

    texte = " RowColumns(1).Address = " & RowColumns(1).Address & " " & RowColumns(1).Cells.Count & " cellules" & vbCrLf & vbCrLf

    texte = texte & " RowColumns.Rows(1).Address = " & RowColumns.Rows(1).Address & " " & RowColumns.Rows(1)(1).Cells.Count & " cellules" & vbCrLf & vbCrLf

    x = RowColumns(1).Address = RowColumns.Rows(1).Address

    texte = texte & "Résultat : " & Array("colonnes", "lignes")(Abs(x))

    MsgBox texte

End Function
l'astuce réside dans
RowColumns.Rows(1) .address et RowColumns(1).address
par le cells.count je peux avoir la même chose sur une plage egale en nombre de lignes et colonnes
par les adresse là c'est différent
 

patricktoulon

XLDnaute Barbatruc
ben non justement
ou je pourrais-je bien faire la difféernce avec un count que ce soit des cells ou des rows ou des columns
si j'ai 10 lignes et 10 colonnes par exemple comme on peut le voir dans le msgbox
j'ai tout le temps 10 cellules
sauf que si on teste les adresses ce ne sont pas les mêmes

la seule faille dans cette méthode c'est si j'injecte un range de une seule cellule
 

Dranreb

XLDnaute Barbatruc
Bon, je me suis décidé à tester, et, désolé mais ça marche exactement comme je le souhaitais :
VB:
Option Explicit
Sub Test()
   Dim Rng As Range
   Set Rng = [A1:J10]
   MsgBox Mafonction(Rng)
   MsgBox Mafonction(Rng.Rows)
   MsgBox Mafonction(Rng.Columns)
   End Sub
Function Mafonction(ByVal Rng As Range) As String
   Dim LMax As Long, CMax, L1 As Long, C1 As Long
   LMax = Rng.Rows.Count
   CMax = Rng.Columns.Count
   L1 = Rng(1).Rows.Count
   C1 = Rng(1).Columns.Count
   Mafonction = Choose(1 - 2 * (L1 > 1) - (C1 > 1), _
      LMax * CMax & " cells", _
      LMax & " lignes de " & CMax, _
      CMax & " colonnes de " & LMax)
   End Function
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
oui je suppose que l'on peut encore en trouver d'autre de méthodes
mais reconnais que tu tricote
alors que je le fait en une ligne


VB:
msgbox Array("colonnes", "lignes")(Abs(RowColumns(1).Address = RowColumns.Rows(1).Address))
 

Discussions similaires

Réponses
6
Affichages
573
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…