0

我有一个很长的复杂宏,我不断添加文本以进行改进。现在它是完美的,除了最后一件令人讨厌的物品。基本上有一个报告,我们转储到 excel 和宏格式报告,但有时报告不止一页,有两个标题。我想删除一个标题,但保留另一个。显然,标题位于不同的文本之间,具体取决于分页符所在的位置。我能够编写代码来查找某些内容并删除行,但是这也会删除我想要保留的第 1 页标题。这些是财务报表,标题文本是这样的:

报告 ID:DC_COMPINC 格式 ID:VARSUM 重新预测芽:MFC09 样式 ID:@

但是也有一堆空白行。我不确定这是否可以做到,当然手动删除文本并不是什么大不了的事,我只是想尽可能地自动化。据我所知,总共需要删除 10 行,前 4 行是上面的文本,加上下面的 6 个空白行。

4

2 回答 2

1

如果标题始终以相同的特定字符开头,您可以遍历行,找到标题文本的任何辅助实例,并删除所需的行集。在下面的代码中,您需要指定 CommonHeaderText 字符串以及报告中的第一个单元格。

Sub HeaderRemover()

' dim the variables
Dim FirstCell As Range
Dim CommonHeaderText, DeletionRowString As String
Dim HeaderInstances As Integer

' modify to grab the right header and start in the right place
CommonHeaderText = "Test Header"
Set FirstCell = Range("A1")

' initialize the counter
HeaderInstances = 0

' loop through the rows, removing extra header lines
For i = 0 To FirstCell.CurrentRegion.Rows.Count
    ' check if header text starts the specific cell
    If CommonHeaderText = Left(FirstCell.Offset(i), Len(CommonHeaderText)) Then
        HeaderInstances = HeaderInstances + 1
        ' remove the desired rows if this is this isn't the first instance of the header text
        If HeaderInstances > 1 Then
            ' remove 10 sequential rows, starting 3 rows before the header row
            DeletionRowString = i - 2 & ":" & i + 7
            Rows(DeletionRowString).Delete Shift:=xlUp
        End If
    End If
Next i

End Sub

请注意,如果有空行,FirstCell.CurrentRegion.Rows.Count 将无法正常工作。你可以做一些聪明的事情,或者只是硬编码一个足够大的整数,因为这不是计算密集型的。

于 2013-11-07T20:36:28.327 回答
0

只需在运行灭菌代码之前将初始标题预读到缓冲区中以保留它以忽略其余页标题。如果您知道标题是 10 行,那么您可以预缓冲前 10 行。即使标题记录是可变长度的,您也只需要预先缓冲,直到到达您识别为数据而不是标题行的第一行。所以基本上(在伪代码中):

    currLine = readLine(inputFile)

    do while not isData(currLine) {          
    \\ isData(string) would compare the string to criteria you identify as a data record
        fileBuffer = fileBuffer + currLine   \\ Add the header line to the string buffer for the file
        currLine = readLine(inputFile)  \\ Read the next line
    }

   \\ At this point you've segregated the one header that you want 
   \\ so read the rest of the file

    do while not endOfFile(inputFile) {
        if isData(currLine) {
        \\ Add the line to the buffer only if it appears to be a data line
           fileBuffer = fileBuffer + currLine
        }
        currLine = readLine(inputFile) \\ Read the next line
    }

    \\ Actually, the way this is formatted, you'd have to handle the 
    \\ last line after the loop exits but that can be averted in VB 
    \\ by handling the loop conditions at the end

或者,如果您不想先将整个文件读入缓冲区,而是希望将您想要的行直接发送到报告中,您可以使用布尔标志来识别您是否已经读取了初始标题...因此,例如,您将标志设置为假,然后在读取第一条数据行后,将其设置为真......在此期间,您有条件地向报告中发送标志是否为假或该行是数据。

于 2013-11-07T20:02:57.550 回答