2017-10-18 23 views
0

私は、ユーザがフォルダを選択できるようにコードを書いた後、フォルダ内のすべてのファイルをループして、特定のデータ列をマスタドキュメント 'PQ Analysis spreadsheet'にコピーします。マスタファイル(VBA)にテキストファイルを読み込む?

私はより一般的にするために、このコードを改善したいと思います。

マスター文書として「PQ Analysis spreadsheet」を指定する必要がないように変更する方法はありますか?すなわち、ユーザが望むものであればそれを呼び出すことができる。

さらに、私は現在、各ファイルを新しいブックに開いてそこからコピーします。私は、txtファイルから配列に直接入力してそこから印刷する方法がなければならないと確信していますか?

何か提案がありがとうございます。これは私が書いた最初のVBAコードなので、この言語にはとても新しいです!ありがとう。

Sub tabdelim() 
Dim strFileToOpen 
Dim InputFile As Workbook 
Dim OutputFile As Workbook 

'Dialogue box to select file to open 
strFileToOpen = Application.GetOpenFilename _ 
(Title:="Please choose a file to open", _ 
FileFilter:="Text Files *.txt* (*.txt*),") 

If strFileToOpen = False Then 
    MsgBox "No file selected.", vbExclamation, "No file selected!" 
    Exit Sub 

Else 
    'Open selected file in new workbook 
    Workbooks.OpenText Filename:= _ 
    strFileToOpen, _ 
    Origin:=65001, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _ 
    xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _ 
    Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), _ 
    Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), _ 
    Array(9, 1)), TrailingMinusNumbers:=True 


End If 


Set InputFile = ActiveWorkbook 

'Now, copy what you want from InputFile: 
ActiveSheet.Range("I3:I660").Copy 


'Now, paste to OutputFile worksheet: 
Windows("PQ Analysis spreadsheet.xls").Activate 
Set OutputFile = ActiveWorkbook 
Range("C43").Select 
ActiveSheet.Paste 


'Close InputFile 
InputFile.Close 


End Sub 

example of txt document input

+0

'文字列として暗いstrWorkbookName:strWorkbookName = InputBox関数より簡単でより効率的であるパワークエリを使用して' –

+1

( "ワークブックを選択")。 – Olly

答えて

0

まず、ファイルを選択するためのランチャー、および各ファイルにインポートを開始:

Sub SelectFilesForImport() 
    Dim fd As FileDialog 
    Dim i As Long 

    'set and determine file picker behaviors 
    Set fd = Application.FileDialog(msoFileDialogFilePicker) 
    fd.AllowMultiSelect = True 

    'Launch file picker, exit if no files selected. 
    'Hold Ctrl to select multiple files. Ctrl+A to select all files 
    If Not fd.Show = -1 Then Exit Sub 

    'Start import selected files, file by file. 
    For i = 1 To fd.SelectedItems.Count 
     Call ImportFile(fd.SelectedItems(i)) 
    Next i 
End Sub 

ラインにより、第2のサブ、インポートライン(W/O Excelでファイルを開きます)

Private Sub ImportFile(ByVal FilePathAndName As String) 
    Dim DataInTransit As String 
    Dim FileName  As String 
    Dim N    As Integer 

    N = FreeFile 
    Open FilePathAndName For Input As #N 
     Do While Not EOF(N) 
      Line Input #N, DataInTransit 

      ' ################################################## 
      ' Up to this point, "DataInTransit" is a single line text. 
      ' Now it depends on how you want to massage and put it into the worksheet. 
      ' You can also skip lines which do not fit into context _ 
       by adding conditional IF statements. 
      ' Modify below to suit your needs: 
       Arr = Split(DataInTransit, ";") 
       ActiveCell.Resize(1, UBound(Arr) + 1) = Split(DataInTransit, " ") 
       ActiveCell.Offset(1).Activate 
      ' ################################################## 

     Loop 
    Close #N 
End Sub 

インポートする場所については、に直接配置する方が簡単だと思いますは上記の2番目のサブであり、新しい行の次の行にオフセットされています。しかし、多くの計算(自動計算の回りで解くことができる)があれば遅くなる可能性があります。それ以外の場合は、提案したように、arrayを使用して行を収集し、それらを一度にすべてワークシートに入れてください。どちらの方法でも、ユーザーはインポートの開始位置の左上隅を選択するだけで済みます(インポートを開始するセルを選択するようにメッセージを表示するとよいでしょう。そうしないと、それらのワークシート全体では、p/sはプロンプト内のマクロを取り消すこともできます)。これは、単に下の行を最初のサブに追加することによって行うことができます。

Dim k 
    k = Application.InputBox("Please select where to place the import.") 
    On Error GoTo Term 'If k is not a range, go to Term 
    Range(k).Activate 
    Exit Sub 

    Term: 
    End 
関連する問題