web-dev-qa-db-fra.com

vba: Importation d'un fichier texte dans une feuille Excel

J'écris un code vba qui censé supprimer les données d'une feuille Excel sélectionnée, ouvrir une boîte de dialogue pour la sélection de fichiers texte, puis importer les données de ce fichier texte dans la même feuille exacte dont j'ai supprimé les données. Jusqu'à présent, je ne peux ouvrir le fichier texte que dans un nouveau classeur, mais je ne peux pas l'ouvrir sur la même feuille dont j'ai supprimé les données. Voici ce que je suis venu jusqu'à présent, j'apprécierai votre aide:

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

Filt = "Cst Files (*.prn),*.prn"
Title = "Select a cst File to Import"
FileName = Application.GetOpenFilename(FileFilter:=Filt, Title:=Title)

If FileName = False Then
MsgBox "No File Was Selected"
Exit Sub
End If

With Application.ActiveSheet
    Cells.Select
Selection.QueryTable.Delete
Selection.ClearContents
End With

Workbooks.Open FileName

Merci!

16
Elad Sommer

Il existe de nombreuses façons d'importer un fichier texte dans la feuille actuelle. En voici trois (y compris la méthode que vous utilisez ci-dessus)

  1. Utilisation d'un QueryTable
  2. Ouvrez le fichier texte en mémoire, puis écrivez sur la feuille en cours et appliquez enfin Text To Columns si nécessaire.
  3. Si vous souhaitez utiliser la méthode que vous utilisez actuellement, après avoir ouvert le fichier texte dans un nouveau classeur, copiez-le simplement sur la feuille actuelle à l'aide de Cells.Copy

en utilisant un QueryTable

Voici une macro simple que j'ai enregistrée. Veuillez le modifier en fonction de vos besoins.

Sub Sample()
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\Sample.txt", Destination:=Range("$A$1") _
        )
        .Name = "Sample"
        .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)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub

Ouvrez le fichier texte en mémoire

Sub Sample()
    Dim MyData As String, strData() As String

    Open "C:\Sample.txt" For Binary As #1
    MyData = Space$(LOF(1))
    Get #1, , MyData
    Close #1
    strData() = Split(MyData, vbCrLf)
End Sub

Une fois que vous avez les données dans le tableau, vous pouvez les exporter vers la feuille actuelle.

en utilisant la méthode que vous utilisez déjà

Sub Sample()
    Dim wbI As Workbook, wbO As Workbook
    Dim wsI As Worksheet

    Set wbI = ThisWorkbook
    Set wsI = wbI.Sheets("Sheet1") '<~~ Sheet where you want to import

    Set wbO = Workbooks.Open("C:\Sample.txt")

    wbO.Sheets(1).Cells.Copy wsI.Cells

    wbO.Close SaveChanges:=False
End Sub

SUIVI

Vous pouvez utiliser le Application.GetOpenFilename pour choisir le fichier correspondant. Par exemple...

Sub Sample()
    Dim Ret

    Ret = Application.GetOpenFilename("Prn Files (*.prn), *.prn")

    If Ret <> False Then
        With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & Ret, Destination:=Range("$A$1"))

            '~~> Rest of the code

        End With
    End If
End Sub
43
Siddharth Rout

vous pouvez écrire .WorkbookConnection.Delete après .Refresh BackgroundQuery: = False cela supprimera la connexion externe du fichier texte.

2
sandeep patel

Je pense ma réponse à ma propre question voici la solution la plus simple à ce que vous essayez de faire:

  1. Sélectionnez la cellule où doit se trouver la première ligne de texte du fichier.

  2. Utilisez le Data/Get External Data/From File boîte de dialogue pour sélectionner le fichier texte à importer.

  3. Formatez le texte importé comme requis.

  4. Dans le Import Data boîte de dialogue qui s'ouvre, cliquez sur Properties...

  5. Décochez la case Prompt for file name on refresh boîte.

  6. Chaque fois que le fichier externe change, cliquez sur Data/Get External Data/Refresh All bouton.

Remarque: dans votre cas, vous devriez probablement ignorer l'étape # 5.

0
ysap