FORUM Tom's Hardware » Programmation » VB / VBA / VBS » VBA via access recherche une colonne vide d'un fichier Excel
 

VBA via access recherche une colonne vide d'un fichier Excel

drouvre, C16-TR Le Bistrot : Kronos_Q, 1 utilisateur anonyme et 242 utilisateurs inconnus
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : VBA via access recherche une colonne vide d'un fichier Excel
 
Plus d'informations

Bonjour je veux rechercher la premiere champq vide de mon fichier excel en parcourant de colonne a colonne (gauche a droite) donc j'ai écris ceci mais cela ne fonctionne pas  
Si quelqu'un peut m'aider merci d'avance.

Code :
  1. i= 0
  2.         Do While UCase(xls.Sheets("R_analyse_croiséeé).Cells(1, i)) <> 0
  3.         i = i + 1
  4.         Loop
  5.         colonne = i


Message édité par darkspoilt le 05-07-2007 à 19:19:48

Plus d'informations

J'ai en fait créer ce code pour ma recherche ce qui fonctionne apparement
 

Code :
  1. dim Celllule as Range
  2. dim CelluleV as Range
  3.     For Each Cellule In xls.Sheets("R_analyse_croiséeé).Cells()
  4.         If Cellule = "" Then Exit For
  5.     Next Cellule
  6.     Set CelluleV = Cellule
  7.     Set Cellule = Nothing


 
mais je n'arrive pas a exploiter la colonne trouvé ni la ligne et si a faire des manimulation
 
j'ai essayé cela mais ce la ne  fonctionne pas
 

Code :
  1. xls.Sheets("R_analyse_croiséeé).CelulleV.Copy


 
Si quelqu'un peut m'aider merci d'avance

Plus d'informations

J'ai trouvé plus simple

Code :
  1. xls.Sheets("R_Analyse_croisée" ).Range("a1" ).End(xlToRight)(1, 2)


mais il me demadne un "="
Si quelqu'un peut me dire la ce qui ressort sinon  
quand je fais ca

Code :
  1. xls.Sheets("R_Analyse_croisée" ).Range("A1" ).End(xlToRight)(1, 2)


il me dis que la syntaxe n'est pas bosse si qu'elqu'un peut me fire pkoi je le remerci d'avance.

zeb
Profil : Modérateur libre
Plus d'informations

Ben parce que tu fais n'importe quoi ! .... :)

 

C'est quoi ce (1, 2) à la fin de ta ligne ?

 

Alors :
xls, c'est une instance de l'application Excel.
xls.Sheets("R_Analyse_croisée" ), c'est une des feuilles de calcul du classeur par défaut de xls.
xls.Sheets("R_Analyse_croisée" ).Range("A1" ), c'est la première cellule d'une feuille du classeur par défaut de xls.
xls.Sheets("R_Analyse_croisée" ).Range("A1" ).End(xlToRight), c'est la première cellule non vide de la ligne 1 d'une des feuilles de calcul ...

 

Et alors, tu veux en faire quoi ?
Y faire référence ?
Alors fais ça :

Code :
  1. Dim une_cellule As Range
  2. Set une_cellule = xls.Sheets("R_Analyse_croisée" ).Range("A1" ).End(xlToRight)
 

une_cellule n'est pas la dernière cellule non vide de la ligne 1 d'une des feuilles de calcul du classeur par défaut de xls.
une_cellule est une variable qui "pointe" vers cette cellule.

 

C'est pourquoi ce code était n'importe quoi :

Code :
  1. xls.Sheets("R_analyse_croiséeé).CelulleV.Copy
 

Le End(xlToRight) est plus intelligent, mais je reviens sur ton pemier exemple pour que tu comprennes :

Code :
  1. Dim Celllule As Range                                       ' <-- Bien :)
  2. Dim CelluleV As Range                                       ' <-- Inutile :( Mais pourquoi pas
  3. For Each Cellule In xls.Sheets("R_analyse_croiséeé).Cells() ' <-- Bien :)
  4.     If Cellule = "" Then Exit For                           ' <-- Bof.
  5. Next Cellule
  6. Set CelluleV = Cellule                                      ' <-- Inutile :( Mais pourquoi pas
  7. Celulle.Copy Destination:= ....                             ' <-- C'est ça que tu avais oublié !!!
  8. Set Cellule = Nothing                                       ' <-- Très bien :D
  

Alors je te vois traîner des xls.Sheets("R_Analyse_croisée" ) longs CMB.
Quelque part dans ton code, tu as écris :

Code :
  1. Dim xls As Excel.Appliaction
  2. Set xls = ....


C'est donc fait pour l'application.

 

Proposition :
Fais-le aussi pour le ou les classeurs, la ou les feuilles dont tu as le plus besoin.

 
Code :
  1. Dim wb As Excel.WorkBook   'Classeur
  2. Dim wsAnaCroi As Excel.WorkSheet 'La feuille R_Analyse_croisée
  3. Dim wsAutre As Excel.WorkSheet   'Une autre feuille
  4. Dim cell As Range
  5. Set wb1 = xls.WorkBooks(1)
  6. Set wsAnaCroi = wb1.WorkSheets("R_Analyse_croisée" )
  7. Set wsAutre = xls.WorkBook("wb1 ou un autre" ).WorkSheets("Une_autre_feuille" )
  8. Set cell = wsAnaCroi.Range("A1" ).End(xlToRight)
  9. cell.Copy Destination:=wsAutre.Range("C4" )
  10. Set wb1 = Nothing
  11. Set wsAnaCroi = Nothing
  12. Set wsAutre = Nothing
  13. Set cell = Nothing
 

Regarde, lignes 10 et 11, c'est plus lisible.
Si c'est pour trois lignes de code, oublie ça.
Si c'est pour un gros projet, n'hésite pas.


Message édité par zeb le 06-07-2007 à 10:53:11

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Le meilleur moyen de trouver la position de la dernière colonne.

Code :
  1. Dim pos as long
  2. pos = xls.Sheets("R_Analyse_croisée" ).Range("IV1" ).End(xlToLeft).column


 
Pos prendra pour valeur le numéro de la colonne que tu veux


---------------
S'il n'y a pas de solution c'est qu'il n'y pas de problème
Plus d'informations

merci beaucoup zeb pour tes explications
l'exemple du copy c'est surtout pour que je puisse parfaitement comprendre le fonctionnement
mais en fait je voulais surtout avoir la colonne vide pour faire des manipulations sur les colonne précédente en utilisant le numéro de ligne et de colonne.
D'ailleur avec Range on peux ??

zeb
Profil : Modérateur libre
Plus d'informations

Freeman23» +1
darkspoilt» C'est gentil de me dire à moi merci :) Et Freeman23, il peut aller se faire brosser ? :(

 

End ne te renvoie pas une cellule vide mais la première ou dernière cellule non-vide.
Range possède les méthodes Row et Column pour t'aider :)


Message édité par zeb le 06-07-2007 à 10:57:18

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Oui bien sur merci a freeman!! mais pour les ligne et colonne on peut pas faire cela avec Cells??


Message édité par darkspoilt le 06-07-2007 à 11:02:59
Plus d'informations

Oui et non. Tu peux créer une petite fonction qui pour un entier entre 1 et 256 te renvoie la lettre correspondante, avec ceci tu peux utiliser ton range tranquillement.
 
Il te faut pour cela les fonctions : Asc(), chr(),mod ...


---------------
S'il n'y a pas de solution c'est qu'il n'y pas de problème
Plus d'informations

Tiens j'ai ca dans mes tiroirs.  
 

Code :
  1. Public Function GetCharacter(num As Long) As String
  2.     On Error GoTo sortie_erreur
  3.     ' Renvoit le caractères de l'alphabet correspondant à la position données
  4.     ' ex : 3 -> C
  5.    
  6.     If num > 26 Then
  7.         GetCharacter = Chr(Asc("A" ) + CLng(num / 26) - 2) & GetCharacter(num Mod 26)
  8.     Else
  9.         GetCharacter = Chr(Asc("A" ) + (num - 1))
  10.     End If
  11.    
  12. sortie:
  13.     Exit Function
  14. sortie_erreur:
  15.     MsgBox "Getcharacter : " & Err.Description
  16.     Resume sortie
  17. End Function


---------------
S'il n'y a pas de solution c'est qu'il n'y pas de problème
zeb
Profil : Modérateur libre
Plus d'informations

Et ça, n'est-ce pas plus joli ?
http://www.presence-pc.com/forum/p [...] htm#t33593


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Certe plus rapide et mieux sous Excel, mais joli je ne serais en juger ... :P
 
Par contre ce n'est valable que pour Excel, vu que je travaille aussi sur Access je préfère les fonctions qui fonctionne quelquesoit l'appli que j'utilise.


---------------
S'il n'y a pas de solution c'est qu'il n'y pas de problème
zeb
Profil : Modérateur libre
Plus d'informations

+1 :jap:


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Déjà donné ici sous forme de fonctions personnalisées
Les limites : A à FXSHRXW | 1 à 2147483647


Public Function Lettre2NumCol(ByVal Chaine As String) As Long
Dim i As Long, ValeurCh As Long, v As Long
Const ChaineAlpha As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    For i = 1 To Len(Chaine)
        ValeurCh = InStr(1, ChaineAlpha, Mid(UCase(Chaine), i, 1))
        v = v * 26 + ValeurCh
    Next
    Lettre2NumCol = v
End Function
   
Public Function NumCol2Lettre(ByVal NumCol As Long) As String
Dim i As Long, x As Long, s As String
    For i = 6 To 0 Step -1
        x = (26 ^ (i + 1) - 1) / 25 - 1
        If NumCol > x Then
            s = s & Chr(((NumCol - x - 1) \ 26 ^ i) Mod 26 + 65)
        End If
    Next i
    NumCol2Lettre = s
End Function


Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » VB / VBA / VBS » VBA via access recherche une colonne vide d'un fichier Excel
 

Annonces Google
Publicité