2017-08-14 7 views
0

Ich arbeite bei einer Bank und wir erhalten regelmäßig vierteljährliche Daten von Nasdaq Smart über Marktmissbrauch. Mir wurde die Aufgabe zugewiesen, ein Makro zu erstellen, das diese Daten zusammenfasst, um Marktmissbrauch über längere Zeiträume hinweg sichtbar zu machen.Eingabedaten von einer ausgewählten Datei mit VBA

Bisher kann ich manuell auswählen welche Arbeitsmappe ich interessiere und dann wird automatisch der Teil der Arbeitsmappe ausgewählt, den ich importieren möchte.

Das Problem, das ich habe, ist, dass es die ausgewählten Daten nicht in die neue Datei eingibt. Wenn ich dem Compiler vertrauen kann, dann ist das Problem, dass die Bereichsfunktion in diesem Fall nicht unterstützt wird.

Private Sub CommandButton23_Click()

Dim wkbCrntWorkBook As Workbook 
Dim wkbSourceBook As Workbook 
Dim rngSourceRange As Range 
Dim rngDestination As Range 
Dim bottomCell As Range 
Dim rngTemp As Range 
Set wkbCrntWorkBook = ActiveWorkbook 
With Application.FileDialog(msoFileDialogOpen) 
    .Filters.Clear 
    .Filters.Add "Excel 97-2003", "*.xlsx; *.xlsm; *.xlsa , *.xls" 
    .AllowMultiSelect = False 
    .Show 
    If .SelectedItems.Count > 0 Then 
     Workbooks.Open .SelectedItems(1) 
     Set wkbSourceBook = ActiveWorkbook 
     Set bottomCell = wkbSourceBook.Sheets("par_ACCOUNT").Cells.Find(what:="Account by Type") 
     Set rngTemp = wkbSourceBook.Sheets("par_ACCOUNT").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious) 
      If Not rngTemp Is Nothing Then 
       wkbSourceBook.Sheets("par_ACCOUNT").Range(bottomCell, rngTemp.Offset(0, 65)).Select 
      End If 
     wkbCrntWorkBook.Activate 
     Set rngDestination = wkbCrntWorkBook.Range("A1") 
     Selection.Copy rngDestination 
     rngDestination.CurrentRegion.EntireColumn.AutoFit 
     wkbSourceBook.Close False 
    End If 
End With 

End Sub

Vielen Dank allen im Voraus für Ihre Hilfe. Dies ist das erste Mal, dass ich mit VBA und Stackoverflow arbeite, daher ist jede Art von Hilfe willkommen.

+1

'Set rngDestination = wkbCrntWorkBook.Range ("A1")' - Sie kein Blatt angeben. – SJR

+1

Sie sollten auf keinen Fall '.Select' verwenden. Es ist auch besser, 'ThisWorkbook' anstelle von' ActiveWorkbook' zu verwenden. Nach Ihrer Auswahl wechseln Sie die WBs, was wahrscheinlich zu einem Fehler beim Kopieren führt. – UGP

+0

@UGB vielen Dank für die Hilfe. Warum sollte ich in Zukunft keine Auswahl verwenden? – ShieldData

Antwort

1

Ich denke, das Problem kann durch Auswählen eines Bereichs vor dem Aktivieren einer anderen Arbeitsmappe verursacht werden, was die Auswahl fehlschlägt.

 If Not rngTemp Is Nothing Then 
      wkbSourceBook.Sheets("par_ACCOUNT").Range(bottomCell, rngTemp.Offset(0, 65)).Select 
     End If 
    wkbCrntWorkBook.Activate 
    Set rngDestination = wkbCrntWorkBook.Range("A1") 
    Selection.Copy rngDestination 

Ich möchte vermeiden, select ganz mit, was erreicht werden kann, eine einfache Reihe Gegenstand (das wurde bereits erklärt).

 If Not rngTemp Is Nothing Then 
      set rngSourceRange = wkbSourceBook.Sheets("par_ACCOUNT").Range(bottomCell, rngTemp.Offset(0, 65)) 
     End If 
    Set rngDestination = wkbCrntWorkBook.sheets(???).Range("A1") 
    rngSource.Copy rngDestination 
+0

Vielen Dank für die schnelle Antwort. Ich bekomme immer noch die Fehlermeldung "Laufzeitfehler '438' Objekt unterstützt diese Methode oder Eigenschaft 'leider nicht. Ich frage mich, ob es eine klügere Möglichkeit gibt, den Workflow zu organisieren, um vielleicht den Fehler aufzudecken. Ich bin überrascht, dass es noch solche gibt ein großes Problem, nachdem der Bereich richtig ausgewählt wurde und nur kopiert werden muss – ShieldData

+0

@FelixSchildorfer haben Sie ein Blatt bei der Zeile 'Set rngDestination = wkbCrntWorkBook.sheets (???). Bereich (" A1 ")'? – Slaqr

+0

Ja, das hat den Trick gemacht. Vielen Dank! – ShieldData

0

Hier ist der Arbeitscode für jeden, der an einem ähnlichen Projekt arbeitet.

Private Sub CommandButton23_Click()

Dim wkbCrntWorkBook As Workbook 
Dim wkbSourceBook As Workbook 
Dim rngSourceRange As Range 
Dim rngDestination As Range 
Dim bottomCell As Range 
Dim rngTemp As Range 
Set wkbCrntWorkBook = ActiveWorkbook 
With Application.FileDialog(msoFileDialogOpen) 
    .Filters.Clear 
    .Filters.Add "Excel 97-2003", "*.xlsx; *.xlsm; *.xlsa , *.xls" 
    .AllowMultiSelect = False 
    .Show 
    If .SelectedItems.Count > 0 Then 
     Workbooks.Open .SelectedItems(1) 
     Set wkbSourceBook = ActiveWorkbook 
     Set bottomCell = wkbSourceBook.Sheets("par_ACCOUNT").Cells.Find(what:="Account by Type") 
     Set rngTemp = wkbSourceBook.Sheets("par_ACCOUNT").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious) 
      If Not rngTemp Is Nothing Then 
       Set rngSourceRange = wkbSourceBook.Sheets("par_ACCOUNT").Range(bottomCell, rngTemp.Offset(0, 65)) 
      End If 
     Set rngDestination = wkbCrntWorkBook.Sheets("Tabelle1").Range("A1") 
     rngSourceRange.Copy rngDestination 
     rngDestination.CurrentRegion.EntireColumn.AutoFit 
     wkbSourceBook.Close False 
    End If 
End With 

End Sub

Verwandte Themen