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 :
i= 0
Do While UCase(xls.Sheets("R_analyse_croiséeé).Cells(1, i)) <> 0
i = i + 1
Loop
colonne = i
Message édité par darkspoilt le 05-07-2007 à 19:19:48
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 :
Dim une_cellule As Range
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 :
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 :
Dim Celllule As Range ' <-- Bien :)
Dim CelluleV As Range ' <-- Inutile :( Mais pourquoi pas
For Each Cellule In xls.Sheets("R_analyse_croiséeé).Cells() ' <-- Bien :)
If Cellule = "" Then Exit For ' <-- Bof.
Next Cellule
Set CelluleV = Cellule ' <-- Inutile :( Mais pourquoi pas
Celulle.Copy Destination:= .... ' <-- C'est ça que tu avais oublié !!!
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 :
Dim xls As Excel.Appliaction
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 :
Dim wb As Excel.WorkBook 'Classeur
Dim wsAnaCroi As Excel.WorkSheet 'La feuille R_Analyse_croisée
Dim wsAutre As Excel.WorkSheet 'Une autre feuille
Dim cell As Range
Set wb1 = xls.WorkBooks(1)
Set wsAnaCroi = wb1.WorkSheets("R_Analyse_croisée" )
Set wsAutre = xls.WorkBook("wb1 ou un autre" ).WorkSheets("Une_autre_feuille" )
Set cell = wsAnaCroi.Range("A1" ).End(xlToRight)
cell.Copy Destination:=wsAutre.Range("C4" )
Set wb1 = Nothing
Set wsAnaCroi = Nothing
Set wsAutre = Nothing
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.
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 ??
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
Certe plus rapide et mieux sous Excel, mais joli je ne serais en juger ...
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
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