PNG32 PNG32 PNG32 PNG32
PNG32
Forum Excel, VBA, VSTO, Exceltips, Excelhj�lp PNG32 drivs av Excelspecialisten    Logga in     English
PNG32
PNG32 PNG32
PNG32

Logga in

PNG32

Du är inte inloggad. Logga in eller registrera dig för att skriva inlägg eller svara på inlägg.

För frågor om forumet, kontakta oss på webmaster@excelforum.se

PNG32 PNG32
PNG32 PNG32
PNG32

Excelforum

PNG32

 
ForumForumDiskussionerDiskussionerVBAVBATextToColumns fungerar inte vid import av CSV-filTextToColumns fungerar inte vid import av CSV-fil
Föregående Föregående
 
Nästa Nästa
Nytt inlägg
 2021-10-06 06:07
 
 Ändrad av Marcus K  på 2021-10-06 10:00:34

 Hej.

 Jag har ett problem som jag inte fattar alls hur jag ska lösa.

Jag hade ett makro där jag importerade en hög csv-filer och där delade sig allt upp i kolumner som det skulle. Sen byggde jag om makrot till att göra en massa andra saker också och då helt plötsligt fungerar det inte längre att dela upp csv-filen till kolumner. Jag har gått igenom TextToColumns flera gånger och kopierat den koden från den fungerande filen men det hjälper inte.

Edit:

Jag har nu testat lite mer och när jag kör den andra koden som inte fungerar i en tom arbetsbok så verkar första filen dela upp sig i kolumner som den ska men inte de efterföljande. Det fungerar inte heller om jag kör makrot i en fil där jag redan har importerat csv-filer.

Kod som fungerar:

==============================

Sub Combinecsv1()

    Dim xFilesToOpen As Variant

    Dim I As Integer

    Dim xWb As Workbook

    Dim xTempWb As Workbook

    Dim xDelimiter As String

    Dim xScreen As Boolean

    On Error GoTo ErrHandler

    xScreen = Application.ScreenUpdating

    Application.ScreenUpdating = False

    xDelimiter = "|"

    xFilesToOpen = Application.GetOpenFilename("All files (*.*), *.*", , "Kutools for Excel", , True)

    If TypeName(xFilesToOpen) = "Boolean" Then

        MsgBox "No files were selected", , "Kutools for Excel"

        GoTo ExitHandler

    End If

    I = 1

    Set xTempWb = Workbooks.Open(xFilesToOpen(I))

    xTempWb.Sheets(1).Copy

    Set xWb = Application.ActiveWorkbook

    xTempWb.Close False

    xWb.Worksheets(I).Columns("A:A").TextToColumns _

            Destination:=Range("A1"), DataType:=xlDelimited, _

            TextQualifier:=xlDoubleQuote, _

            ConsecutiveDelimiter:=False, _

            Tab:=False, Semicolon:=True, _

            Comma:=True, Space:=False, _

            Other:=True, OtherChar:="|"

    Do While I < UBound(xFilesToOpen)

        I = I + 1

        Set xTempWb = Workbooks.Open(xFilesToOpen(I))

        With xWb

                xTempWb.Sheets(1).Move after:=.Sheets(.Sheets.Count)

                .Worksheets(I).Columns("A:A").TextToColumns _

                Destination:=Range("A1"), DataType:=xlDelimited, _

                TextQualifier:=xlDoubleQuote, _

                ConsecutiveDelimiter:=False, _

                Tab:=False, Semicolon:=True, _

                Comma:=True, Space:=False, _

                Other:=True, OtherChar:=xDelimiter

            End With

 

    Loop

ExitHandler:

    Application.ScreenUpdating = xScreen

    Set xWb = Nothing

    Set xTempWb = Nothing

    Exit Sub

ErrHandler:

    MsgBox Err.Description, , "Kutools for Excel"

    Resume ExitHandler

End Sub

====================================== 

 

Sen har jag ändrat lite och helt plötsligt fungerar det inte längre.

 

======================================

Private Sub Combinecsv()

    On Error GoTo ErrorHandler

    

    Dim xFilesToOpen As Variant

    Dim i As Integer

    Dim j As Integer

    Dim xWb As Workbook

    Dim xTempWb As Workbook

    Dim xDelimiter As String

 

    MsgBox "Select CSV files to import"

 

    xFilesToOpen = Application.GetOpenFilename("All files (*.*), *.*", , "Kutools for Excel", , True)

    If TypeName(xFilesToOpen) = "Boolean" Then

        MsgBox "No files were selected", , "Kutools for Excel"

        GoTo ExitHandler

    End If

    

    ' Use the active workbook

    Set xWb = ThisWorkbook

    

    xDelimiter = "|"

    ' Counter for sheet number

    i = xWb.Sheets.Count

    ' Counter for files to open

    j = 0

        

    ' Open up and paste all the selected csv files

    Do While j < UBound(xFilesToOpen)

        i = i + 1

        j = j + 1

        ' Open up the csv file in Excel

        Set xTempWb = Workbooks.Open(xFilesToOpen(j))

        With xWb

                ' Paste the csv file to the last sheet

                xTempWb.Sheets(1).Move after:=.Sheets(.Sheets.Count)

                ' Divide the text to columns

                .Worksheets(i).Columns("A:A").TextToColumns _

                Destination:=Range("A1"), DataType:=xlDelimited, _

                TextQualifier:=xlDoubleQuote, _

                ConsecutiveDelimiter:=False, _

                Tab:=False, Semicolon:=True, _

                Comma:=True, Space:=False, _

                Other:=True, OtherChar:=xDelimiter

        End With

        

        ' Create a table and set the testnumber as the name

        Application.Run "Make_table"

        

        'Set the sheet to hidden

        ActiveSheet.Visible = False

    Loop

 

ExitHandler:

    Set xWb = Nothing

    Set xTempWb = Nothing

    Exit Sub

 

ErrorHandler:

    RaiseError Err.Number, Err.Source, "Mod_03_Create_file.Combinecsv", Err.Description, Erl

    Resume ExitHandler

 

End Sub

===================================

Nytt inlägg
 2021-10-06 11:13
 
 Ändrad av Christian  på 2021-10-06 11:34:59

Hej hej

Ett fel har jag hittat. Du sätter i till sheets.count, därefter ökar du med +1. Redan vid första loopen kommer du hamna på ett sheet som inte finns. 

Föreslår att du istället för i använder ett worksheetobjekt, så att du hela tiden lägger till ett nytt arbetsblad för varje ny fil som ska in.

'Innan loopen

Dim ws As Worksheet

i Loopen:

Set ws = xwb.Sheets.Add(, after:=xwb.Sheets(xwb.Sheets.Count))

Sedan byter du ut Worksheets(i) mot ws

Vidare föreslår jag att du använder Call istället för application.run, denna används mest om man vill anropa en annan arbetsbok. Du kan desstuom skicka med ws och filnamnet till din maketable funktion, så kan du använda dig av ws när du lägger in din tabell.

Dim ls As ListObject: Set ls = ws.ListObjects.Add(xlSrcRange, ws.UsedRange, , xlYes)

och ändra namnet på arbetsbladet enkelt:

ws.name = filnamnet

antagligen finns det flera fel. Om du ger upp så är du välkommen att kontakta mig per konsultbasis istället.

christian.hagglund@xls.se

mvh

Christian

Nytt inlägg
 2021-10-07 05:46
 

Hej Christian.

Jag ändrade enligt dina förslag men stötte på lite problem.

Använder jag:

Set ws = xwb.Sheets.Add(, after:=xwb.Sheets(xwb.Sheets.Count))

skapar jag ju en ny flik i slutet på arbetsboken och när jag sen skriver

xTempWb.Sheets(1).Move After:=.Sheets(.Sheets.Count)

i så lägger jag ju till csv-filen till en flik som hamnar efter den som vi nu skapade Set-funktionen. Då blir det ju fel i resten av koden då ws hänvisar till fliken som skapades i Set-funktionen och inte till fliken som skapades is Move After-funktionen.

Jag skrev sheet.count + 1 för att det läggs till en flik i Move After och att det är den fliken som jag vill hänvisa till när jag delar upp texten till kolumner.

Application.run använder jag för att Make table är en Private Sub och eftersom jag jobbar i en aktiv flik så hänviar jag bara till det när jag gör tabellen sen. Det kanske går att använda Call när de ligger i samma modul även att det är en Private Sub. Kanske får skriva om det om jag ska använda Make table på fler ställen men just nu anävnder jag den bara där.

 

Nytt inlägg
 2021-10-11 06:58
Accepterat svar 

 Hej igen Christian.

 

Tror jag hittade felet. Det verkar ha blivit något strul med att jag döljerflikarna allt efter jag skapar dem och då hänvisar den fel eftersom

xTempWb.Sheets(1).Move After:=.Sheets(.Sheets.Count)

verkar placera arket efter den sista synliga fliken och jag hänvisade till i With-funktionen till den sista fliken.

Löste det genom att hänvisa till fliknamnet istället för en räknare dåp jag vet att den nya fliken kommer heta fliknamnet. Fick även lägga in en kontroll att jag inte skapar en flik med ett namn som redan finns, vilket var bra för det var en funktion som jag redan hade tänkt lägga till.

Den nya koden blev såhär. Har dock inte testat det fullt ut än men än så länge verkar det fungera.

    Do While j < UBound(xFilesToOpen)

        j = j + 1

        exists = False

        Set xTempWb = Workbooks.Open(xFilesToOpen(j))                   ' Open up the csv file in Excel

        xTempWbname = xTempWb.Name

        For i = 1 To xWb.Sheets.Count

            If xWb.Sheets(i).Name = xTempWbname Then

                exists = True

            End If

        Next i

        

        If Not exists Then

            With xWb

                xTempWb.Sheets(1).Move After:=.Sheets(.Sheets.Count)        ' Copy the csv file to the last sheet

                    .Sheets(xTempWbname).Columns("A:A").TextToColumns _

                        Destination:=Range("A1"), DataType:=xlDelimited, _

                        TextQualifier:=xlDoubleQuote, _

                        ConsecutiveDelimiter:=False, _

                        Tab:=False, Semicolon:=True, _

                        Comma:=True, Space:=False, _

                        Other:=True, OtherChar:=xDelimiter                  ' Change the one column text to multiple columns

            End With

            

            Application.Run "Make_table"

            

            'Set the sheet to hidden

            ActiveSheet.Visible = False

        Else

            xTempWb.Close SaveChanges:=False

        End If

    Loop

Föregående Föregående
 
Nästa Nästa
ForumForumDiskussionerDiskussionerVBAVBATextToColumns fungerar inte vid import av CSV-filTextToColumns fungerar inte vid import av CSV-fil

PNG32 PNG32
Excelforum drivs av Excelspecialisten som bedriver utbildning i Excel och VBA, tillhandahåller support och hjälp med Excel, utvecklar program i Excel. Är ni i behov av en konsult inom Excel, VBA eller VSTO, eller söker en excelkurs, kontakta oss.
Copyright 2013 ExcelSpecialisten XLS AB   Användarvillkor  Personliga uppgifter