2016-04-15 10 views
0

Ich habe eine xlsm, die andere durchläuft alle .xslx-Dateien in einem Verzeichnis, läuft ein Sub, speichert sie. (Danke Tabias) In diesem Sub Ich versuche jetzt etwas hinzuzufügen, die die letzte Spalte aus einer dritten Datei hinzufügen würde. Mein erstes Problem hier ist, wie man die Quelldatei definiert. Wir müssen Daten aus der genauen Datei mit einem ähnlichen Namen aufnehmen. So MC.xslx ahs von MC12february.xlsx zu kopieren und KA.xlsx hat von KAwhateverdate.xlsx importierenExcel-VBA: Kopieren der letzten Spalte mit dynamischen Pfaden und Namen

Set wbA = Workbooks.Open("C:\files" & "\" & ActiveWorkbook.Name & "*.xlsx") 

leider active.workbook.name die Erweiterung enthält, so OR euch kann eine Lösung sagen Sie mir, OR Ich muss die Dateien Datum + Name zuerst speichern und es in wbA = Workbooks.Open("C:\files" & "\*" & ActiveWorkbook.Name) richtig ändern?

Das gleiche gilt für das Blatt. Diese werden je nach Datei MC, KA, KC, ... heißen. Als nächstes, da ich nur die letzte Spalte der Datei in die letzte Spalte der anderen Datei kopieren möchte, bin ich ziemlich verwirrt. I found this code und dachte, es sei am verständlichsten.

Sub import() 

Dim Range_to_Copy As Range 
Dim Range_Destination As Range 

Dim Sheet_Data As Worksheet 'sheet from where we pull the data 
Dim Sheet_Destination As Worksheet ' destination 
Dim workbook_data As Workbook 
Dim workbook_destination As Workbook 



Set workbook_data = "N:\blah\deposit" & "\*" & ActiveWorkbook.Name 
Set workbook_detination = ActiveWorkbook 
Set Sheet_Data = ThisWorkbook.Sheets("Sheet1") 'help, how do i do this? 
Set Sheet_Destination = ThisWorkbook.Sheets("Sheet1") ' and this? 

Set Range_to_Copy = sht.UsedRange.Rows(sht.UsedRange.Rows.Count).Row 

Set Range_Destination = sht.UsedRange.Rows(sht.UsedRange.Rows.Count).Row 

Range_to_Copy.Copy Range_Destination 'this copies from range A to B (basically A.copy B), but i changed variable names to make it easier... 


'you can simplify without variables like this: 
'Sheets("Sheet1").Range("D1").Copy Sheets("Summary).Range("A1")   <===== does the same as the above coding 

Keine der einfacheren Lösungen schien auch nicht geeignet.

Wie Sie sehen, bin ich völlig bei der Definition der letzten Spalte und des Namens des Blattes fest. Dieser Code ist für mich unvollständig, um dies zu überprüfen. Kann mich jemand auf den richtigen Weg bringen? Danke.

+0

Sorry, können Sie das Problem ein wenig mehr klären? Das Problem ist das Öffnen Ihrer Blätter? Wenn Sie .xlsx-Dateien in einem Verzeichnis haben, können Sie [durch ein Verzeichnis blättern] (http://stackoverflow.com/questions/10380312/loop-through-files-in-a-folder-using-vba) oder sehen [diese Seite] (http://www.thespreadsheetguru.com/the-code-vault/2014/4/23/loop-through-all-excel-files-in-a-iven-folder), die etwas Hilfe bieten sollte . Wenn Sie den Namen der Arbeitsmappe auf eine Variable setzen, können Sie auch die Erweiterung mit 'WBname = Ersetzen (wb.Name," .xls "," ") entfernen. – BruceWayne

+0

Es tut mir leid, dass ich dafür bekannt bin, sehr chaotisch zu sein. – Lara

+0

Ich bin schon durch das Verzeichnis mit Dateien mit den Namen KA.xslx, KC.xslx, MC.xslx, WT.xslx .... durchgeschleift. Also in der Schleife ist eine Datei geöffnet (duh), etwas Wörter geändert, einige Blätter gemacht und alle Blätter werden auf leere Spalten überprüft. Ich möchte einen Schritt hinzufügen, bei dem ich die letzte Spalte aus einer anderen Datei in die Datei kopiere, die jetzt aktiv ist. Die andere Datei ist für jede Datei im Verzeichnis unterschiedlich. Also muss KA.xlsx die letzte Spalte einer Datei kopieren, die KA1564.xlsx heißt, und KC.xlsx muss ti von KC68787.xlsx – Lara

Antwort

0

Als Ergänzung würde ich vorschlagen, eine simeple, wiederverwendbare Datei öffnen Funktionen zu erstellen, wo Sie einen Dateinamen als String angeben können, nach dem Sie suchen möchten. Die Funktion durchläuft ein Verzeichnis (wie Batman vorgeschlagen hat) und zieht optional die neueste Version (unter Verwendung des geänderten Datums) dieser Datei. Unten finden Sie eine Reihe von Funktionen, die ich häufig verwende. Es gibt einen Unterordnerparameter 'subF', mit dem Sie in Unterordnern relativ zum aktuellen Speicherort suchen können.

'FUNCTION opnWB 
'--Opens a workbook based on filename parameter 
'----WILDCARDS before and after the filename are used to allow for filename flexibility 
'----Subfolder is an OPTIONAL PARAMETER used if the location of the file is located in a subfolder 
Public Function opnWB(ByVal flNM As String, Optional ByVal subF As String = "") As Workbook 
    If subF <> "" Then subF = "\" & subF 

    Dim pthWB As String 
     pthWB = "\*" & flNM & "*" 'wildcard characters before and after filename 
     pthWB = filePull(subF, pthWB) 

    Set opnWB = Workbooks.Open(ActiveWorkbook.path & subF & "\" & pthWB, UpdateLinks:=0) 

End Function 
'FUNCTION filePull 
'--Cycles through folder for files that match the filename parameter (with WILDCARDS) 
'--If there is more than one file that matches the filename criteria (with WILDCARDS), 
'----the file "Date Modified" attribute is used and the most recent file is "selected" 
Private Function filePull(ByVal subF As String, ByVal path As String) As String 
    Dim lDate, temp As Date 
    Dim rtrnFl, curFile As String 

    Filename = Dir(ActiveWorkbook.path & subF & path) 
    Do While Filename <> "" 
     curFile = Filename 
     curFile = ActiveWorkbook.path & subF & "\" & Filename 

     If lDate = 0 Then 
      rtrnFl = Filename 
      lDate = GetModDate(curFile) 
     Else 
      temp = GetModDate(curFile) 
     End If 

     If temp > lDate Then 
      rtrnFl = Filename 
      lDate = temp 
     End If 

     Filename = Dir() 
    Loop 

    filePull = rtrnFl 

End Function 
'FUNCTION GetModDate 
'--Returns the date a file was last modified 
Public Function GetModDate(ByVal filePath As String) As Date 
    GetModDate = CreateObject("Scripting.FileSystemObject").GetFile(filePath).DateLastModified 
End Function 

Sie könnten diese Methode optimieren, wo die Dateinamen haben würde Datei die Zeichenfolge im starten passieren, indem Sie einfach das Wildcard-Zeichen vor flNM entfernen. Verwenden zu können, würden Sie rufen Sie einfach die opnWB Funktion, vorbei in „MC“ oder was auch immer allgemeine Dateinamen Sie möchten, dass öffnen:

Dim wbTarMC as Workbook 
Set wbMC = opnWB("MC", "Source Files") 'this would open up MC.xlsx file within the subfolder "Source Files" (relative to current file location) 

Hoffnung, das hilft.

+0

Danke, aber ich verstehe nicht, wie das verwendet werden kann. Ich blättere bereits durch alle Dateien, die nacheinander geöffnet werden. Würde dies meinen Looping-Code ersetzen (nicht in dieser Frage gesehen). – Lara

+0

Ich durchlaufe bereits alle Dateien, öffne sie, verwende einige Subs, speichere sie, öffne die nächste Datei im Verzeichnis usw.Dieser Code erlaubt es mir, eine bestimmte Datei zu öffnen? Ich verstehe nicht, wie das einen Vorteil hat gegenüber "Workbooks.Open (ThisWorkbook.Path &" \ MC.xlsx ")' Das ist an sich nicht etwas, das ich verwenden könnte, da ich alle Dateien öffnen muss. Empfehlen Sie das explizite Öffnen jeder Datei im Verzeichnis? – Lara