2016-04-25 12 views
0

Dies könnte einfach für Sie sein, aber ich bin neu bei VBA.Hinzufügen/Aktualisieren Liste mit Excel VBA

Ich habe eine Excel-Datei, die viele Spalten hat, von denen eine "id" ist, was ein Schlüsselwert ist. Ich habe einen Code geschrieben, um eine Auswahl für die Datei zu öffnen.

Sub GetFile() 
Dim fNameAndPath As Variant 
fNameAndPath = Application.GetOpenFilename(FileFilter:="Excel Files (*.XLSM), *.XLSM", Title:="Select File To Be Opened") 
    If fNameAndPath = False Then 
    Exit Sub 
Workbooks.Open Filename:=fNameAndPath 
End Sub 

Ich möchte Makro in dieser Liste haben, die die anderen Dateien hinzufügen soll (die mit unterschiedlichen Werten und unsicher Menge der Zeilen derselben Spalte Namen haben). Und wenn die Spalte "id" in der hinzugefügten Datei denselben Wert hat, sollte die alte Zeile vollständig gelöscht werden.

Hat jemand einen Vorschlag?

Option Explicit 

Dim myWorkbooks As New Collection 

Sub GetFile() 
    Dim fNameAndPath As Variant, i As Long, x As Variant 
    fNameAndPath = Application.GetOpenFilename("All Files (*.*), *.*", , "Select Files To Be Opened", , True) 

    If Not IsArray(fNameAndPath) Then 
    If fNameAndPath = False Then Exit Sub Else fNameAndPath = Array(fNameAndPath) 
    End If 

    For i = LBound(fNameAndPath) To UBound(fNameAndPath) 
    Set x = Workbooks.Open(fNameAndPath(i)) 
    myWorkbooks.Add x 
    Next 
End Sub 

Auf diese Weise können Sie mehrere Dateien öffnen und auch speichert sie (ein Zeiger auf sie):

+0

Ja genau das. Ich möchte in der Lage sein, eine beliebige Dateimenge auszuwählen, während ich dies tue. Und wenn "ID" Spaltenwerte bereits gleich sind, wird der alte in der Liste gelöscht. –

+0

Ich weiß, wie man eine Dateiauswahl öffnet, aber ich weiß nicht, wie ich die anderen Dateiwerte der Liste hinzufügen werde, wenn sie variabel sind (ein Teil der Datei hat 10 Werte, manche 100 usw.), wenn sie nicht variabel sind könnte es mit Rekordmakro tun. Außerdem kenne ich den Algorithmus nicht, der prüft, ob zwei Werte gleich sind und den alten löscht. –

+0

ich habe es bearbeitet und ich bekomme keine Antwort –

Antwort

0

Um Ihre erste Problem schlage ich so etwas wie dieses zu lösen.
Sie können sie später wie folgt zugreifen:

Sub ChkID(ID As String) 
    Dim x As Variant 
    For Each x In myWorkbooks 

    If IsNumeric(Application.Match(ID, x.Sheets(1).Columns(1), 0)) Then 
     x.Sheets(1).Rows(Application.Match(ID, x.Sheets(1).Columns(1), 0)).Delete xlUp 
     x.Save 

    End If 
    Next 
End Sub 

Dies würde in jeder Arbeitsmappe Spalte A des ersten Blattes prüfen, ob es die ID enthält und wenn ja, die Zeile zu löschen.

Wenn Sie mit allem fertig sind, können Sie schließen/speichern Sie alle WBs über:

Sub ClsFile() 
    While myWorkbooks.Count 
    myWorkbooks(1).Close True 
    myWorkbooks.Remove 1 
    Wend 
End Sub 

Der einzige Nachteil ist, dass, wenn VBA gestoppt werden muss, dann wird die Sammlung wieder leer sein (Sie müssten sie manuell und öffnen sie wieder über die Unter schließen.


das alles müssen Sie enthalten sollten Ihren eigenen Code, wie Sie es brauchen bauen. Aber wenn Sie noch Fragen haben, fragen Sie einfach :)

+0

vielen dank, ich werde es jetzt versuchen! Ich habe noch eine Frage. Wie finde ich den Code, der die Werte anderer Dateien zur nächsten leeren Zeile hinzufügt? –

+0

Suchen Sie einfach nach "erste Zeile finden" oder "letzte Zeile verwenden" oder so ähnlich ... google zeigt Millionen von Möglichkeiten (ok ... nur die Links zu ihnen): P –

+0

vielen Dank :) i werde prüfen –