Se connecter avec
S'enregistrer | Connectez-vous

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

Dernière réponse : dans Programmation
Lassé par la pub ? Créez un compte

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

  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

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


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

J'ai trouvé plus simple
  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
  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.
Expert Programmation

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

  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.  
  6. Set wb1 = xls.WorkBooks(1)
  7. Set wsAnaCroi = wb1.WorkSheets("R_Analyse_croisée")
  8. Set wsAutre = xls.WorkBook("wb1 ou un autre").WorkSheets("Une_autre_feuille")
  9.  
  10. Set cell = wsAnaCroi.Range("A1").End(xlToRight)
  11. cell.Copy Destination:=wsAutre.Range("C4")
  12.  
  13. Set wb1 = Nothing
  14. Set wsAnaCroi = Nothing
  15. Set wsAutre = Nothing
  16. 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 ??
Expert Programmation

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

Tiens j'ai ca dans mes tiroirs.

  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

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
Lassé par la pub ? Créez un compte