XL 2013 connaitre le type de variable tableau un ou 2 dim et le sens

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
je cherche un moyen efficace de savoir quelle est le type de variable tableau une ou deux dim et est une ligne ou une colonne sans avoir a gérer des erreurs dans un sens ou dans l'autre
@Yeahou a donné un début de piste interessant mais c'est pas full right

VB:
Sub testy7()
a = [A1:H1].Value
MsgBox oneDim(a)
End Sub

Sub testy8()
a = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
MsgBox oneDim(a)
End Sub

Sub testy9()
Dim a(0 To 5, 1)
  a(5, 0) = "toto "
MsgBox oneDim(a) & " " & UBound(a, 2)
End Sub

'***********************************************************
'ERREUR!!!!
Sub testy10() ' erreur donne vrai quand base 0
Dim a(0 To 5, 0)
  a(5, 0) = "toto "
 'a(5) = "titi"    'erreur " nombre de dimensions incorect"
Msgbox  oneDim(a) & " " & UBound(a, 2)
End Sub
'***********************************************************

Sub testy11() '
Dim a(0 To 5)
MsgBox oneDim(a)
End Sub

Function oneDim(a)
  oneDim = UBound(a) + 1 - LBound(a) = Application.CountA(a)
End Function

il faudrait le moyen de compter le base 0 et ce sera bon
 
Solution
re
Bonjour @Yeahou
oui perso moi aussi je l'utilise rarement le ".iserr" de l'app
j'utilise typename par ce que je fait la même chose avec evaluate

pour le coup là il y en a pour tout les goûts

3 écriture différentes

sub de test

VB:
Dim q(1 To 1000000, 1 To 1)

Sub test0()    'tableau 1 colonne explicite base(1,1)
    MsgBox GetTypeArray(q)
    MsgBox GetTypeArray2(q)
    MsgBox GetTypeArray3(q)
End Sub

Sub testX0()    'tableau 1 colonne explicite base(1,1)
    Dim t
    t = [A1].Resize(1000000, 1).Value
    MsgBox GetTypeArray(t)
    MsgBox GetTypeArray2(t)
    MsgBox GetTypeArray3(t)
End Sub

Sub test1()    'tableau 1 colonne explicite base (1,1)
    t = [A1:A1000000].Value
    MsgBox...

soan

XLDnaute Barbatruc
Inactif
Bonjour dysorthographie, Patrick,

pour compiler j'ai utilisé le framework 3.5 !

j' ai la 4.7.2 chez moi, mais j'ai la 3.5 au bureau sur pc.

sur mon PC avec Windows 7, j'ai ceci :

Image.jpg


➯ vous pouvez faire une mise à jour pour une version plus récente ! :)

soan
 

soan

XLDnaute Barbatruc
Inactif
de toutes façons, que ce soit avec Windows 7 ou Windows 10, en principe, quand tu fais une mise à jour de Windows, ça propose d'installer aussi la version la plus récente de Framework, n'est-ce pas ? 😜 je veux dire par là que je n'ai rien de particulier à faire pour avoir la toute dernière version de Framework : normalement, ça se fait automatiquement ! 😊

soan
 

patricktoulon

XLDnaute Barbatruc
re
ça dépends si tu a réglé pour tout accepter
il me semble que net framework est dans les facultatives
tu n'est pas obligé de tout accepter non plus
si tu installe une nouvelle app et qu'elle nécessite le framework supérieur l’installateur te le diras

et les gens se demandent pourquoi au fil du temps leur exploit rame 🤣 🤣 ;)
 

soan

XLDnaute Barbatruc
Inactif
ça dépend si tu as réglé pour tout accepter.
il me semble que net framework est dans les facultatives.
tu n'es pas obligé de tout accepter non plus.

j'ai réglé pour ne pas recevoir automatiquement les mises à jour ; je fais moi-même une recherche de mises à jour via Windows Update ; et je confirme que pour Net Framework, ça se met bien dans les mises à jour facultatives ; perso, toujours systématiquement, je la coche et je l'installe ; comme j'y connais rien là-dessus, je préfère avoir la toute dernière version ... en croisant les doigts pour que ce ne soit pas une mise à jour foireuse et qu'elle règle effectivement d'anciens bugs. 🍀 de toutes façons, en cas de problème, le point de restauration créé me permettra de revenir à une situation antérieure stable ! 😊

vu toutes les applications qui utilisent Framework, de façon sous-jacente, Microsoft a drôlement intérêt à c'qu'il marche correctement ... quoique tu m'diras : « avec toutes les mises à jour de Windows foireuses qu'il y a déjà eu avant dans un passé plus ou moins proche, Krosoft est pas à ça près, et en vertu de sa position dominante sur le marché des logiciels, il se fiche royalement qu'une mise à jour de Windows produise des effets néfastes plus qu'autre chose ! donc idem pour une mise à jour de Net Framework ! ». 😁 (merci qui ? merci Krosoft ! 😜)

soan
 

patricktoulon

XLDnaute Barbatruc
ben c'est pas une bonne chose
car :
tu pourrais tres bien avoir des applications déjà installées qui utilise une version inferieure
et de ce fait l'installation du framework dernière version pourrait dans le pire planter tes app et au moindres mal générer quelque bugs sans gravité
 

patricktoulon

XLDnaute Barbatruc
re
en cherchant dans mes archives j'ai retrouvé un truc
tiens met toi ça dans un module chez moi ça fonctionne encore
et lance la sub et attend
VB:
Sub list_Wupdate_disponible()
    Dim tablo, sessionWupdate As Object, updateSearcher As Object
    Set sessionWupdate = CreateObject("Microsoft.Update.Session")
    sessionWupdate.ClientApplicationID = "0+0=la tète a toto"

    Set updateSearcher = sessionWupdate.CreateUpdateSearcher()
    Set searchResult = updateSearcher.Search("IsInstalled=0 and Type='Software' and IsHidden=0")
    For i = 0 To searchResult.Updates.Count - 1
        Set Update = searchResult.Updates.Item(i)
        'MsgBox Update.Title
        Cells(i + 1, 1) = Update.Title
    Next
End Sub

purée le déterrage 🤣 🤣 🤣 🤣 🤣
 

Dudu2

XLDnaute Barbatruc
Bonjour les Excellents,

Pas sûr de tout comprendre de ces longs échanges survolés, mais si le but est de trouver le nombre de dimensions d'une table sans utiliser la gestion d'erreur, est-ce que ceci trouvé par ici serait utilisable ?
VB:
Option Explicit

#If VBA7 Then
  Private Type Pointer: Value As LongPtr: End Type
  Private Declare PtrSafe Sub RtlMoveMemory Lib "kernel32" (ByRef dest As Any, ByRef src As Any, ByVal Size As LongPtr)
#Else
  Private Type Pointer: Value As Long: End Type
  Private Declare Sub RtlMoveMemory Lib "kernel32.dll" (ByRef dest As Any, ByRef src As Any, ByVal Size As Long)
#End If

Private Type TtagVARIANT
    vt As Integer
    r1 As Integer
    r2 As Integer
    r3 As Integer
    sa As Pointer
End Type

Public Function GetDims(source As Variant) As Integer
    Dim va As TtagVARIANT
    RtlMoveMemory va, source, LenB(va)                                            ' read tagVARIANT              '
    If va.vt And &H2000 Then Else Exit Function                                   ' exit if not an array         '
    If va.vt And &H4000 Then RtlMoveMemory va.sa, ByVal va.sa.Value, LenB(va.sa)  ' read by reference            '
    If va.sa.Value Then RtlMoveMemory GetDims, ByVal va.sa.Value, 2               ' read cDims from tagSAFEARRAY '
End Function

Sub a()
    Dim t(1 To 2, 0)  
    'Dim t()
    'Dim t(-2 To 3)
   
    MsgBox GetDims(t)
End Sub
 

Discussions similaires

Réponses
4
Affichages
413

Statistiques des forums

Discussions
314 495
Messages
2 110 223
Membres
110 708
dernier inscrit
novy16