Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
697 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA]Numéro de colonne d'après son libellé

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VBA]Numéro de colonne d'après son libellé

n°2275056
BrisChri
Since 1956
Posté le 05-02-2016 à 10:21:43  profilanswer
 

J’ai une table Acess qui est une feuille excel.xlsx, ce xlsx est créé au départ d’un csv, ce csv est créé au départ de glpi.
L’ordre des colonnes du csv dépend de l’ordre des colonnes dans glpi et chacun peut organiser ces colonnes comme il veut (pas tout le monde, mais passons).
Résultat, la colonne 12 de l’un n’aura pas obligatoirement le même contenu que la colonne 12 du fichier créé par un autre…
Et je dois, dans une macro Excel, tripoter le contenu de certaines colonnes (ID par exemple) pour les rendre utilisables par Acess.
Pour l’instant, la macro utilise ceci :

Code :
  1. nColID = 1
  2. nColTitle = 2
  3. nColEntity = 3
  4. nColdOpen = 4
  5. nColDescription = 5
  6. nColStatus = 6
  7. nColAssignedTech = 7
  8. nColLinked = 8
  9. nColRequester = 9
  10. nColPriority = 10
  11. nColAssignedGroup = 11
  12. nColdUpdate = 12


Je m'en sers ainsi :

Code :
  1. Cells(nLigne, nColID).Value = Val(Cells(nLigne, nColID))
  2. Cells(nLigne, nColAssignedTech).Value = RTrim(LTrim(Cells(nLigne, nColAssignedTech)))
  3. Cells(nLigne, nColLinked).Value = Val(Cells(nLigne, nColLinked))


J’aimerais remplacer ces valeurs fixes par
    nColID = numéro de la colonne dont le titre est ID
    nColAssignedTech = numéro de colonne dont le libellé est « Assigned to – Technician »
Je ne trouve pas la fonction qui le ferait.
Certains libellé de colonnes sont en plusieurs mots, ça facilite encore les choses, pire, quand il y a plusieurs mots, le premier peut être le même pour 2 colonnes (7 & 11 par exemple) :)


Message édité par BrisChri le 05-02-2016 à 10:39:06

---------------
Si une frite n'a pas de mayo, alors elle ne pourra pas aller à la piscine
mood
Publicité
Posté le 05-02-2016 à 10:21:43  profilanswer
 

n°2275061
BrisChri
Since 1956
Posté le 05-02-2016 à 14:03:41  profilanswer
 

Je pense que RechercheV devrait convenir à ce que je veux faire
Je ne vois pas trop comment m'en servir en VBA
Si ça rend un range, je peux éclater le résultat (instruction split) pour séparer ligne et colonne
nCol = RechercheV(range(RangeLigneTitre); "ID" )
nColID = nCol
Le faire pour toutes les colonnes à modifier, boucler pour faire les modifs.


---------------
Si une frite n'a pas de mayo, alors elle ne pourra pas aller à la piscine
n°2275062
Chelmi18
Posté le 05-02-2016 à 14:15:30  profilanswer
 


Salut,
 
Tu peux effectivement le faire en VBA avec la fonction .Find
 

Code :
  1. Col_TOTO = Sheets("maFeuille" ).Range("1:1" ).Find(What:="TOTO", after:=Cells(1, 1), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Column


 
Plus d'informations sur la syntaxe : http://www.commentcamarche.net/faq [...] la-syntaxe

n°2275066
BrisChri
Since 1956
Posté le 05-02-2016 à 15:03:58  profilanswer
 

Code :
  1. Dim wb As Workbook
  2. Dim ws As Worksheet
  3. Dim rLib As Range
  4. Dim rRes As Range
  5. Dim nLigne As Long
  6. Dim nMaxLigne As Long
  7. Dim nCol As Long
  8. Dim nMaxCol As Long
  9. Dim nColID As Long
  10. Dim nColLink As Long
  11. Dim nColTech As Long
  12. Sub maj_glpi()
  13.     Set wb = Workbooks.Open("\\GLPI\glpi2.xlsx" )
  14.     Set ws = wb.Worksheets(1)
  15.    
  16.     nMaxCol = Cells(1, Columns.Count).End(xlToLeft).Column
  17.     nMaxLigne = Range("A" & Rows.Count).End(xlUp).Row
  18.  
  19.     Set rLib = Range(Cells(1, 1), Cells(nMaxCol, 1))
  20.     Set rRes = Range(rLib).Find(what:="Assigned to - Technician", after:=Cells(1, 1), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
  21.     nColTech = Range(rRes).Adress.Column


Erreur '1004': la métode 'range' de l'objet _Global a échoué
ligne 23 en jaune fluo
 
Je ne vois pas où je faute
 


---------------
Si une frite n'a pas de mayo, alors elle ne pourra pas aller à la piscine
n°2275075
Marc L
Posté le 05-02-2016 à 16:32:00  profilanswer
 

 
           Bonjour,
 
           réalisable aussi via la fonction de feuille de calculs d'Excel EQUIV (cf l'aide d'Excel), Application.Match en VBA …
 
           Exemple pour un bloc contigu de lignes et de colonnes à partir de la cellule A1 :
 

Code :
  1. With Workbooks.Open("\\GLPI\glpi2.xlsx" ).Worksheets(1).Cells(1).CurrentRegion
  2.         V = Application.Match("ID", .Rows(1), 0)
  3.         If IsNumeric(V) Then nColID = V
  4.            
  5.     End With


n°2275076
BrisChri
Since 1956
Posté le 05-02-2016 à 16:54:12  profilanswer
 

Je regarde ça lundi, oui, je suis déjà rentré.
 
Si je comprends ton code, ça devrait donner :

Code :
  1. Dim vRes as variant
  2. nColID = 0
  3. nColTech = 0
  4. nColLink = 0
  5. ...
  6. activate cells(1,1)                                            ' indispensable ? (pour le CurrentRegion vu qu'il y a du code avant)
  7. with ws.Cells(1).CurrentRegion
  8.    vRes = Application.Match("ID", .Rows(1), 0)
  9.    If IsNumeric(vRes) Then nColID = vRes
  10.    vRes = Application.Match("Assigned to - Technician", .Rows(1), 0)
  11.    If IsNumeric(vRes) Then nColTech = vRes
  12.    vRes = Application.Match("??", .Rows(1), 0)                 ' je ne connais pas le texte par cœur
  13.    If IsNumeric(vRes) Then nColLink = vRes
  14. end with
  15. If (nColID <> 0) AND (nColTech <> 0) AND (nColLink <> 0)
  16.    for
  17.       ...
  18.    netxt
  19. end if


et si c'est bon, je peux supprimer mes définition rXXX as Range
 
 
:jap:


---------------
Si une frite n'a pas de mayo, alors elle ne pourra pas aller à la piscine
n°2275104
Marc L
Posté le 06-02-2016 à 11:22:40  profilanswer
 

 
           La ligne de code n° 6 ne sert à rien et en général, Activate comme Select sont à proscrire …
 
           CurrentRegion est juste un moyen simple de pointer sur une plage contigüe.
           Et le reste du code devrait être à l'intérieur du bloc With
 
           Ligne n°15 :  If nColID * nColTech * nColLink > 0 Then
 

n°2275170
BrisChri
Since 1956
Posté le 08-02-2016 à 08:45:40  profilanswer
 

:jap:
 
ça fonctionne bien, voici la version définitive
 

Code :
  1. Option Explicit
  2. Dim wb As Workbook
  3. Dim ws As Worksheet
  4. Dim nLigne As Long
  5. Dim nMaxLigne As Long
  6. Dim nCol As Long
  7. Dim nMaxCol As Long
  8. Dim vRes As Variant
  9. Dim nColID As Long
  10. Dim nColTitle As Long
  11. Dim nColEntity As Long
  12. Dim nColdOpen As Long
  13. Dim nColDesc As Long
  14. Dim nColStatus As Long
  15. Dim nColTech As Long
  16. Dim nColLink As Long
  17. Dim nColReq As Long
  18. Dim nColPriority As Long
  19. Dim nColGroup As Long
  20. Dim nColdUpd As Long
  21. ____________________________________________________________________________
  22. Sub maj_glpi()
  23.     Set wb = Workbooks.Open("\\GLPI\glpi.xlsx" )
  24.     Set ws = wb.Worksheets(1)
  25.    
  26.     nMaxCol = Cells(1, Columns.Count).End(xlToLeft).Column
  27.     nMaxLigne = Range("A" & Rows.Count).End(xlUp).Row
  28.    
  29.     For nCol = 1 To nMaxCol
  30.         Cells(1, nCol).Value = LTrim(RTrim(Cells(1, nCol).Value))
  31.     Next nCol
  32.     With ws.Cells(1).CurrentRegion
  33.        vRes = Application.Match("ID", .Rows(1), 0)
  34.        If IsNumeric(vRes) Then nColID = vRes
  35.        vRes = Application.Match("Title", .Rows(1), 0)
  36.        If IsNumeric(vRes) Then nColTitle = vRes
  37.        vRes = Application.Match("Entity", .Rows(1), 0)
  38.        If IsNumeric(vRes) Then nColEntity = vRes
  39.        vRes = Application.Match("Opening date", .Rows(1), 0)
  40.        If IsNumeric(vRes) Then nColdOpen = vRes
  41.        vRes = Application.Match("Description", .Rows(1), 0)
  42.        If IsNumeric(vRes) Then nColDesc = vRes
  43.        vRes = Application.Match("Status", .Rows(1), 0)
  44.        If IsNumeric(vRes) Then nColStatus = vRes
  45.        vRes = Application.Match("Assigned to - Technician", .Rows(1), 0)
  46.        If IsNumeric(vRes) Then nColTech = vRes
  47.        vRes = Application.Match("Linked tickets - All", .Rows(1), 0)
  48.        If IsNumeric(vRes) Then nColLink = vRes
  49.        vRes = Application.Match("Requester", .Rows(1), 0)
  50.        If IsNumeric(vRes) Then nColReq = vRes
  51.        vRes = Application.Match("Priority", .Rows(1), 0)
  52.        If IsNumeric(vRes) Then nColPriority = vRes
  53.        vRes = Application.Match("Assigned to - Group", .Rows(1), 0)
  54.        If IsNumeric(vRes) Then nColGroup = vRes
  55.        vRes = Application.Match("Last update", .Rows(1), 0)
  56.        If IsNumeric(vRes) Then nColdUpd = vRes
  57.     End With
  58.     If nColID * nColTitle * nColEntity * nColdOpen * nColDesc * nColStatus * nColTech * nColLink * nColReq * nColPriority * nColGroup * nColdUpd > 0 Then
  59.         For nLigne = 2 To nMaxLigne
  60.             Cells(nLigne, nColID).Value = Val(Cells(nLigne, nColID))
  61.             Cells(nLigne, nColTech).Value = RTrim(LTrim(Cells(nLigne, nColTech)))
  62.             Cells(nLigne, nColLink).Value = Val(Cells(nLigne, nColLink))
  63.         Next nLigne
  64.     Else
  65.         MsgBox "Certaines colonnes sont manquantes" & Chr(10) & " " & Chr(10) & "Il faut modifier la vue dans GLPI et" & Chr(10) & "refaire l'extraction", vbCritical
  66.     End If
  67.     wb.Close savechanges:=True
  68. End Sub


---------------
Si une frite n'a pas de mayo, alors elle ne pourra pas aller à la piscine

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA]Numéro de colonne d'après son libellé

 

Sujets relatifs
Fonction couper-coller VBA[Excel] Incrémenter si doublon dans une colonne
Chronomètre en VBAVBA Word prend son temps
Suppression de colonne d'une selectionProbleme compatibilité VBA MSFLEXGRID Excel 2013
Retourner une variable à un programme VBA appelantVBA Word pile saturée
Code VBA trop lentConversion algorithme Python -> VBA (combinaisons de p élém. parmi n)
Plus de sujets relatifs à : [VBA]Numéro de colonne d'après son libellé


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR