2017-02-21 23 views
0

Я знаю, что этот пост будет казаться очень похожим на многие другие сообщения тем, кто его понимает. Я изучил C++ и C#, как достаточно хорошо, чтобы выполнить небольшую работу, и я просто не могу понять VBA достаточно хорошо, чтобы этот макрос произошел.Импорт данных из текстового файла в главный файл (изменение целевых каталогов) - Excel

У меня осталось менее 100 файлов, которые необходимо импортировать в главный файл. Я не могу изменить исходные файлы, но мастер-файл должен выбрать только столбцы.

Этот макрос работает почти идеально. Мне просто нужно выбрать новые пути к файлам для каждого экземпляра используемого макроса. Я нашел много постов, которые, кажется, использовать что-то вроде этого:

https://social.msdn.microsoft.com/Forums/office/en-US/231cbfc5-95ad-4673-a20c-f87355c6bc5e/prompt-user-for-file-name-to-import-as-fixed-width-text-file?forum=exceldev

для того, чтобы сделать первый FilePath в переменную, а затем передать его в команду ActiveSheet.QueryTables.Add. Я мог бы просто что-то упустить, но между всеми примерами, которые я просто не понимаю, есть много переменных. Похоже, что страница msdn для vba намного менее интуитивна, чем для C#. Либо это, либо я просто не могу понять, что они не взяли необходимые мне babystep.

Использование макроса я сделал большую часть кода ниже. Около часа работы позволило мне заменить жестко закодированную ячейку активной ячейкой.

Sub InputDataFromTextFile() 
' 
' InputDataFromTextFile Macro 
' 
' Keyboard Shortcut: Ctrl+t 
' 
    With ActiveSheet.QueryTables.Add(Connection:= _ 
     "TEXT;E:\Dropbox\College 2016-2017\Research\Buffered Solutions\pH10\With PDADMAC\30.CSV" _ 
     , Destination:=ActiveCell) 
     .Name = "30" 
     .FieldNames = True 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .RefreshStyle = xlInsertDeleteCells 
     .SavePassword = False 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 0 
     .TextFilePromptOnRefresh = False 
     .TextFilePlatform = 1252 
     .TextFileStartRow = 1 
     .TextFileParseType = xlDelimited 
     .TextFileTextQualifier = xlTextQualifierDoubleQuote 
     .TextFileConsecutiveDelimiter = False 
     .TextFileTabDelimiter = True 
     .TextFileSemicolonDelimiter = False 
     .TextFileCommaDelimiter = True 
     .TextFileSpaceDelimiter = False 
     .TextFileColumnDataTypes = Array(9, 1, 9) 
     .TextFileTrailingMinusNumbers = True 
     .Refresh BackgroundQuery:=False 
    End With 
End Sub 

Я буду признателен за любую помощь, которая может быть предоставлена. Большое вам спасибо за ваше время.

+0

Пример, который вы цитируете, кажется довольно простым. Если вы этого не сделали, вы также должны прочитать статью MSDN в [Метод Application.GetOpenFilename] (https://msdn.microsoft.com/en-us/library/office/ff834966.aspx). Напишите его как отдельный макрос и поиграйте с ним, чтобы увидеть, как он работает. Какую конкретную проблему вы сталкиваетесь с этим. –

+0

Код, на который ссылаются шины, чтобы выбрать открытый стол, когда я его использую. Мне это действительно не нужно, так как мой код, написанный макромакером, просто открывает файл цели. Мне просто нужно сделать так, чтобы цель была выбрана пользователем, а не жестко запрограммирована. Проблема, с которой я сталкиваюсь, заключается в том, что переменная, которую он использует для перенаправления цели на выбранную «FileName», записывается во множество разделов кода, которые я не могу определить, как просто выйти из того, что мне нужно. Я пробовал уже около часа и большую часть прошлой ночи. – hotmaildotcom1

+0

Решен ли этот вопрос? Заметьте: вы можете ответить на свой вопрос. Кроме того, действительно ли вы хотите, чтобы диалоговое окно выбора файлов для каждого из менее чем 100 файлов? Рассмотрим цикл с помощью каталога, в котором пользователь выбирает палитру только один раз. – Parfait

ответ

0

Итак, сразу после публикации, я не понял это в комментариях, я что-то пробовал и получил его на работу. Вот код в его нынешнем виде.

Sub InputDataFromTextFile()

Dim Filt As String 
    Dim FilterIndex As Integer 
    Dim Title As String 
    Dim FileName As Variant 

' Set up list of file filters 
    Filt = "All Files (*.*),*.*" 

' Display Text Files by default 
    FilterIndex = 1 

' Set the dialog box caption 
    Title = "Select a File to Import" 

' Get the file name 
    FileName = Application.GetOpenFilename _ 
     (FileFilter:=Filt, _ 
     FilterIndex:=FilterIndex, _ 
     Title:=Title) 

' Exit if dialog box is canceled 
    If FileName = False Then 
     MsgBox "No file was selected." 
     Exit Sub 
    End If 

' 
' InputDataFromTextFile Macro 
' 
' Keyboard Shortcut: Ctrl+t 
' 
    With ActiveSheet.QueryTables.Add(Connection:= _ 
     "TEXT;" & FileName, _ 
     Destination:=ActiveCell) 
     .Name = "30" 
     .FieldNames = True 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .RefreshStyle = xlInsertDeleteCells 
     .SavePassword = False 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 0 
     .TextFilePromptOnRefresh = False 
     .TextFilePlatform = 1252 
     .TextFileStartRow = 1 
     .TextFileParseType = xlDelimited 
     .TextFileTextQualifier = xlTextQualifierDoubleQuote 
     .TextFileConsecutiveDelimiter = False 
     .TextFileTabDelimiter = True 
     .TextFileSemicolonDelimiter = False 
     .TextFileCommaDelimiter = True 
     .TextFileSpaceDelimiter = False 
     .TextFileColumnDataTypes = Array(9, 1, 9) 
     .TextFileTrailingMinusNumbers = True 
     .Refresh BackgroundQuery:=False 
    End With 
End Sub 

Один из моих самых больших проблем, честно, что когда-то первенствует был перезапущен в Ctrl +T, что я hotkeyed в команду вернулся, чтобы сделать таблицу. Я не мог понять, откуда это происходит! Спасибо за помощь. Это экономит мне много времени.

В то время как комментарий, сделанный Parfait о перемещении по файлам и их автоматическом ввозе, является следующим шагом и очень явно желаемой чертой в коде, для меня это сейчас очень похоже. Я уже экономлю более часа за мастерскую, что просто потрясающе. Еще раз спасибо вам.