Avatar billede TUFexcel Juniormester
14. januar 2017 - 15:03 Der er 10 kommentarer og
1 løsning

Vba Indsæt navn på tekstfil

Hej

Jeg har sakset en glimrende Vba kode fra nettet. Fra et excelark kan den gå ind i en mappe og åbne og indsætte samtlige tekstfiler der måtte ligge der, i hvert sit ark.
Der er dog den mangel at den ikke viser hvad filen hedder. Så opgaven går ud på at lave en tilføjelse til nedenstående kode, således at der bliver indsat navnet på filen i A1:

Sub LoadPipeDelimitedFiles()
    Dim idx As Integer
    Dim fpath As String
    Dim fname As String

    idx = 0
    fpath = "C:\Users\TUFexcel\Desktop\Txtfiler\"
    fname = Dir(fpath & "*.txt")
    While (Len(fname) > 0)
        idx = idx + 1
        Sheets("Sheet" & idx).Select
        With ActiveSheet.QueryTables.Add(Connection:="TEXT;" _
          & fpath & fname, Destination:=Range("A3"))
            .Name = "a" & idx
           
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(3, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
     
   
   
      fname = Dir
        End With
   
    Wend
   
End Sub
14. januar 2017 - 15:23 #1
Sheets("Sheet" & idx).Select
Sheets("Sheet" & idx).Range("A1").Value = fname

With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & fpath & fname,Destination:=Range("A3")).Name = "a" & idx
Avatar billede TUFexcel Juniormester
14. januar 2017 - 15:29 #2
Tak

Det virker smukt.Er det muligt at fjerne .txt, ud for hvert navn?

Hilsen TUFexcel
14. januar 2017 - 15:43 #3
Sheets("Sheet" & idx).Range("A1").Value = Left(fname, Len(fname)-4)
Avatar billede TUFexcel Juniormester
14. januar 2017 - 15:55 #4
Fantastisk!
Har du lyst til en opgave mere?
Helst ville jeg have samtlige filer til at åbne i et ark således at der er en kolonnes luft imellem. Hvert sæt data består af 8 kolonner, så den næste skulle så starte i J3.

Tak. Det her gør det hele meget, meget lettere.
14. januar 2017 - 18:00 #5
Prøv denne her (ikke testet)
[dim]Sub LoadPipeDelimitedFiles()
    Const iCOLS_PER_FILE = 8
    Dim idx As Integer
    Dim lCol As Long
    Dim fpath As String
    Dim fname As String

    idx = 1
    lCol = 1
    fpath = "C:\Users\TUFexcel\Desktop\Txtfiler\"
    fname = Dir(fpath & "*.txt")
    While (Len(fname) > 0)
        idx = idx + 1
        Worksheets(1).Select
        With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & fpath & fname, _
            Destination:=Cells(3, lCol)).Name = "a" & idx
           
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 850
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = True
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(3, 1, 1, 1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
     
            fname = Dir
        End With
        lCol = lCol + iCOLS_PER_FILE + 1 'sidste +1 for en blank kolonne mellem imports
    Wend
End Sub[/div]
14. januar 2017 - 18:00 #6
Sub LoadPipeDelimitedFiles()
    Const iCOLS_PER_FILE = 8
    Dim idx As Integer
    Dim lCol As Long
    Dim fpath As String
    Dim fname As String

    idx = 1
    lCol = 1
    fpath = "C:\Users\TUFexcel\Desktop\Txtfiler\"
    fname = Dir(fpath & "*.txt")
    While (Len(fname) > 0)
        idx = idx + 1
        Worksheets(1).Select
        With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & fpath & fname, _
            Destination:=Cells(3, lCol)).Name = "a" & idx
           
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 850
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = True
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(3, 1, 1, 1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
     
            fname = Dir
        End With
        lCol = lCol + iCOLS_PER_FILE + 1 'sidste +1 for en blank kolonne mellem imports
    Wend
End Sub
Avatar billede TUFexcel Juniormester
15. januar 2017 - 11:16 #7
Tak for forslag
Jeg har ikke kunnet få det til at virke. Jeg har copy pasted koden, og fået debug svaret, "Object required", med følgende linje understreget i gult:
.FieldNames = True
15. januar 2017 - 17:56 #8
Jeg ikke mulighed for at teste de - og vil nok heller ikke kast så meget krudt efter det - måske er den ikke så glad for cells..., prøv at smide et range omkring det

Destination:=Range(Cells(3, lCol))).Name
Avatar billede TUFexcel Juniormester
15. januar 2017 - 20:00 #9
Hej igen

Nu er det linjerne før der bliver gule. Men det er fint nok som det er. Jeg kan sagtens lave en makro der opsamler dataene på de enkelte ark og sætte dem ind på ark 1.
Så jeg siger mange tak for hjælpen.

Hilsen

TUFexcel
15. januar 2017 - 20:55 #10
Som jeg husker QueryTables, så skulle der kunne være flere Queries pr ark...

Flytning skulle være nem,,, her er et hurtigt utestet skud fra hoften... Ind i et variant array og så ind i arket - lyn hurtigt kode

Sub MoveDataToFirstSheet()
    Const lCOLS_PER_TABLE = 9 'including space after
    Dim wsTarget As Worksheet
    Dim aData As Variant
    Dim i As Integer, lCol As Long
   
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Set wsTarget = Worksheets(1)
   
    For i = 2 To ThisWorkbook.Worksheets.Count
        lCol = lCol + lCOLS_PER_TABLE
        aData = Worksheets(i).Range("A3").CurrentRegion
        wsTarget.Cells(3, lCol).Resize(UBound(aData, 1), UBound(aData, 2)).Value = aData
    Next i
   
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub
Avatar billede TUFexcel Juniormester
16. januar 2017 - 16:58 #11
Skal den kopieres ind i den anden kode? Jeg kan se at den ikke referere til den mappe jeg har på computeren, så den kan jo ikke stå alene.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester