2017-08-25 2 views
1

Je suis nouveau à VBA. J'essaye de copier des colonnes d'un classeur à un autre classeur. Ci-dessous est le sous j'essaie d'utiliser, mais obtenir une erreur de "erreur de temps d'exécution 9 - indice hors de portée". Aucune suggestion?VBA: plage de copie. erreur d'exécution 9 - indice en dehors de la plage

Sub copydata(wbSource As String, wsSource As String, rangeSource As String, wbDest As String, wsDest As String, rangeDest As String) 
    Workbooks(wbSource).Worksheets(wsSource).Range(rangeSource).copy Destination:=Workbooks(wbDest).Worksheets(wsDest).Range(rangeDest) 
End Sub 

Sub result() 
    ' I also tried to set wsSource and wsDest to 1 but still doesn't work 
    Call copydata("es.csv", "es", "A:B", "Workbook1.xlsm", "result", "A:B") 
End Sub 

Merci

EDIT: Ils sont dans le même répertoire. Et je créer le module dans Workbook1.xlsm

enter image description here

+0

L'un des classeurs/feuilles de calcul n'existe pas. –

+0

S'il vous plaît vérifier l'édition –

+0

Il ne suffit pas qu'ils sont «dans le même dossier». Ils doivent être dans le même espace de travail afin de référencer un autre classeur (par exemple .csv) d'un autre sans utiliser de références externes entièrement qualifiées. – Jeeped

Répondre

1

Ils doivent être à la fois ouvert lorsque vous copiez, qu'ils sont tous les deux dans le même dossier n'a pas d'importance.

Vous devez les ouvrir, puis vous pouvez copier des données.

Vérifiez les deux noms de feuilles (es pour es.csv, résultat pour Workbook1.xslm)

Sub copydata(wbSource As String, wsSource As String, rangeSource As String, 
wbDest As String, wsDest As String, rangeDest As String) 
    Workbooks(wbSource).Worksheets(wsSource).Range(rangeSource).Copy 
Destination:=Workbooks(wbDest).Worksheets(wsDest).Range(rangeDest) 
End Sub 

Sub result() 
    ' I also tried to set wsSource and wsDest to 1 but still doesn't work 
    If Not IsWorkbookOpen("es.csv") Then OpenWorkbook ("es.csv") 
    End If 
    Call copydata("es.csv", "es", "A:B", "Workbook1.xlsm", "result", "A:B") 
End Sub 

Sub OpenWorkbook(fileName As String) 
    Dim activePath As String 
    activePath = Application.ActiveWorkbook.Path 
    Application.Workbooks.Open (activePath & Application.PathSeparator & 
fileName) 
End Sub 

Private Function IsWorkbookOpen(wbName As String) As Boolean 
    Dim wb As Workbook 

    On Error GoTo Handler 
    Set wb = Workbooks(wbName) 
    If wb.Name = wbName Then 
     Set wb = Nothing 
     IsWorkbookOpen = True 
    Else 
Handler: 
     IsWorkbookOpen = False 
    End If 
End Function 
+0

Oh oui. Je ne sais pas, je dois d'abord ouvrir tous les fichiers. Quoi qu'il en soit, y at-il une fonction que je peux utiliser pour copier sans ouvrir tous les fichiers? –

+0

S'il s'agit d'un fichier csv, vous pouvez utiliser la méthode ActiveWorkbook.Queries https://msdn.microsoft.com/fr-fr/vba/excel-vba/articles/queries-add-method-excel – exSnake

+0

OK. Merci beaucoup. –