• Initiateur de la discussion Initiateur de la discussion dodineau
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

dodineau

XLDnaute Occasionnel
Bonjour à toutes et tous.
Quand j'exécute ma macro j'obtiens une erreur : "L'indice n'appartient pas à la sélection"

Voici mon début de macro :
VB:
Dim Source As Worksheet
Set Source = Workbooks("Z:\Gestion Temps.xlsm").Worksheets("Planning")

Merci pour votre aide
 
Solution
non ca n'est pas possible
en vba seulement avec excel4macro ou ADO

EXEMPLE AVEC ExecuteExcel4Macro
VB:
Sub récup_une_plage_de_cellules()
    Dim chemin$, fichier$, feuille$, cellule As Range, rang As Range
    chemin = "C:\Users\polux\Desktop"
    fichier = "hhhhhtml.xls"
    feuille = "Feuil1"
    Set rang = Range("E3:F5")
    tablo = (GetVal_on_closed_fich(chemin, fichier, feuille, rang))
    Cells(1, 1).Resize(UBound(tablo), UBound(tablo, 2)) = tablo
End Sub
Sub récup_une_seule_valeur()
    Dim chemin$, fichier$, feuille$, cellule As Range, rang As Range
    chemin = "C:\Users\polux\Desktop"
    fichier = "hhhhhtml.xls"
    feuille = "Feuil1"
    Set rang = Range("E3")
    MsgBox GetVal_on_closed_fich(chemin, fichier...
Merci pour ces réponses.
Je pensais qu’il était possible de faire appel à des valeurs de cellules d’un classeur, qu’il soit fermé ou ouvert. Un peu comme les liaisons dans les formules que l’on peut écrire dans excel
 
non ca n'est pas possible
en vba seulement avec excel4macro ou ADO

EXEMPLE AVEC ExecuteExcel4Macro
VB:
Sub récup_une_plage_de_cellules()
    Dim chemin$, fichier$, feuille$, cellule As Range, rang As Range
    chemin = "C:\Users\polux\Desktop"
    fichier = "hhhhhtml.xls"
    feuille = "Feuil1"
    Set rang = Range("E3:F5")
    tablo = (GetVal_on_closed_fich(chemin, fichier, feuille, rang))
    Cells(1, 1).Resize(UBound(tablo), UBound(tablo, 2)) = tablo
End Sub
Sub récup_une_seule_valeur()
    Dim chemin$, fichier$, feuille$, cellule As Range, rang As Range
    chemin = "C:\Users\polux\Desktop"
    fichier = "hhhhhtml.xls"
    feuille = "Feuil1"
    Set rang = Range("E3")
    MsgBox GetVal_on_closed_fich(chemin, fichier, feuille, rang)
  End Sub


'La fonction retourne un string ou tableau
'1 un string si l'argument "rang" est une seule celluleet donc sa valeur
'2 une variable tableau si rang est une plage de cellules  donc les !! valeurs dans une variable tableau

Function GetVal_on_closed_fich(ByVal chemin As String, ByVal fichier As String, ByVal feuille As String, rang As Range) As Variant
    Dim Rc$, tableau(), lig&, col&
    If rang.Cells.Count = 1 Then
        Rc = "R" & rang.Row & "C" & rang.Column
        GetVal_on_closed_fich = ExecuteExcel4Macro("'" & chemin & "\[" & fichier & "]" & feuille & "'!" & Rc)
    Else
        ReDim tableau(1 To rang.Rows.Count, 1 To rang.Columns.Count)
        For Each cel In rang.Cells
            lig = cel.Row: col = cel.Column
            Rc = "R" & lig & "C" & col
            tableau(lig - rang.Row + 1, col - rang.Column + 1) = ExecuteExcel4Macro("'" & chemin & "\[" & fichier & "]" & feuille & "'!" & Rc)
        Next
        GetVal_on_closed_fich = tableau
    End If
End Function

EXEMPLE AVEC ADO
VB:
Sub extractionValeurCelluleClasseurFerme()


    Dim Source As ADODB.Connection

    Dim ADOCommand As ADODB.Command
    Dim Rst As ADODB.Recordset
    Dim Fichier As String, Cellule As String, Feuille As String

    'Adresse de la cellule contenant la donnée à récupérer
    Cellule = "A3"
    'Pour une plage de cellules, utilisez:
    'Cellule = "A4:C10"

    NomFeuille = "essai$"    'n'oubliez pas d'ajouter $ au nom de la feuille.
    'Chemin complet du classeur fermé
    Fichier = ThisWorkbook.Path & "\test2.xlsm"

    Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fichier & ";Extended Properties=""Excel 12.0;HDR=NO;"";"
    'Source.CursorLocation = adUseClient
    
    Set Rst = New ADODB.Recordset
    Rst.Open "SELECT * FROM [" & NomFeuille & "A1:A10000] WHERE NOT ISNULL(F1);", Source, adOpenStatic, adLockReadOnly
    If Rst.RecordCount > 0 Then Rst.MoveLast
    Set Rst = Source.Execute("SELECT * FROM [" & NomFeuille & Cellule & "]""")

    Sheets("Feuil1").Range("B5") = Val(Rst("F1")) + 1

    Rst.Close
    Source.Close
    Set Source = Nothing
    Set Rst = Nothing
    Set ADOCommand = Nothing
End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
265
  • Question Question
Réponses
7
Affichages
450
  • Question Question
Microsoft 365 Excel VBA
Réponses
5
Affichages
529
Réponses
3
Affichages
413
Réponses
9
Affichages
806
Réponses
10
Affichages
472
Retour