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

darkspoilt

Expert
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.
[cpp]
i= 0
Do While UCase(xls.Sheets("R_analyse_croiséeé).Cells(1, i)) <> 0
i = i + 1
Loop
colonne = i[/cpp]
 

darkspoilt

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

[cpp]
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[/cpp]

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

[cpp]xls.Sheets("R_analyse_croiséeé).CelulleV.Copy[/cpp]

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

darkspoilt

Expert
J'ai trouvé plus simple
[cpp]xls.Sheets("R_Analyse_croisée").Range("a1").End(xlToRight)(1, 2)[/cpp]
mais il me demadne un "="
Si quelqu'un peut me dire la ce qui ressort sinon
quand je fais ca
[cpp]xls.Sheets("R_Analyse_croisée").Range("A1").End(xlToRight)(1, 2)[/cpp]
il me dis que la syntaxe n'est pas bosse si qu'elqu'un peut me fire pkoi je le remerci d'avance.
 

zeb

Modérateur
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:
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.
 

Freeman23

Expert
Le meilleur moyen de trouver la position de la dernière colonne.
Code:
Dim pos as long 
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
 

darkspoilt

Expert
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

Modérateur
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 :)
 

darkspoilt

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

Freeman23

Expert
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 ...
 

Freeman23

Expert
Tiens j'ai ca dans mes tiroirs.

Code:
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
 

Freeman23

Expert
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.
 

kiki29

Habitué
Déjà donné ici sous forme de fonctions personnalisées
Les limites : A à FXSHRXW | 1 à 2147483647
[fixed]
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
[/fixed]
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 126
Messages
6 717 807
Membres
1 586 365
Dernier membre
matiOs1
Partager cette page
Haut