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
tiens essaie avec une plage de 10 lignes et 1 colonne
VB:
Option Explicit
Sub Test()
   Dim Rng As Range
   Set Rng = [A1:a10]
   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
le ssage 1 et 2 me donne "10 cells"
donc ce n'est pas identifié comme ligne ;)
et pareil pour les colonnes si j'injecte [A1:J1]
 

Dranreb

XLDnaute Barbatruc
Quelle différence devrait-il y avoir lorsqu'il n'y a qu'une colonne entre le Rng et le Rng.Rows ?
Ma fonction en une instruction :
VB:
Function Mafonction(ByVal Rng As Range) As String
   Mafonction = Choose(1 - 2 * (Rng(1).Rows.Count > 1) _
      - (Rng(1).Columns.Count > 1), "cellules", "lignes", "colonnes")
   End Function
 

patricktoulon

XLDnaute Barbatruc
la différence c'est qu'en fonction de ce qui est demandé(rng.rows où rng.columns)
donc en fonction de "Rowcolumns" ,j'ai des variables qui changent dans la fonction pour la quelle cette identification est necessaire ;)

si je veux travailler en ligne alors ceci
si je veux travailler en colonne alors cela
voila différence ou elle va être;)
 

patricktoulon

XLDnaute Barbatruc
au lieu d'être tetu essai celui ou je detaille les address Post#11
et regarde bien avec
A1:A10
A1:J10
A1:J1
et toute celles que tu voudra bien tester sauf une plage à une seule cellule bien sur

Il n'empêche que Rng.Rows c'est la même chose que Rng
oui et non
oui par ce que le type renvoie "Range"
non car par exemple tu boucle dessus
Code:
for each rc in Rowcolumns
msgbox rc.address
next
remplace Rowcolumns par rng tu verra bien ;)
 

Dranreb

XLDnaute Barbatruc
Ben quoi, non, je trouve les mêmes R.Address dans For Each R in Rng le paramètre récupéré, qu'on lui passe Rng ou Rng.Rows quand il n'a qu'une colonne.
Qu'on prenne [A1:A10].Rows(1).Address ou qu'on fasse Set Rng = [A1:A10].Rows puis qu'on prenne Rng(1).Address c'est toujours la même adresse d'une seule cellule puisqu'il n'y a qu'une colonne.
Je ne vois décidément aucune distinction possible entre une plage d'une seule colonne et ses lignes.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bon
tu n'a pas compris visiblement
c'est justement le truc
A1:A10 donnera toujours "ligne" si Rowcolumns c'est le rng.rows
maintenant si Rowcolumns c'est le rng.columns là c'est difféerent
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(rng As Range, RowColumns As Range)
    Dim texte As String
    texte = "plage testée = [" & rng.Address & " ]" & vbCrLf & vbCrLf
    
    texte = 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

mon but ce n'est pas d'indentifier le nombre de lignes ou de colonnes
mais bien d'identifier si "Rowcolumns" c'est rng.rows rng.columns

alors avec cells.count ou rows.count ou column.count avec A1:A10 j'aurais un bon résultat
mais avec une plage de 10X10(colonnes et ligne )par exemple je suis chocolat
regarde les messages
prends ton temps
1702541177969.png
 

Dranreb

XLDnaute Barbatruc
Oui, bien sur, mais c'est pareil, on ne peut pas distinguer Rng de Rng.Columns si Rng n'a qu'une ligne.
On ne peut distinguer d'une plage de cellules qu'une plage de lignes de plusieurs colonnes ou une plage de colonnes de plusieurs lignes, respectivement par Rng(1].Columns.Count > 1 et Rng(1).Rows.Count > 1.
 

patricktoulon

XLDnaute Barbatruc
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
    GetTypeRange = Array("column", "Row")(Abs(X))
End Function
pas d'erreur possible , sauf plage d'une seule cellule
 

Dranreb

XLDnaute Barbatruc
Ça ne change rien au fait qu'il est inutile de tester les adresses.
Le seul truc, je crois, c'est que tu ne veux que ça réponde "cellules" seulement si ce ne sont ni des lignes de plusieurs colonnes ni des colonnes de plusieurs lignes, et si c'est d'une des deux sortes, plutôt "lignes" si ce ne sont pas des colonnes de plusieurs lignes, même si ce ne sont pas spécifiquement des lignes de plusieurs colonnes, et "colonnes" si ce ne sont pas des lignes de plusieurs colonnes, même si ce ne sont pas spécifiquement des colonnes de plusieurs lignes.
 

patricktoulon

XLDnaute Barbatruc
re
non non
j'injecte rng.rows ou rng.columns
ca doit me répondre "row" ou "column" c'est tout
en effet on pourrait ajouter au cas ou j'injecte rng tout court que ca me renvoie "Range" tout simplement

je ne sais pas comment tu y arrive toi avec autre chose que "Address" ,perso j'ai testé rows.count et columns.count et ca ne marche pas dans tout les sens je l'ai montré dans la vidéo
 

Dranreb

XLDnaute Barbatruc
Le tout c'est de savoir ce que tu veux que ça réponde pour Rng tout court s'il n'a qu'une ligne ("Range" ou "Columns" ?) ou qu'une colonne ("Range" ou "Rows" ?). Parce que s'il n'a qu'une ligne il est indiscernable de Rng.Columns, et s'il n'a qu'une colonne il est indscernable de Rng.Rows.
 
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 215
Messages
2 086 330
Membres
103 185
dernier inscrit
salhit