web-dev-qa-db-fra.com

Erreur VBA 1004 - La méthode de sélection de la classe de plage a échoué

Première affiche, donc s'il y a une mise en forme ou des directives que je n'ai pas respectées, merci de me le faire savoir afin que je puisse la corriger. 

Je demande donc fondamentalement à l'utilisateur le répertoire de fichiers du fichier Excel, puis je configure certaines variables (définies à l'origine comme variables de projet, car elles étaient utilisées et modifiées à d'autres endroits). J'ai également ajouté les lignes pour définir ces variables sur rien (juste au cas où, je ne pense pas que cela devrait avoir de l'importance). J'ai ensuite défini ces variables dans le fichier Excel, le classeur et les feuilles auxquelles je souhaite accéder. 

Dim filepath as String
filePath = CStr(fileDialog)              'ask file dir, set to string
Dim sourceXL As Variant                  'these three were orig project variables
Dim sourceBook As Variant
Dim sourceSheet As Variant
Dim sourceSheetSum As Variant

Set sourceXL = Nothing                    'set to nothing in case...?
Set sourceBook = Nothing
Set sourceSheet = Nothing
Set sourceSheetSum = Nothing

Set sourceXL = Excel.Application          'set to the paths needed
Set sourceBook = sourceXL.Workbooks.Open(filePath)
Set sourceSheet = sourceBook.Sheets("Measurements")
Set sourceSheetSum = sourceBook.Sheets("Analysis Summary")

Dim measName As Variant                    'create variable to access later
Dim partName As Variant

sourceSheetSum.Range("C3").Select           'THIS IS THE PROBLEM LINE

measName = sourceSheetSum.Range(Selection, Selection.End(xlDown)).Value
sourceSheetSum.Range("D3").Select
partName = sourceSheetSum.Range(Selection, Selection.End(xlDown)).Value

J'ai donc créé deux variables de feuille différentes, 'sourceSheets' et 'sourceSheetsSum', le code fonctionne si j'utilise 'sourceSheets', mais l'erreur 1004 se produit si j'utilise 'sourceSheetsSum'. J'ai aussi essayé le code avec la variable 'sourceSheet' complètement supprimée, au cas où cela remplacerait 'sourceSheetSum' pour une raison quelconque.

Je suis assez convaincu que le classeur Excel et les feuilles existent et sont appelés correctement, car j'ai exécuté un petit morceau de code pour parcourir toutes les feuilles du classeur et générer les noms, comme indiqué ci-dessous.

For j = 1 To sourceBook.Sheets.Count
Debug.Print (Sheets(j).name)
Next j

Avec la sortie de débogage de

Des mesures
Résumé d'analyse
Paramètres d'analyse

Alors, est-ce que quelqu'un a une idée de ce que cette erreur pourrait signifier, ou de la façon dont je pourrais éventuellement en apprendre davantage sur son erreur réelle?

EDIT: J’ai donc décidé d’ajouter un peu à la liste des noms de feuilles, ne sachant pas si cela aiderait du tout.

For j = 1 To sourceBook.Sheets.Count
    listSheet(j) = Sheets(j).name
Next j    
Debug.Print (listSheet(2))    
Set sourceSheetSum = sourceBook.Sheets(listSheet(2))

Le débogage imprime le résumé de l'analyse. Je sais donc que la feuille existe dans le classeur et qu'il ne devrait pas y avoir de problème de "faute de frappe" dans les noms. 
Le code a toujours la même erreur à la même ligne cependant.

deusxmach1na: Je pense que tu voulais que je change 

Dim sourceXL As Variant                  
Dim sourceBook As Variant
Dim sourceSheet As Variant
Dim sourceSheetSum As Variant

Set sourceSheet = sourceBook.Sheets("Measurements")

À 

Dim sourceXL As Excel.Application
Dim sourceBook As Excel.Workbook
Dim sourceSheet As Worksheet
Dim sourceSheetSum As Worksheet

Set sourceSheet = sourceBook.Worksheets("Measurements")

Mais cela ne change pas l'erreur, je me souviens que je l'avais similaire à celle-là, puis que je l'ai changée depuis que j'ai lu cette variante est comme une fourre-tout, pas vraiment si solide sur quelle variante est.

17
Onekuo

Vous devez sélectionner la feuille avant de pouvoir sélectionner la plage.

J'ai simplifié l'exemple pour isoler le problème. Essaye ça:

Option Explicit


Sub RangeError()

    Dim sourceBook As Workbook
    Dim sourceSheet As Worksheet
    Dim sourceSheetSum As Worksheet

    Set sourceBook = ActiveWorkbook
    Set sourceSheet = sourceBook.Sheets("Sheet1")
    Set sourceSheetSum = sourceBook.Sheets("Sheet2")

    sourceSheetSum.Select

    sourceSheetSum.Range("C3").Select           'THIS IS THE PROBLEM LINE

End Sub

Remplacez Sheet1 et Sheet2 par vos noms de feuille.

REMARQUE IMPORTANTE: L'utilisation de variantes est dangereuse et peut entraîner des bugs difficiles à éliminer. Utilisez-les uniquement si vous avez une raison très spécifique pour le faire.

25
Jon Crowell

Vous ne pouvez pas sélectionner une plage sans avoir au préalable sélectionné la feuille dans laquelle elle se trouve. Essayez de sélectionner d'abord la feuille et voyez si le problème persiste:

sourceSheetSum.Select
sourceSheetSum.Range("C3").Select
8
assylias

assylias et le chef de la restauration ont déjà expliqué pourquoi l’erreur se produisait.

Maintenant, en ce qui concerne ce que vous faites, d'après ce que je comprends, vous n'avez pas du tout besoin d'utiliser Select

Je suppose que vous faites cela à partir de VBA PowerPoint? Si oui, votre code sera réécrit comme

Dim sourceXL As Object, sourceBook As Object
Dim sourceSheet As Object, sourceSheetSum As Object
Dim lRow As Long
Dim measName As Variant, partName As Variant
Dim filepath As String

filepath = CStr(FileDialog)

'~~> Establish an Excel application object
On Error Resume Next
Set sourceXL = GetObject(, "Excel.Application")

'~~> If not found then create new instance
If Err.Number <> 0 Then
    Set sourceXL = CreateObject("Excel.Application")
End If
Err.Clear
On Error GoTo 0

Set sourceBook = sourceXL.Workbooks.Open(filepath)
Set sourceSheet = sourceBook.Sheets("Measurements")
Set sourceSheetSum = sourceBook.Sheets("Analysis Summary")

lRow = sourceSheetSum.Range("C" & sourceSheetSum.Rows.Count).End(xlUp).Row
measName = sourceSheetSum.Range("C3:C" & lRow)

lRow = sourceSheetSum.Range("D" & sourceSheetSum.Rows.Count).End(xlUp).Row
partName = sourceSheetSum.Range("D3:D" & lRow)
3
Siddharth Rout

Supprimer la plage, sélectionnez avant que la copie ne fonctionne pour moi Merci pour les messages.

0
Pete