在excel中从CSV文件末尾删除空白行,还是使用可变步骤逐步完成宏?

时间:2019-07-01 07:15:21

标签: excel vba

我有一个excel工作表,它将许多信息(如果适用)串在一起,然后有一个选项卡,然后使用聚合功能将所有这些信息放在一个列表中。

然后我得到下面的代码,该代码最初是在这里的人们的帮助下构建的,以完成工作并为每个暗行中的文件创建csv文件。

在创建工作表时,我认为这可以解决问题,但是在构建更多工作表之后,数据长度可能会有所不同,每个csv文件所需的行数也会有所不同,例如,我可以使用一个制表符有6列数据需要制作成一个csv文件,或者有100列数据需要制作成8个csv文件。

我原本以为我会将数据间隔到最坏的情况,比如说30行,并让宏像这样创建csv文件,但是如果有空白行,我需要将csv文件上传到的程序将无法工作在csv的结尾。

所以...我要么需要一种方法来删除每个csv末尾的空白行,当使用时,该范围比包含数据的行数大得多(因为将需要的单元格数拥有聚合公式,即使我将聚合包装在“如果结果=什么都不是,那么””中,csv仍会看到一行中带有“”的单元格)

我需要一种更改代码的方法,以便它逐步根据一系列变量创建单独的csv文件,即创建具有6行的csv文件(我可以按照下面的最新代码从单元格中获取此数字)但是无法弄清楚如何逐步通过,并在每次通过时将此参考号更改为另一个单元格?

我敢肯定,“可变长度”选项会更容易,但是我缺乏解决此问题的技能。

谢谢!



'resets used range to try and stop creating blank csv files
a = ActiveSheet.UsedRange.Rows.Count

Dim wb As Workbook
Dim ThisSheet As Worksheet
Dim NumOfColumns As Integer
Dim RangeToCopy As Range
Dim WorkbookCounter As Integer
Dim RowsInFile


Application.ScreenUpdating = True


'Initialize data
Set ThisSheet = ThisWorkbook.ActiveSheet
NumOfColumns = 1
WorkbookCounter = 1
RowsInFile = Sheets("Upload").Cells(1, 4).Value     '10     'how many rows (incl. header) in new files?

For p = 1 To ThisSheet.UsedRange.Rows.Count Step RowsInFile

    'Paste the chunk of rows for this file
    Set RangeToCopy = ThisSheet.Range(ThisSheet.Cells(p, 1), ThisSheet.Cells(p + RowsInFile - 1, NumOfColumns))


    xName = ThisWorkbook.Path & "\Files for upload testing\" & "Purchase" & Format(Now(), "yyyymmddhhmmss") & ".csv"

    Application.Wait (Now + TimeValue("0:00:02"))



    Open xName For Output As #1
    For Each xRow In RangeToCopy.Rows


        xStr = ""
      For Each xCell In xRow.Cells
           xStr = xStr & xCell.Value & Chr(9)
        Next
        While Right(xStr, 1) = Chr(9)
            xStr = Left(xStr, Len(xStr) - 1)
        Wend
        Print #1, xStr


    Next

    Close #1

    'Increment file counter
    WorkbookCounter = WorkbookCounter + 1
Next p

Application.ScreenUpdating = True
Set wb = Nothing

End Sub

1 个答案:

答案 0 :(得分:0)

我无法确定您要复制多少列,或者这是否有所变化。

但是不要尝试删除空白行,只是不要写空行。

这不是最好的方法,但是可以与您的代码一起使用。

For Each xRow In RangeToCopy.Rows
    Dim writeThisLine As Boolean
    writeThisLine = False
    xStr = ""
    For Each xcell In xRow.Cells
        If xcell.Text <> "" Then writeThisLine = True
        xStr = xStr & xcell.Value & Chr(9)
    Next
    While Right(xStr, 1) = Chr(9)
        xStr = Left(xStr, Len(xStr) - 1)
    Wend
    If writeThisLine Then Print #1, xStr
Next