2017-10-18 8 views
0

J'ai écrit un code qui permet à l'utilisateur de sélectionner un dossier, puis il parcourt tous les fichiers du dossier, en copiant une colonne de données spécifique dans ma feuille de calcul 'PQ Analysis'.Importation de fichiers texte dans un document maître Excel (VBA)?

Je voudrais améliorer ce code, pour le rendre plus générique.

Y a-t-il un moyen de le modifier, donc je n'ai pas besoin de spécifier 'PQ Analysissheet' comme document maître? C'est-à-dire qu'il peut être appelé tout ce que l'utilisateur souhaite.

En outre, j'ouvre actuellement chaque fichier dans un nouveau classeur, et copie à partir de là. Je suis sûr qu'il doit y avoir un moyen de saisir directement à partir du fichier txt dans un tableau, et imprimer à partir de là?

Toutes les suggestions seraient appréciées. C'est le premier code VBA que j'ai écrit, donc je suis très nouveau dans cette langue! Merci.

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

'Dim strWorkbookName As String: strWorkbookName = InputBox ("Sélectionnez un classeur")' –

+1

Utilisation de l'alimentation de requêtes serait plus simple et plus efficace. – Olly

Répondre

0

D'abord, un lanceur pour sélectionner les fichiers et commencer à importer sur chaque fichier:

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 

sous En second lieu, la ligne d'importation en ligne (w/o ouvrir le fichier dans 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 

pour savoir où placer l'importation, je pense que ce plus simple de placer directement dans ActiveCell comme indiqué est deuxième sous ci-dessus, puis décalé à la ligne suivante pour les nouvelles lignes. Mais il pourrait être lent si vous avez beaucoup de calculs (pourrait être résoudre au tour du calcul automatique). Sinon, comme vous l'avez suggéré, utilisez array pour collecter les lignes, puis placez-les en une seule fois dans la feuille de calcul. Dans tous les cas, l'utilisateur n'a qu'à sélectionner le coin supérieur gauche de la plage où commencer l'importation (il serait intéressant d'inviter un message pour lui demander de sélectionner la cellule où commencer l'importation, sinon il pourrait gâcher leur feuille de calcul entière, p/s leur permettent également d'annuler la macro dans l'invite pour juste au cas où). Cela peut être fait en ajoutant simplement les lignes ci-dessous dans le premier sous.

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