web-dev-qa-db-fra.com

Copier les données d'un autre classeur via VBA

Les gars, voici ce que je veux faire et j'ai un peu de difficulté à le faire . 

Do While THAT_DIFFERENT_FILE_SOMEWHERE_ON_MY_HDD.Cells(Rand, 1).Value <> "" And Rand < 65536
        then 'I will search if the last row in my main worksheet is in this file... 
End Loop           

Si c'est le cas, je vais quitter la boucleWhile, sinon, je vais tout copier. En fait, cela ne fonctionnera pas comme je le veux mais je n'aurai pas de difficulté à trouver le bon algorithme. 

Mon problème est que je ne sais pas comment accéder à différents classeurs.

15
Andrei Ion

Vous pourriez aimer la fonction GetInfoFromClosedFile ()


Edit: Puisque le lien ci-dessus ne semble plus fonctionner, j'ajoute lien alternatif 1 et lien alternatif 2 + code: 

Private Function GetInfoFromClosedFile(ByVal wbPath As String, _
    wbName As String, wsName As String, cellRef As String) As Variant
Dim arg As String
    GetInfoFromClosedFile = ""
    If Right(wbPath, 1) <> "" Then wbPath = wbPath & ""
    If Dir(wbPath & "" & wbName) = "" Then Exit Function
    arg = "'" & wbPath & "[" & wbName & "]" & _
        wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1)
    On Error Resume Next
    GetInfoFromClosedFile = ExecuteExcel4Macro(arg)
End Function
7
Patrick Honorez

Le meilleur (et le plus simple) moyen de copier des données d'un classeur dans un autre consiste à utiliser le modèle objet d'Excel.

Option Explicit
Sub test()
    Dim wb As Workbook, wb2 As Workbook
    Dim ws As Worksheet
    Dim vFile As Variant

    'Set source workbook
    Set wb = ActiveWorkbook
    'Open the target workbook
    vFile = Application.GetOpenFilename("Excel-files,*.xls", _
        1, "Select One File To Open", , False)
    'if the user didn't select a file, exit sub
    If TypeName(vFile) = "Boolean" Then Exit Sub
    Workbooks.Open vFile
    'Set targetworkbook
    Set wb2 = ActiveWorkbook

    'For instance, copy data from a range in the first workbook to another range in the other workbook
    wb2.Worksheets("Sheet2").Range("C3:D4").Value = wb.Worksheets("Sheet1").Range("A1:B2").Value
End Sub
14
JMax

Il y a très peu de raisons de ne pas ouvrir plusieurs classeurs dans Excel. Les lignes de code clés sont:

Application.EnableEvents = False
Application.ScreenUpdating = False

... alors vous ne verrez rien pendant que le code est exécuté et aucun code associé à l'ouverture du deuxième classeur ne sera exécuté. Alors il y a ...

Application.DisplayAlerts = False
Application.Calculation = xlManual

... afin de vous éviter de recevoir des messages contextuels associés au contenu du deuxième fichier et d'éviter tout recalcul lent. Assurez-vous de revenir à True/xlAutomatic à la fin de votre programmation

Si ouvrir le deuxième classeur ne va pas causer de problèmes de performances, vous pouvez également le faire. En fait, ouvrir le deuxième classeur le rendra très utile pour tenter de déboguer votre code si certains fichiers secondaires ne sont pas conformes au format attendu.

Voici quelques conseils d'experts sur l'utilisation de plusieurs fichiers Excel qui donnent un aperçu des différentes méthodes disponibles pour référencer des données

Une question d’extension serait de savoir comment parcourir plusieurs fichiers contenus dans le même dossier. Vous pouvez utiliser le sélecteur de dossier Windows en utilisant:

With Application.FileDialog(msoFileDialogFolderPicker)
.Show
     If .Selected.Items.Count = 1 the InputFolder = .SelectedItems(1)
End With

FName = VBA.Dir(InputFolder)

Do While FName <> ""
'''Do function here
FName = VBA.Dir()
Loop

Espérons que certains des éléments ci-dessus seront utiles

5
Ed Bolton

Cherchez-vous la syntaxe pour les ouvrir:

Dim wkbk As Workbook

Set wkbk = Workbooks.Open("C:\MyDirectory\mysheet.xlsx")

Ensuite, vous pouvez utiliser wkbk.Sheets(1).Range("3:3") (ou ce dont vous avez besoin)

4
jonsca

J'avais la même question mais l'application des solutions fournies changeait le fichier à écrire. Une fois le nouveau fichier Excel sélectionné, j'écrivais aussi dans ce fichier et non dans mon fichier d'origine. Ma solution à ce problème est la suivante:

Sub GetData()

    Dim excelapp As Application
    Dim source As Workbook
    Dim srcSH1 As Worksheet
    Dim sh As Worksheet
    Dim path As String
    Dim nmr As Long
    Dim i As Long

    nmr = 20

    Set excelapp = New Application

    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = False
        .Filters.Add "Excel Files", "*.xlsx; *.xlsm; *.xls; *.xlsb", 1
        .Show
        path = .SelectedItems.Item(1)
    End With

    Set source = excelapp.Workbooks.Open(path)
    Set srcSH1 = source.Worksheets("Sheet1")
    Set sh = Sheets("Sheet1")

    For i = 1 To nmr
        sh.Cells(i, "A").Value = srcSH1.Cells(i, "A").Value
    Next i

End Sub

Avec excelapp, une nouvelle application sera appelée. Le bloc with définit le chemin du fichier externe. Enfin, j'ai défini le classeur externe avec source et srcSH1 en tant que feuille de travail dans la feuille externe.

0
Alex_P