2013-01-31 6 views
8

Ich habe eine Makro-fähige Excel-Arbeitsmappe, die mehrere benannte Arbeitsblätter enthält. Eines der Arbeitsblätter heißt "Panel" und ein zweites Arbeitsblatt heißt "Data". Das Blatt mit der Bezeichnung "Panel" hat eine Schaltfläche, der ein Makro zugewiesen ist. Ich möchte die Schaltfläche auf dem Arbeitsblatt mit dem Namen "Panel" auswählen und ein Fenster zum Suchen nach Dateien anzeigen lassen. Sobald der Benutzer die CSV-Datei auf ihrer Festplatte auswählt, möchte ich, dass der Inhalt der CSV-Datei in das Arbeitsblatt "Daten" beginnend in Zelle A1 importiert wird.Makro zum Importieren von CSV-Datei in ein Excel nicht aktives Arbeitsblatt

PROBLEM 1: Die VBA, die ich der Schaltfläche zugewiesen habe, bewirkt, dass der Inhalt der CSV-Datei auf demselben Arbeitsblatt wie die Schaltfläche (das Arbeitsblatt "Arbeitsfläche") platziert wird. Ich möchte, dass der Inhalt der CSV-Datei auf dem "Daten" -Blatt platziert wird.

PROBLEM 2: Außerdem gibt es eine Reihe von Code, der auf meine Festplatte und eine Datei namens "capture.csv" verweist. Also, wenn Makro aktiviert Excel-Datei auf einem anderen Computer ist, stürzt die Datei ab. Gibt es eine Möglichkeit, die Pfadzeichenfolge zu entfernen, sodass jeder Computer die Datei verwenden kann?

Jede Hilfe zur Behebung dieses Problems wird sehr geschätzt. Das der Schaltfläche zugewiesene Makro lautet wie folgt:

Sub load_csv() 
Dim fStr As String 
With Application.FileDialog(msoFileDialogFilePicker) 
.Show 
If .SelectedItems.Count = 0 Then 
MsgBox "Cancel Selected" 
End 
End If 
'fStr is the file path and name of the file you selected. 
fStr = .SelectedItems(1) 
End With 
Range("A1").Select 
With ActiveSheet.QueryTables.Add(Connection:= _ 
"TEXT;C:\Users\laptop\Desktop\CAPTURE.csv", Destination:=Range("$A$1")) 
.Name = "CAPTURE" 
.FieldNames = True 
.RowNumbers = False 
.FillAdjacentFormulas = False 
.PreserveFormatting = True 
.RefreshOnFileOpen = False 
.RefreshStyle = xlInsertDeleteCells 
.SavePassword = False 
.SaveData = True 
.AdjustColumnWidth = True 
.RefreshPeriod = 0 
.TextFilePromptOnRefresh = False 
.TextFilePlatform = 437 
.TextFileStartRow = 1 
.TextFileParseType = xlDelimited 
.TextFileTextQualifier = xlTextQualifierDoubleQuote 
.TextFileConsecutiveDelimiter = False 
.TextFileTabDelimiter = True 
.TextFileSemicolonDelimiter = False 
.TextFileCommaDelimiter = True 
.TextFileSpaceDelimiter = False 
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
.TextFileTrailingMinusNumbers = True 
.Refresh BackgroundQuery:=False 
MsgBox fStr 
End With 
End Sub 

Antwort

12

Ist dies das, was Sie versuchen?

Sub load_csv() 
    Dim fStr As String 

    With Application.FileDialog(msoFileDialogFilePicker) 
     .Show 
     If .SelectedItems.Count = 0 Then 
      MsgBox "Cancel Selected" 
      Exit Sub 
     End If 
     'fStr is the file path and name of the file you selected. 
     fStr = .SelectedItems(1) 
    End With 

    With ThisWorkbook.Sheets("Data").QueryTables.Add(Connection:= _ 
    "TEXT;" & fStr, Destination:=Range("$A$1")) 
     .Name = "CAPTURE" 
     .FieldNames = True 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .RefreshStyle = xlInsertDeleteCells 
     .SavePassword = False 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 0 
     .TextFilePromptOnRefresh = False 
     .TextFilePlatform = 437 
     .TextFileStartRow = 1 
     .TextFileParseType = xlDelimited 
     .TextFileTextQualifier = xlTextQualifierDoubleQuote 
     .TextFileConsecutiveDelimiter = False 
     .TextFileTabDelimiter = True 
     .TextFileSemicolonDelimiter = False 
     .TextFileCommaDelimiter = True 
     .TextFileSpaceDelimiter = False 
     .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
     .TextFileTrailingMinusNumbers = True 
     .Refresh BackgroundQuery:=False 

    End With 
End Sub 
+0

Genau das, was ich sagen wollte. Das sollte funktionieren – Rick

+0

Danke, dass Sie sich die Zeit genommen haben, mir zu helfen. Ich habe der Taste den Code zugewiesen, den du geschrieben hast. Wenn ich die CSV-Datei lade, erscheint ein Meldungsfenster: "Laufzeitfehler '-2147024809 (80070057) Der Zielbereich befindet sich nicht auf demselben Arbeitsblatt, auf dem die Abfragetabelle erstellt wird." – George

+1

Change 'Destination: = Bereich (" $ A $ 1 "))' to 'Ziel: = ThisWorkbook.Sheets (" Data "). Range (" $ A $ 1 "))' –

0

Für Excel auf dem Mac, so scheint es, die Abfragetabelle Objekt nicht die Eigenschaften „PreserveFormatting“ unterstützt und „RefreshPeriod“ und Sie einen Laufzeitfehler geben, wenn Sie versuchen, und sie setzen.

Auch Application.FileDialog funktioniert nicht mit Mac, aber das ist in anderen Posts abgedeckt.

Für Mac:

Sub load_csv() 
Dim fStr As String 

fStr = "Macintosh HD:Users:anthony:Documents:example.csv" 'Keeping file String simple for example. 

With ThisWorkbook.Sheets("Data").QueryTables.Add(Connection:= _ 
"TEXT;" & fStr, Destination:=Range("$A$1")) 
    .Name = "CAPTURE" 
    .FieldNames = True 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    '.PreserveFormatting = True **commented out for Mac 
    .RefreshOnFileOpen = False 
    .RefreshStyle = xlInsertDeleteCells 
    .SavePassword = False 
    .SaveData = True 
    .AdjustColumnWidth = True 
    '.RefreshPeriod = 0 **commented out for Mac 
    .TextFilePromptOnRefresh = False 
    .TextFilePlatform = 437 
    .TextFileStartRow = 1 
    .TextFileParseType = xlDelimited 
    .TextFileTextQualifier = xlTextQualifierDoubleQuote 
    .TextFileConsecutiveDelimiter = False 
    .TextFileTabDelimiter = True 
    .TextFileSemicolonDelimiter = False 
    .TextFileCommaDelimiter = True 
    .TextFileSpaceDelimiter = False 
    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
    .TextFileTrailingMinusNumbers = True 
    .Refresh BackgroundQuery:=False 

End With 
End Sub 
Verwandte Themen