VBA via access recherche une colonne vide d'un fichier Excel
Dernière réponse : dans Programmation
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.
Si quelqu'un peut m'aider merci d'avance.
i= 0 Do While UCase(xls.Sheets("R_analyse_croiséeé).Cells(1, i)) <> 0 i = i + 1 Loop colonne = i
Autres pages sur : vba via access recherche colonne vide fichier excel
Lassé par la pub ? Créez un compte
J'ai en fait créer ce code pour ma recherche ce qui fonctionne apparement
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
Si quelqu'un peut m'aider merci d'avance
dim Celllule as Range dim CelluleV as Range For Each Cellule In xls.Sheets("R_analyse_croiséeé).Cells() If Cellule = "" Then Exit For Next Cellule Set CelluleV = Cellule 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
xls.Sheets("R_analyse_croiséeé).CelulleV.Copy
Si quelqu'un peut m'aider merci d'avance
J'ai trouvé plus simple
mais il me demadne un "="
Si quelqu'un peut me dire la ce qui ressort sinon
quand je fais ca
il me dis que la syntaxe n'est pas bosse si qu'elqu'un peut me fire pkoi je le remerci d'avance.
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
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.
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 :
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 :
Le End(xlToRight) est plus intelligent, mais je reviens sur ton pemier exemple pour que tu comprennes :
Alors je te vois traîner des xls.Sheets("R_Analyse_croisée") longs CMB.
Quelque part dans ton code, tu as écris :
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.
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.
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 :
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 :
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 :
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 :
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.
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 ??
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 ??
Tiens j'ai ca dans mes tiroirs.
Public Function GetCharacter(num As Long) As String On Error GoTo sortie_erreur ' Renvoit le caractères de l'alphabet correspondant à la position données ' ex : 3 -> C If num > 26 Then GetCharacter = Chr(Asc("A") + CLng(num / 26) - 2) & GetCharacter(num Mod 26) Else GetCharacter = Chr(Asc("A") + (num - 1)) End If sortie: Exit Function sortie_erreur: MsgBox "Getcharacter : " & Err.Description Resume sortie End Function
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
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
Lassé par la pub ? Créez un compte