2013-01-31 19 views
8

Mam skoroszyt Excel z programem Excel, który zawiera kilka nazwanych arkuszy. Jeden z arkuszy roboczych nosi nazwę "panel", a drugi arkusz roboczy nosi nazwę "dane". Arkusz o nazwie "panel" ma przycisk, do którego przypisane jest makro. Chciałbym wybrać przycisk na arkuszu roboczym o nazwie "panel" i wyświetlić okno przeglądania pliku. Gdy użytkownik wybierze plik csv na swoim dysku twardym, chciałbym, aby zawartość pliku csv została zaimportowana do arkusza roboczego o nazwie "data", zaczynającego się w komórce A1.makro, aby zaimportować plik CSV do arkusza nieaktywnego programu Excel

PROBLEM 1: Przycisk vba przypisany do przycisku powoduje umieszczenie zawartości pliku csv w tym samym arkuszu roboczym, co przycisk (arkusz "panel"). Chciałbym, aby zawartość pliku csv została umieszczona na arkuszu "danych".

PROBLEM 2: Istnieje również ciąg kodu odnoszącego się do mojego dysku twardego i pliku o nazwie "capture.csv". Tak więc, gdy plik Excela z włączoną obsługą makr znajduje się na innym komputerze, plik ulega awarii. Jakikolwiek sposób na usunięcie ciągu ścieżek, aby dowolny komputer mógł go użyć?

Każda pomoc w rozwiązaniu tego problemu byłaby bardzo doceniana. Makro przypisane do przycisku:

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 

Odpowiedz

12

Czy to właśnie próbujesz?

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

Dokładnie to, co miałem zamiar powiedzieć. To powinno zadziałać – Rick

+0

Dziękuję za poświęcenie czasu, aby mi pomóc. Przypisałem przyciskowi kod, który napisałeś. Po załadowaniu pliku csv zostanie wyświetlone okno komunikatu: "Błąd wykonania" -2147024809 (80070057) Zakres docelowy nie znajduje się w tym samym arkuszu roboczym, na którym jest tworzona tabela zapytań. " – George

+1

Zmień "Destination: = Range (" $ A $ 1 "))' na 'Miejsce docelowe: = ThisWorkbook.Sheets (" Data ") Zakres (" $ A $ 1 "))' –

0

Dla Excel na Mac, wydaje się, że obiekt QueryTable nie obsługuje właściwości „PreserveFormatting” i „RefreshPeriod” i daje błąd wykonania jeśli spróbujesz i ustawić je.

Aplikacja Application.FileDialog nie działa również na komputerze Mac, ale jest objęta innymi postami.

Dla 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 
Powiązane problemy