Как мне предложить пользователю выбрать файл и лист при использовании макроса для импорта файла данных? - PullRequest
0 голосов
/ 09 апреля 2011

У меня есть макрос, который в настоящее время создает новый лист и импортирует другой файл Excel в этот новый лист. Затем данные из этого листа переносятся в другие области рабочей книги.

Импортируемый файл имеет несколько вкладок и постоянно будет иметь другое имя. Как настроить приведенный ниже код, чтобы пользователь мог выбрать файл И соответствующую вкладку? (Каталог не изменится.)

Я пытался использовать объект FileDialog, но не похоже, что Excel выполняет какие-либо действия с выбранным файлом. И это не позволяет вам выбирать вкладку / лист для импорта.

Sheets.Add  
Sheets(2).Select  
Sheets(2).Name = "ImportedDemand"  
Range("E42").Select  
With ActiveSheet.QueryTables.Add(Connection:=Array( _  
"OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Password=""""; _
User ID=Admin; _
Data Source=\\Folder\ImportFile_2011.04.05.xls; _
Mode=Share Deny Write;Extended Properties=""HDR=YES;""; _
Jet OLEDB:System database="""";Jet OLEDB:Registry Path=""""; _
Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=35; _
Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2; _
Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=""""; _
Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False; _
Jet OLEDB:Don't Copy Locale on Compact=False; _
Jet OLEDB:Compact Without Replica Repair=False; _
Jet OLEDB:SFP=False"), Destination:=Range("A1"))

.CommandType = xlCmdTable
.CommandText = Array("_All_Demand$")
.Name = "ImportFile_2011.04.05"
'Other Settings
.SourceDataFile = _
"\\Folder\ImportFile_2011.04.05.xls"
.Refresh BackgroundQuery:=False
End With

Ответы [ 2 ]

2 голосов
/ 09 апреля 2011

Вот способ вернуть имя выбранного пользователем листа:

    varCellContent = Application.InputBox _
        (prompt:="Choose a sheet by clicking on any cell in it.", Type:=8)

    strDestinationSheetName = ActiveSheet.Name

Как вернуть путь к выбранному пользователем файлу, уже объяснялось в ответах на предыдущий вопрос . С объектом FileDialog или, если он вам не нравится, с GetOpenFilename:

strPathOfFileToOpen = _
    Application.GetOpenFilename("Excel workbooks (*.xls), *.xls")

Теперь FileDialog или GetOpenFilename вернет путь к открываемому файлу, например, "\\Folder\ImportFile_2011.04.05.xls", но они не фактически откроют файл. Вы должны использовать возвращаемый путь соответствующим образом. Из вашего вопроса не ясно, что это такое, но я бы догадался:

.SourceDataFile = strPathOfFileToOpen 

и / или * * тысячу двадцать-один

Data Source=strPathOfFileToOpen ; _

Я не совсем уверен, почему у вас нет кавычек вокруг последнего в вашем вопросе.

Та же логика с именем листа: я указал, как его вернуть, но без подробностей не могу сказать, как его использовать.

1 голос
/ 09 апреля 2011

С Excel 2002 VBA: Справочник программиста :

dim fd as filedialog
dim ffs as filedialogfilters
dim stFileName as string
dim wkb as workbook

set fd=application.filedialog(msofiledialogopen)
with fd
  set ffs=.filters
  with ffs
    .clear
    .add "Excel", "*.xls" 'Or whatever version you are using.
  end with
  .allowmultiselect=false
  if .show=false then exit sub
  set wkb=getobject(.selecteditems(1))
end with

Здесь вы можете просто использовать поле ввода, чтобы пользователь записал имя вкладки, или вы можете запустить диалоговое окно filedial от пользовательской формы (лучший вариант).

Предполагая, что вы используете пользовательскую форму, вы можете загрузить имена вкладок в выпадающий список и предложить пользователю выбрать, какая вкладка будет. Тогда делай свой код.

Другой альтернативой является загрузка вкладок в основную рабочую книгу, и пользователь выбирает ее там.

...