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