VBA- Import Multiple CSV to a Sheet, Remove Certain Rows/Columns












0














I am completely new to VBA, but I have CSV files(same format for all of them), and I want to import them to a single sheet on Excel. I was able to read the CSV file according to this code:



Sub R_AnalysisMerger()
Dim WSA As Worksheet
Dim bookList As Workbook
Dim SelectedFiles() As Variant
Dim NFile As Long
Dim FileName As String
Dim ws As Worksheet, vDB As Variant, rngT As Range

Application.ScreenUpdating = False

'Selects the CSV files as SELECTED FILES
Set ws = ThisWorkbook.Sheets(1)
ws.UsedRange.Clear 'Clears current worksheet
SelectedFiles = Application.GetOpenFilename(filefilter:="Excel Files (*.csv*), *.csv*", MultiSelect:=True) 'Selects csv files


For NFile = LBound(SelectedFiles) To UBound(SelectedFiles)
FileName = SelectedFiles(NFile)
Set bookList = Workbooks.Open(FileName, Format:=2)
Set WSA = bookList.Sheets(1)
With WSA
vDB = .UsedRange
Set rngT = ws.Range("a" & Rows.count).End(xlUp)(2)
If rngT.Row = 2 Then Set rngT = ws.Range("A1")
rngT.Resize(UBound(vDB, 1), UBound(vDB, 2)) = vDB

bookList.Close (0)
End With
Next
Application.ScreenUpdating = True
ws.Range("A1").Select


But I have additional requirements:
Skip the first column.
Skip the first four rows.
Remove a certain String from each word in the fifth row.



Im used to java, and usually I would read each line with a "for" loop and set "if" statements to skip the first row and four columns and remove the string from each string if it was present.



I don't know how to do this with this code. From what I understand it just copies the whole CSV file into the sheet?










share|improve this question






















  • Did you try using the Macro recorder?
    – Sorceri
    Nov 12 '18 at 21:31










  • @Sorceri Yes, I have no problem with removable the columns and lines, but the fifth line consists of "(Part A) some number (Part B)" I want to remove Part A and B, but the numbers can vary from file to file. When I tried recording a macro and removing the parts and pasting them into my active sheet, they just wrote the code as copy and pasting the number itself, rather than just removing the parts like I need
    – Phinale
    Nov 12 '18 at 21:57










  • Are these parts in a separate cells or do you need to exclude parts of a string based on delimiters? You will have to outline what the data you want to exclude (modify) on read looks like . . . .
    – Wookies-Will-Code
    Nov 12 '18 at 22:11










  • @Wookies-Will-Code Each cell in the fifth row has "Num 100 cm" and the parts I want to remove are Num and cm
    – Phinale
    Nov 12 '18 at 22:15












  • you can REPLACE with "" (nothing) for those if found when you read the string making a new string. You can read it all and then go in looking to modify after the read, or you could do it during the read. Parsing is never fun, but it is very necessary.
    – Wookies-Will-Code
    Nov 12 '18 at 22:18
















0














I am completely new to VBA, but I have CSV files(same format for all of them), and I want to import them to a single sheet on Excel. I was able to read the CSV file according to this code:



Sub R_AnalysisMerger()
Dim WSA As Worksheet
Dim bookList As Workbook
Dim SelectedFiles() As Variant
Dim NFile As Long
Dim FileName As String
Dim ws As Worksheet, vDB As Variant, rngT As Range

Application.ScreenUpdating = False

'Selects the CSV files as SELECTED FILES
Set ws = ThisWorkbook.Sheets(1)
ws.UsedRange.Clear 'Clears current worksheet
SelectedFiles = Application.GetOpenFilename(filefilter:="Excel Files (*.csv*), *.csv*", MultiSelect:=True) 'Selects csv files


For NFile = LBound(SelectedFiles) To UBound(SelectedFiles)
FileName = SelectedFiles(NFile)
Set bookList = Workbooks.Open(FileName, Format:=2)
Set WSA = bookList.Sheets(1)
With WSA
vDB = .UsedRange
Set rngT = ws.Range("a" & Rows.count).End(xlUp)(2)
If rngT.Row = 2 Then Set rngT = ws.Range("A1")
rngT.Resize(UBound(vDB, 1), UBound(vDB, 2)) = vDB

bookList.Close (0)
End With
Next
Application.ScreenUpdating = True
ws.Range("A1").Select


But I have additional requirements:
Skip the first column.
Skip the first four rows.
Remove a certain String from each word in the fifth row.



Im used to java, and usually I would read each line with a "for" loop and set "if" statements to skip the first row and four columns and remove the string from each string if it was present.



I don't know how to do this with this code. From what I understand it just copies the whole CSV file into the sheet?










share|improve this question






















  • Did you try using the Macro recorder?
    – Sorceri
    Nov 12 '18 at 21:31










  • @Sorceri Yes, I have no problem with removable the columns and lines, but the fifth line consists of "(Part A) some number (Part B)" I want to remove Part A and B, but the numbers can vary from file to file. When I tried recording a macro and removing the parts and pasting them into my active sheet, they just wrote the code as copy and pasting the number itself, rather than just removing the parts like I need
    – Phinale
    Nov 12 '18 at 21:57










  • Are these parts in a separate cells or do you need to exclude parts of a string based on delimiters? You will have to outline what the data you want to exclude (modify) on read looks like . . . .
    – Wookies-Will-Code
    Nov 12 '18 at 22:11










  • @Wookies-Will-Code Each cell in the fifth row has "Num 100 cm" and the parts I want to remove are Num and cm
    – Phinale
    Nov 12 '18 at 22:15












  • you can REPLACE with "" (nothing) for those if found when you read the string making a new string. You can read it all and then go in looking to modify after the read, or you could do it during the read. Parsing is never fun, but it is very necessary.
    – Wookies-Will-Code
    Nov 12 '18 at 22:18














0












0








0







I am completely new to VBA, but I have CSV files(same format for all of them), and I want to import them to a single sheet on Excel. I was able to read the CSV file according to this code:



Sub R_AnalysisMerger()
Dim WSA As Worksheet
Dim bookList As Workbook
Dim SelectedFiles() As Variant
Dim NFile As Long
Dim FileName As String
Dim ws As Worksheet, vDB As Variant, rngT As Range

Application.ScreenUpdating = False

'Selects the CSV files as SELECTED FILES
Set ws = ThisWorkbook.Sheets(1)
ws.UsedRange.Clear 'Clears current worksheet
SelectedFiles = Application.GetOpenFilename(filefilter:="Excel Files (*.csv*), *.csv*", MultiSelect:=True) 'Selects csv files


For NFile = LBound(SelectedFiles) To UBound(SelectedFiles)
FileName = SelectedFiles(NFile)
Set bookList = Workbooks.Open(FileName, Format:=2)
Set WSA = bookList.Sheets(1)
With WSA
vDB = .UsedRange
Set rngT = ws.Range("a" & Rows.count).End(xlUp)(2)
If rngT.Row = 2 Then Set rngT = ws.Range("A1")
rngT.Resize(UBound(vDB, 1), UBound(vDB, 2)) = vDB

bookList.Close (0)
End With
Next
Application.ScreenUpdating = True
ws.Range("A1").Select


But I have additional requirements:
Skip the first column.
Skip the first four rows.
Remove a certain String from each word in the fifth row.



Im used to java, and usually I would read each line with a "for" loop and set "if" statements to skip the first row and four columns and remove the string from each string if it was present.



I don't know how to do this with this code. From what I understand it just copies the whole CSV file into the sheet?










share|improve this question













I am completely new to VBA, but I have CSV files(same format for all of them), and I want to import them to a single sheet on Excel. I was able to read the CSV file according to this code:



Sub R_AnalysisMerger()
Dim WSA As Worksheet
Dim bookList As Workbook
Dim SelectedFiles() As Variant
Dim NFile As Long
Dim FileName As String
Dim ws As Worksheet, vDB As Variant, rngT As Range

Application.ScreenUpdating = False

'Selects the CSV files as SELECTED FILES
Set ws = ThisWorkbook.Sheets(1)
ws.UsedRange.Clear 'Clears current worksheet
SelectedFiles = Application.GetOpenFilename(filefilter:="Excel Files (*.csv*), *.csv*", MultiSelect:=True) 'Selects csv files


For NFile = LBound(SelectedFiles) To UBound(SelectedFiles)
FileName = SelectedFiles(NFile)
Set bookList = Workbooks.Open(FileName, Format:=2)
Set WSA = bookList.Sheets(1)
With WSA
vDB = .UsedRange
Set rngT = ws.Range("a" & Rows.count).End(xlUp)(2)
If rngT.Row = 2 Then Set rngT = ws.Range("A1")
rngT.Resize(UBound(vDB, 1), UBound(vDB, 2)) = vDB

bookList.Close (0)
End With
Next
Application.ScreenUpdating = True
ws.Range("A1").Select


But I have additional requirements:
Skip the first column.
Skip the first four rows.
Remove a certain String from each word in the fifth row.



Im used to java, and usually I would read each line with a "for" loop and set "if" statements to skip the first row and four columns and remove the string from each string if it was present.



I don't know how to do this with this code. From what I understand it just copies the whole CSV file into the sheet?







vba csv






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 12 '18 at 21:28









Phinale

11




11












  • Did you try using the Macro recorder?
    – Sorceri
    Nov 12 '18 at 21:31










  • @Sorceri Yes, I have no problem with removable the columns and lines, but the fifth line consists of "(Part A) some number (Part B)" I want to remove Part A and B, but the numbers can vary from file to file. When I tried recording a macro and removing the parts and pasting them into my active sheet, they just wrote the code as copy and pasting the number itself, rather than just removing the parts like I need
    – Phinale
    Nov 12 '18 at 21:57










  • Are these parts in a separate cells or do you need to exclude parts of a string based on delimiters? You will have to outline what the data you want to exclude (modify) on read looks like . . . .
    – Wookies-Will-Code
    Nov 12 '18 at 22:11










  • @Wookies-Will-Code Each cell in the fifth row has "Num 100 cm" and the parts I want to remove are Num and cm
    – Phinale
    Nov 12 '18 at 22:15












  • you can REPLACE with "" (nothing) for those if found when you read the string making a new string. You can read it all and then go in looking to modify after the read, or you could do it during the read. Parsing is never fun, but it is very necessary.
    – Wookies-Will-Code
    Nov 12 '18 at 22:18


















  • Did you try using the Macro recorder?
    – Sorceri
    Nov 12 '18 at 21:31










  • @Sorceri Yes, I have no problem with removable the columns and lines, but the fifth line consists of "(Part A) some number (Part B)" I want to remove Part A and B, but the numbers can vary from file to file. When I tried recording a macro and removing the parts and pasting them into my active sheet, they just wrote the code as copy and pasting the number itself, rather than just removing the parts like I need
    – Phinale
    Nov 12 '18 at 21:57










  • Are these parts in a separate cells or do you need to exclude parts of a string based on delimiters? You will have to outline what the data you want to exclude (modify) on read looks like . . . .
    – Wookies-Will-Code
    Nov 12 '18 at 22:11










  • @Wookies-Will-Code Each cell in the fifth row has "Num 100 cm" and the parts I want to remove are Num and cm
    – Phinale
    Nov 12 '18 at 22:15












  • you can REPLACE with "" (nothing) for those if found when you read the string making a new string. You can read it all and then go in looking to modify after the read, or you could do it during the read. Parsing is never fun, but it is very necessary.
    – Wookies-Will-Code
    Nov 12 '18 at 22:18
















Did you try using the Macro recorder?
– Sorceri
Nov 12 '18 at 21:31




Did you try using the Macro recorder?
– Sorceri
Nov 12 '18 at 21:31












@Sorceri Yes, I have no problem with removable the columns and lines, but the fifth line consists of "(Part A) some number (Part B)" I want to remove Part A and B, but the numbers can vary from file to file. When I tried recording a macro and removing the parts and pasting them into my active sheet, they just wrote the code as copy and pasting the number itself, rather than just removing the parts like I need
– Phinale
Nov 12 '18 at 21:57




@Sorceri Yes, I have no problem with removable the columns and lines, but the fifth line consists of "(Part A) some number (Part B)" I want to remove Part A and B, but the numbers can vary from file to file. When I tried recording a macro and removing the parts and pasting them into my active sheet, they just wrote the code as copy and pasting the number itself, rather than just removing the parts like I need
– Phinale
Nov 12 '18 at 21:57












Are these parts in a separate cells or do you need to exclude parts of a string based on delimiters? You will have to outline what the data you want to exclude (modify) on read looks like . . . .
– Wookies-Will-Code
Nov 12 '18 at 22:11




Are these parts in a separate cells or do you need to exclude parts of a string based on delimiters? You will have to outline what the data you want to exclude (modify) on read looks like . . . .
– Wookies-Will-Code
Nov 12 '18 at 22:11












@Wookies-Will-Code Each cell in the fifth row has "Num 100 cm" and the parts I want to remove are Num and cm
– Phinale
Nov 12 '18 at 22:15






@Wookies-Will-Code Each cell in the fifth row has "Num 100 cm" and the parts I want to remove are Num and cm
– Phinale
Nov 12 '18 at 22:15














you can REPLACE with "" (nothing) for those if found when you read the string making a new string. You can read it all and then go in looking to modify after the read, or you could do it during the read. Parsing is never fun, but it is very necessary.
– Wookies-Will-Code
Nov 12 '18 at 22:18




you can REPLACE with "" (nothing) for those if found when you read the string making a new string. You can read it all and then go in looking to modify after the read, or you could do it during the read. Parsing is never fun, but it is very necessary.
– Wookies-Will-Code
Nov 12 '18 at 22:18












2 Answers
2






active

oldest

votes


















0














This solution is based on reading CSV as textstream. I have tried to include feature that makes possible most all things like selecting columns, Rows and so on.



Sub ImportCSV()    

Dim fso As New IWshRuntimeLibrary.FileSystemObject
Dim txtStream As IWshRuntimeLibrary.TextStream
Dim files As IWshRuntimeLibrary.files
Dim file As IWshRuntimeLibrary.file
Dim txtLine As String
Dim lineCount As Integer
Dim lastRow As Integer
Dim lineCol As Variant
Dim rng As Range

Application.ScreenUpdating = False
ThisWorkbook.Sheets(1).usedRange.Delete
Set rng = ThisWorkbook.Sheets(1).usedRange
lastRow = 1
Set files = fso.GetFolder("pathfolder").files

For Each file In files
If file.Name Like "*.csv" Then
Set txtStream = file.OpenAsTextStream(ForReading, TristateUseDefault)
txtStream.SkipLine ' skip first line, since it containes headers
lineCount = 1
Do
txtLine = txtStream.ReadLine
If lineCount = 5 Then
txtLine = Replace(txtLine, "stringToReplace", "StringToReplcaeWith") ' replace certain string from words in 5'th row
End If
lineCount = lineCount + 1
lineCol = sliceStr(Split(txtLine, ";"), startIdx:=4) ' slice the array so to skip four first columns
For iCol = 0 To UBound(lineCol) ' write columns to last row
rng(lastRow, iCol + 1).Value = lineCol(iCol)
Next iCol
lastRow = lastRow + 1
'Debug.Print Join(lineCol, ";") ' debug
Loop Until txtStream.AtEndOfStream
End If
Next file
Application.ScreenUpdating = True
End Sub


This is the slicer function



Function sliceStr(arr As Variant, startIdx As Integer, Optional stopIdx As Integer = 0) As String()
If stopIdx = 0 Then
stopIdx = UBound(arr)
End If
Dim tempArrStr() As String
ReDim tempArrStr(stopIdx - startIdx)
Dim counter As Integer
counter = 0
For i = startIdx To stopIdx
tempArrStr(counter) = arr(i)
counter = counter + 1
Next
sliceStr = tempArrStr
End Function





share|improve this answer























  • When I tried testing this method it gave Highlighted the first line and gave me an Compile error: "User-defined type not defined"?
    – Phinale
    Dec 12 '18 at 2:20





















0














I just did a simple test and the code below seems to work. Give it a go, and feedback.



Sub Demo()
Dim fso As Object 'FileSystemObject
Dim fldStart As Object 'Folder
Dim fld As Object 'Folder
Dim fl As Object 'File
Dim Mask As String

Application.ScreenUpdating = False
Dim newWS As Worksheet

Set newWS = Sheets.Add(before:=Sheets(1))

Set fso = CreateObject("scripting.FileSystemObject") ' late binding
'Set fso = New FileSystemObject 'or use early binding (also replace Object types)

Set fldStart = fso.GetFolder("C:UsersryansOneDriveDesktopoutput") ' <-- use your FileDialog code here
Mask = "*.csv"
'Debug.Print fldStart.Path & ""
ListFiles fldStart, Mask
For Each fld In fldStart.SubFolders
ListFiles fld, Mask
ListFolders fld, Mask
Next

Dim myWB As Workbook, WB As Workbook
Set myWB = ThisWorkbook
Dim L As Long, t As Long, i As Long
L = myWB.Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row
t = 1
For i = 1 To L
Workbooks.OpenText Filename:=myWB.Sheets(1).Cells(i, 1).Value, DataType:=xlDelimited, Tab:=True
Set WB = ActiveWorkbook
lrow = WB.Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row
WB.Sheets(1).Range("B4:E" & lrow).Copy newWS.Cells(t, 2)
t = myWB.Sheets(1).Cells(Rows.Count, "B").End(xlUp).Row + 1
WB.Close False
Next
myWB.Sheets(1).Columns(1).Delete
Application.ScreenUpdating = True
End Sub



Sub ListFolders(fldStart As Object, Mask As String)
Dim fld As Object 'Folder
For Each fld In fldStart.SubFolders
'Debug.Print fld.Path & ""
ListFiles fld, Mask
ListFolders fld, Mask
Next
End Sub



Sub ListFiles(fld As Object, Mask As String)
Dim t As Long
Dim fl As Object 'File
For Each fl In fld.Files
If fl.Name Like Mask Then
t = Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row + 1
'Debug.Print fld.Path & "" & fl.Name
If Sheets(1).Cells(1, 1) = "" Then
Sheets(1).Cells(1, 1) = fld.Path & "" & fl.Name
Else
Sheets(1).Cells(t, 1) = fld.Path & "" & fl.Name
End If
End If
Next
End Sub





share|improve this answer





















  • Hi! Thank you so much for the code it really provided a good base for me. The only thing I had to change was that I ended up using a separate function to open up a file selector and returning the file path as a String. It worked. The result was that the Column A and the first few rows were removed from every csv file as needed. The problem is that only the first four columns after were printed into the sheet, but that was easy to fix. Thanks again for the help!
    – Phinale
    Dec 12 '18 at 2:09












  • If it helps you, please go ahead and upvote this answer. Thanks.
    – ryguy72
    Dec 12 '18 at 2:28











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53270366%2fvba-import-multiple-csv-to-a-sheet-remove-certain-rows-columns%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes









0














This solution is based on reading CSV as textstream. I have tried to include feature that makes possible most all things like selecting columns, Rows and so on.



Sub ImportCSV()    

Dim fso As New IWshRuntimeLibrary.FileSystemObject
Dim txtStream As IWshRuntimeLibrary.TextStream
Dim files As IWshRuntimeLibrary.files
Dim file As IWshRuntimeLibrary.file
Dim txtLine As String
Dim lineCount As Integer
Dim lastRow As Integer
Dim lineCol As Variant
Dim rng As Range

Application.ScreenUpdating = False
ThisWorkbook.Sheets(1).usedRange.Delete
Set rng = ThisWorkbook.Sheets(1).usedRange
lastRow = 1
Set files = fso.GetFolder("pathfolder").files

For Each file In files
If file.Name Like "*.csv" Then
Set txtStream = file.OpenAsTextStream(ForReading, TristateUseDefault)
txtStream.SkipLine ' skip first line, since it containes headers
lineCount = 1
Do
txtLine = txtStream.ReadLine
If lineCount = 5 Then
txtLine = Replace(txtLine, "stringToReplace", "StringToReplcaeWith") ' replace certain string from words in 5'th row
End If
lineCount = lineCount + 1
lineCol = sliceStr(Split(txtLine, ";"), startIdx:=4) ' slice the array so to skip four first columns
For iCol = 0 To UBound(lineCol) ' write columns to last row
rng(lastRow, iCol + 1).Value = lineCol(iCol)
Next iCol
lastRow = lastRow + 1
'Debug.Print Join(lineCol, ";") ' debug
Loop Until txtStream.AtEndOfStream
End If
Next file
Application.ScreenUpdating = True
End Sub


This is the slicer function



Function sliceStr(arr As Variant, startIdx As Integer, Optional stopIdx As Integer = 0) As String()
If stopIdx = 0 Then
stopIdx = UBound(arr)
End If
Dim tempArrStr() As String
ReDim tempArrStr(stopIdx - startIdx)
Dim counter As Integer
counter = 0
For i = startIdx To stopIdx
tempArrStr(counter) = arr(i)
counter = counter + 1
Next
sliceStr = tempArrStr
End Function





share|improve this answer























  • When I tried testing this method it gave Highlighted the first line and gave me an Compile error: "User-defined type not defined"?
    – Phinale
    Dec 12 '18 at 2:20


















0














This solution is based on reading CSV as textstream. I have tried to include feature that makes possible most all things like selecting columns, Rows and so on.



Sub ImportCSV()    

Dim fso As New IWshRuntimeLibrary.FileSystemObject
Dim txtStream As IWshRuntimeLibrary.TextStream
Dim files As IWshRuntimeLibrary.files
Dim file As IWshRuntimeLibrary.file
Dim txtLine As String
Dim lineCount As Integer
Dim lastRow As Integer
Dim lineCol As Variant
Dim rng As Range

Application.ScreenUpdating = False
ThisWorkbook.Sheets(1).usedRange.Delete
Set rng = ThisWorkbook.Sheets(1).usedRange
lastRow = 1
Set files = fso.GetFolder("pathfolder").files

For Each file In files
If file.Name Like "*.csv" Then
Set txtStream = file.OpenAsTextStream(ForReading, TristateUseDefault)
txtStream.SkipLine ' skip first line, since it containes headers
lineCount = 1
Do
txtLine = txtStream.ReadLine
If lineCount = 5 Then
txtLine = Replace(txtLine, "stringToReplace", "StringToReplcaeWith") ' replace certain string from words in 5'th row
End If
lineCount = lineCount + 1
lineCol = sliceStr(Split(txtLine, ";"), startIdx:=4) ' slice the array so to skip four first columns
For iCol = 0 To UBound(lineCol) ' write columns to last row
rng(lastRow, iCol + 1).Value = lineCol(iCol)
Next iCol
lastRow = lastRow + 1
'Debug.Print Join(lineCol, ";") ' debug
Loop Until txtStream.AtEndOfStream
End If
Next file
Application.ScreenUpdating = True
End Sub


This is the slicer function



Function sliceStr(arr As Variant, startIdx As Integer, Optional stopIdx As Integer = 0) As String()
If stopIdx = 0 Then
stopIdx = UBound(arr)
End If
Dim tempArrStr() As String
ReDim tempArrStr(stopIdx - startIdx)
Dim counter As Integer
counter = 0
For i = startIdx To stopIdx
tempArrStr(counter) = arr(i)
counter = counter + 1
Next
sliceStr = tempArrStr
End Function





share|improve this answer























  • When I tried testing this method it gave Highlighted the first line and gave me an Compile error: "User-defined type not defined"?
    – Phinale
    Dec 12 '18 at 2:20
















0












0








0






This solution is based on reading CSV as textstream. I have tried to include feature that makes possible most all things like selecting columns, Rows and so on.



Sub ImportCSV()    

Dim fso As New IWshRuntimeLibrary.FileSystemObject
Dim txtStream As IWshRuntimeLibrary.TextStream
Dim files As IWshRuntimeLibrary.files
Dim file As IWshRuntimeLibrary.file
Dim txtLine As String
Dim lineCount As Integer
Dim lastRow As Integer
Dim lineCol As Variant
Dim rng As Range

Application.ScreenUpdating = False
ThisWorkbook.Sheets(1).usedRange.Delete
Set rng = ThisWorkbook.Sheets(1).usedRange
lastRow = 1
Set files = fso.GetFolder("pathfolder").files

For Each file In files
If file.Name Like "*.csv" Then
Set txtStream = file.OpenAsTextStream(ForReading, TristateUseDefault)
txtStream.SkipLine ' skip first line, since it containes headers
lineCount = 1
Do
txtLine = txtStream.ReadLine
If lineCount = 5 Then
txtLine = Replace(txtLine, "stringToReplace", "StringToReplcaeWith") ' replace certain string from words in 5'th row
End If
lineCount = lineCount + 1
lineCol = sliceStr(Split(txtLine, ";"), startIdx:=4) ' slice the array so to skip four first columns
For iCol = 0 To UBound(lineCol) ' write columns to last row
rng(lastRow, iCol + 1).Value = lineCol(iCol)
Next iCol
lastRow = lastRow + 1
'Debug.Print Join(lineCol, ";") ' debug
Loop Until txtStream.AtEndOfStream
End If
Next file
Application.ScreenUpdating = True
End Sub


This is the slicer function



Function sliceStr(arr As Variant, startIdx As Integer, Optional stopIdx As Integer = 0) As String()
If stopIdx = 0 Then
stopIdx = UBound(arr)
End If
Dim tempArrStr() As String
ReDim tempArrStr(stopIdx - startIdx)
Dim counter As Integer
counter = 0
For i = startIdx To stopIdx
tempArrStr(counter) = arr(i)
counter = counter + 1
Next
sliceStr = tempArrStr
End Function





share|improve this answer














This solution is based on reading CSV as textstream. I have tried to include feature that makes possible most all things like selecting columns, Rows and so on.



Sub ImportCSV()    

Dim fso As New IWshRuntimeLibrary.FileSystemObject
Dim txtStream As IWshRuntimeLibrary.TextStream
Dim files As IWshRuntimeLibrary.files
Dim file As IWshRuntimeLibrary.file
Dim txtLine As String
Dim lineCount As Integer
Dim lastRow As Integer
Dim lineCol As Variant
Dim rng As Range

Application.ScreenUpdating = False
ThisWorkbook.Sheets(1).usedRange.Delete
Set rng = ThisWorkbook.Sheets(1).usedRange
lastRow = 1
Set files = fso.GetFolder("pathfolder").files

For Each file In files
If file.Name Like "*.csv" Then
Set txtStream = file.OpenAsTextStream(ForReading, TristateUseDefault)
txtStream.SkipLine ' skip first line, since it containes headers
lineCount = 1
Do
txtLine = txtStream.ReadLine
If lineCount = 5 Then
txtLine = Replace(txtLine, "stringToReplace", "StringToReplcaeWith") ' replace certain string from words in 5'th row
End If
lineCount = lineCount + 1
lineCol = sliceStr(Split(txtLine, ";"), startIdx:=4) ' slice the array so to skip four first columns
For iCol = 0 To UBound(lineCol) ' write columns to last row
rng(lastRow, iCol + 1).Value = lineCol(iCol)
Next iCol
lastRow = lastRow + 1
'Debug.Print Join(lineCol, ";") ' debug
Loop Until txtStream.AtEndOfStream
End If
Next file
Application.ScreenUpdating = True
End Sub


This is the slicer function



Function sliceStr(arr As Variant, startIdx As Integer, Optional stopIdx As Integer = 0) As String()
If stopIdx = 0 Then
stopIdx = UBound(arr)
End If
Dim tempArrStr() As String
ReDim tempArrStr(stopIdx - startIdx)
Dim counter As Integer
counter = 0
For i = startIdx To stopIdx
tempArrStr(counter) = arr(i)
counter = counter + 1
Next
sliceStr = tempArrStr
End Function






share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 13 '18 at 4:41

























answered Nov 13 '18 at 4:25









siggi_pop

874




874












  • When I tried testing this method it gave Highlighted the first line and gave me an Compile error: "User-defined type not defined"?
    – Phinale
    Dec 12 '18 at 2:20




















  • When I tried testing this method it gave Highlighted the first line and gave me an Compile error: "User-defined type not defined"?
    – Phinale
    Dec 12 '18 at 2:20


















When I tried testing this method it gave Highlighted the first line and gave me an Compile error: "User-defined type not defined"?
– Phinale
Dec 12 '18 at 2:20






When I tried testing this method it gave Highlighted the first line and gave me an Compile error: "User-defined type not defined"?
– Phinale
Dec 12 '18 at 2:20















0














I just did a simple test and the code below seems to work. Give it a go, and feedback.



Sub Demo()
Dim fso As Object 'FileSystemObject
Dim fldStart As Object 'Folder
Dim fld As Object 'Folder
Dim fl As Object 'File
Dim Mask As String

Application.ScreenUpdating = False
Dim newWS As Worksheet

Set newWS = Sheets.Add(before:=Sheets(1))

Set fso = CreateObject("scripting.FileSystemObject") ' late binding
'Set fso = New FileSystemObject 'or use early binding (also replace Object types)

Set fldStart = fso.GetFolder("C:UsersryansOneDriveDesktopoutput") ' <-- use your FileDialog code here
Mask = "*.csv"
'Debug.Print fldStart.Path & ""
ListFiles fldStart, Mask
For Each fld In fldStart.SubFolders
ListFiles fld, Mask
ListFolders fld, Mask
Next

Dim myWB As Workbook, WB As Workbook
Set myWB = ThisWorkbook
Dim L As Long, t As Long, i As Long
L = myWB.Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row
t = 1
For i = 1 To L
Workbooks.OpenText Filename:=myWB.Sheets(1).Cells(i, 1).Value, DataType:=xlDelimited, Tab:=True
Set WB = ActiveWorkbook
lrow = WB.Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row
WB.Sheets(1).Range("B4:E" & lrow).Copy newWS.Cells(t, 2)
t = myWB.Sheets(1).Cells(Rows.Count, "B").End(xlUp).Row + 1
WB.Close False
Next
myWB.Sheets(1).Columns(1).Delete
Application.ScreenUpdating = True
End Sub



Sub ListFolders(fldStart As Object, Mask As String)
Dim fld As Object 'Folder
For Each fld In fldStart.SubFolders
'Debug.Print fld.Path & ""
ListFiles fld, Mask
ListFolders fld, Mask
Next
End Sub



Sub ListFiles(fld As Object, Mask As String)
Dim t As Long
Dim fl As Object 'File
For Each fl In fld.Files
If fl.Name Like Mask Then
t = Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row + 1
'Debug.Print fld.Path & "" & fl.Name
If Sheets(1).Cells(1, 1) = "" Then
Sheets(1).Cells(1, 1) = fld.Path & "" & fl.Name
Else
Sheets(1).Cells(t, 1) = fld.Path & "" & fl.Name
End If
End If
Next
End Sub





share|improve this answer





















  • Hi! Thank you so much for the code it really provided a good base for me. The only thing I had to change was that I ended up using a separate function to open up a file selector and returning the file path as a String. It worked. The result was that the Column A and the first few rows were removed from every csv file as needed. The problem is that only the first four columns after were printed into the sheet, but that was easy to fix. Thanks again for the help!
    – Phinale
    Dec 12 '18 at 2:09












  • If it helps you, please go ahead and upvote this answer. Thanks.
    – ryguy72
    Dec 12 '18 at 2:28
















0














I just did a simple test and the code below seems to work. Give it a go, and feedback.



Sub Demo()
Dim fso As Object 'FileSystemObject
Dim fldStart As Object 'Folder
Dim fld As Object 'Folder
Dim fl As Object 'File
Dim Mask As String

Application.ScreenUpdating = False
Dim newWS As Worksheet

Set newWS = Sheets.Add(before:=Sheets(1))

Set fso = CreateObject("scripting.FileSystemObject") ' late binding
'Set fso = New FileSystemObject 'or use early binding (also replace Object types)

Set fldStart = fso.GetFolder("C:UsersryansOneDriveDesktopoutput") ' <-- use your FileDialog code here
Mask = "*.csv"
'Debug.Print fldStart.Path & ""
ListFiles fldStart, Mask
For Each fld In fldStart.SubFolders
ListFiles fld, Mask
ListFolders fld, Mask
Next

Dim myWB As Workbook, WB As Workbook
Set myWB = ThisWorkbook
Dim L As Long, t As Long, i As Long
L = myWB.Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row
t = 1
For i = 1 To L
Workbooks.OpenText Filename:=myWB.Sheets(1).Cells(i, 1).Value, DataType:=xlDelimited, Tab:=True
Set WB = ActiveWorkbook
lrow = WB.Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row
WB.Sheets(1).Range("B4:E" & lrow).Copy newWS.Cells(t, 2)
t = myWB.Sheets(1).Cells(Rows.Count, "B").End(xlUp).Row + 1
WB.Close False
Next
myWB.Sheets(1).Columns(1).Delete
Application.ScreenUpdating = True
End Sub



Sub ListFolders(fldStart As Object, Mask As String)
Dim fld As Object 'Folder
For Each fld In fldStart.SubFolders
'Debug.Print fld.Path & ""
ListFiles fld, Mask
ListFolders fld, Mask
Next
End Sub



Sub ListFiles(fld As Object, Mask As String)
Dim t As Long
Dim fl As Object 'File
For Each fl In fld.Files
If fl.Name Like Mask Then
t = Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row + 1
'Debug.Print fld.Path & "" & fl.Name
If Sheets(1).Cells(1, 1) = "" Then
Sheets(1).Cells(1, 1) = fld.Path & "" & fl.Name
Else
Sheets(1).Cells(t, 1) = fld.Path & "" & fl.Name
End If
End If
Next
End Sub





share|improve this answer





















  • Hi! Thank you so much for the code it really provided a good base for me. The only thing I had to change was that I ended up using a separate function to open up a file selector and returning the file path as a String. It worked. The result was that the Column A and the first few rows were removed from every csv file as needed. The problem is that only the first four columns after were printed into the sheet, but that was easy to fix. Thanks again for the help!
    – Phinale
    Dec 12 '18 at 2:09












  • If it helps you, please go ahead and upvote this answer. Thanks.
    – ryguy72
    Dec 12 '18 at 2:28














0












0








0






I just did a simple test and the code below seems to work. Give it a go, and feedback.



Sub Demo()
Dim fso As Object 'FileSystemObject
Dim fldStart As Object 'Folder
Dim fld As Object 'Folder
Dim fl As Object 'File
Dim Mask As String

Application.ScreenUpdating = False
Dim newWS As Worksheet

Set newWS = Sheets.Add(before:=Sheets(1))

Set fso = CreateObject("scripting.FileSystemObject") ' late binding
'Set fso = New FileSystemObject 'or use early binding (also replace Object types)

Set fldStart = fso.GetFolder("C:UsersryansOneDriveDesktopoutput") ' <-- use your FileDialog code here
Mask = "*.csv"
'Debug.Print fldStart.Path & ""
ListFiles fldStart, Mask
For Each fld In fldStart.SubFolders
ListFiles fld, Mask
ListFolders fld, Mask
Next

Dim myWB As Workbook, WB As Workbook
Set myWB = ThisWorkbook
Dim L As Long, t As Long, i As Long
L = myWB.Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row
t = 1
For i = 1 To L
Workbooks.OpenText Filename:=myWB.Sheets(1).Cells(i, 1).Value, DataType:=xlDelimited, Tab:=True
Set WB = ActiveWorkbook
lrow = WB.Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row
WB.Sheets(1).Range("B4:E" & lrow).Copy newWS.Cells(t, 2)
t = myWB.Sheets(1).Cells(Rows.Count, "B").End(xlUp).Row + 1
WB.Close False
Next
myWB.Sheets(1).Columns(1).Delete
Application.ScreenUpdating = True
End Sub



Sub ListFolders(fldStart As Object, Mask As String)
Dim fld As Object 'Folder
For Each fld In fldStart.SubFolders
'Debug.Print fld.Path & ""
ListFiles fld, Mask
ListFolders fld, Mask
Next
End Sub



Sub ListFiles(fld As Object, Mask As String)
Dim t As Long
Dim fl As Object 'File
For Each fl In fld.Files
If fl.Name Like Mask Then
t = Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row + 1
'Debug.Print fld.Path & "" & fl.Name
If Sheets(1).Cells(1, 1) = "" Then
Sheets(1).Cells(1, 1) = fld.Path & "" & fl.Name
Else
Sheets(1).Cells(t, 1) = fld.Path & "" & fl.Name
End If
End If
Next
End Sub





share|improve this answer












I just did a simple test and the code below seems to work. Give it a go, and feedback.



Sub Demo()
Dim fso As Object 'FileSystemObject
Dim fldStart As Object 'Folder
Dim fld As Object 'Folder
Dim fl As Object 'File
Dim Mask As String

Application.ScreenUpdating = False
Dim newWS As Worksheet

Set newWS = Sheets.Add(before:=Sheets(1))

Set fso = CreateObject("scripting.FileSystemObject") ' late binding
'Set fso = New FileSystemObject 'or use early binding (also replace Object types)

Set fldStart = fso.GetFolder("C:UsersryansOneDriveDesktopoutput") ' <-- use your FileDialog code here
Mask = "*.csv"
'Debug.Print fldStart.Path & ""
ListFiles fldStart, Mask
For Each fld In fldStart.SubFolders
ListFiles fld, Mask
ListFolders fld, Mask
Next

Dim myWB As Workbook, WB As Workbook
Set myWB = ThisWorkbook
Dim L As Long, t As Long, i As Long
L = myWB.Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row
t = 1
For i = 1 To L
Workbooks.OpenText Filename:=myWB.Sheets(1).Cells(i, 1).Value, DataType:=xlDelimited, Tab:=True
Set WB = ActiveWorkbook
lrow = WB.Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row
WB.Sheets(1).Range("B4:E" & lrow).Copy newWS.Cells(t, 2)
t = myWB.Sheets(1).Cells(Rows.Count, "B").End(xlUp).Row + 1
WB.Close False
Next
myWB.Sheets(1).Columns(1).Delete
Application.ScreenUpdating = True
End Sub



Sub ListFolders(fldStart As Object, Mask As String)
Dim fld As Object 'Folder
For Each fld In fldStart.SubFolders
'Debug.Print fld.Path & ""
ListFiles fld, Mask
ListFolders fld, Mask
Next
End Sub



Sub ListFiles(fld As Object, Mask As String)
Dim t As Long
Dim fl As Object 'File
For Each fl In fld.Files
If fl.Name Like Mask Then
t = Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row + 1
'Debug.Print fld.Path & "" & fl.Name
If Sheets(1).Cells(1, 1) = "" Then
Sheets(1).Cells(1, 1) = fld.Path & "" & fl.Name
Else
Sheets(1).Cells(t, 1) = fld.Path & "" & fl.Name
End If
End If
Next
End Sub






share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 15 '18 at 22:55









ryguy72

3,9911619




3,9911619












  • Hi! Thank you so much for the code it really provided a good base for me. The only thing I had to change was that I ended up using a separate function to open up a file selector and returning the file path as a String. It worked. The result was that the Column A and the first few rows were removed from every csv file as needed. The problem is that only the first four columns after were printed into the sheet, but that was easy to fix. Thanks again for the help!
    – Phinale
    Dec 12 '18 at 2:09












  • If it helps you, please go ahead and upvote this answer. Thanks.
    – ryguy72
    Dec 12 '18 at 2:28


















  • Hi! Thank you so much for the code it really provided a good base for me. The only thing I had to change was that I ended up using a separate function to open up a file selector and returning the file path as a String. It worked. The result was that the Column A and the first few rows were removed from every csv file as needed. The problem is that only the first four columns after were printed into the sheet, but that was easy to fix. Thanks again for the help!
    – Phinale
    Dec 12 '18 at 2:09












  • If it helps you, please go ahead and upvote this answer. Thanks.
    – ryguy72
    Dec 12 '18 at 2:28
















Hi! Thank you so much for the code it really provided a good base for me. The only thing I had to change was that I ended up using a separate function to open up a file selector and returning the file path as a String. It worked. The result was that the Column A and the first few rows were removed from every csv file as needed. The problem is that only the first four columns after were printed into the sheet, but that was easy to fix. Thanks again for the help!
– Phinale
Dec 12 '18 at 2:09






Hi! Thank you so much for the code it really provided a good base for me. The only thing I had to change was that I ended up using a separate function to open up a file selector and returning the file path as a String. It worked. The result was that the Column A and the first few rows were removed from every csv file as needed. The problem is that only the first four columns after were printed into the sheet, but that was easy to fix. Thanks again for the help!
– Phinale
Dec 12 '18 at 2:09














If it helps you, please go ahead and upvote this answer. Thanks.
– ryguy72
Dec 12 '18 at 2:28




If it helps you, please go ahead and upvote this answer. Thanks.
– ryguy72
Dec 12 '18 at 2:28


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53270366%2fvba-import-multiple-csv-to-a-sheet-remove-certain-rows-columns%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Xamarin.iOS Cant Deploy on Iphone

Glorious Revolution

Dulmage-Mendelsohn matrix decomposition in Python