如何删除另一个Excel文件上的第一行

时间:2019-05-03 06:54:19

标签: excel vba

我想删除用对话框打开的文件的第一行。每个文件只有一张。所以我想删除打开的每个文件的第一张纸上的每一行。

我要这样做的原因是因为我导出了数据库表(我试图显然不使用标头导出),并且为了解析它们,我想删除第一行即标头。

在打开的每个文件上,我调用函数Parsing(),其中提供2个参数:2 Workbook(一个是我用来触发函数的Excel,第二个是在文件夹中找到的每个文件)。

让我知道是否需要提供第一个打开文件的功能,但我认为不需要,因为它可以正常工作。

在打开的每个文件上,我应用以下代码:

Sub Parsing(ByVal wbInit As Workbook, ByVal wb As Workbook)
    Dim sh As Worksheet

    For Each sh In wb.Sheets

        wb.Sheets(1).Rows(1).Delete

        If wb.Name Like "*bpe*" Then
            MsgBox "bpe"
        End If

        If wb.Name Like "*cable*" Then
            MsgBox "cable"
        End If

        If wb.Name Like "*pt*" Then
            MsgBox "pt"
        End If

    Next sh

End Sub

Msgbox可以在这里测试我是否真的打开了文件,它也可以正常工作。

但是,当我重新打开文件时,第一行不会被删除。

这是调用该过程的代码:

Sub ouverture_dossier()
    Dim wbInit, wbExtra As Workbook
    Dim dossier, nomFichier As String

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False

    Set wbInit = Workbooks(wbInitStr)
    Call Initialisation

    Application.FileDialog(msoFileDialogFolderPicker).Show
    dossier = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1) & "\"
    nomFichier = Dir(dossier & "*.xls*")

    Do While nomFichier <> ""
        If Not IsWorkbookOpen(nomFichier) Then
            Workbooks.Open Filename:=dossier & nomFichier
        End If

        Set wbExtra = Workbooks(nomFichier)
        wbExtra.Activate

        Call Parsing(wbInit, wbExtra)

        wbExtra.Close False
        nomFichier = Dir

    Loop

    wbInit.Activate
    Sheets(shBrouillon).Select

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

我想从中学到东西,所以,如有可能,请向我解释我在这里做错了什么,或者我的方法缺乏见识。

3 个答案:

答案 0 :(得分:1)

这将起作用

Private Sub first_line_removal()

    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Rows(1).EntireRow.Delete
    Next ws

End Sub

请注意,应用程序的数字顺序不会改变。我的意思是:当您打开应用程序(除非被隐藏)时,第一行将始终被枚举为[1]

区别在于,删除了前第一行,而将前第二行移到了现在的第一行。


正如@Pᴇʜ在注释中正确指出的那样,显然您需要在关闭工作簿之前保存工作簿,否则更改将丢失。

ThisWorkbook.Save

答案 1 :(得分:1)

您在每个工作表中都有一个循环(请注意,这包括可能存在的所有图表),但是您每次尝试删除工作表1的第一行。

相反,您应该只循环浏览工作表,而不是工作表(以排除尝试从图表中删除行的任何机会),并从该工作表的 中删除第1行。

完成删除阶段后,您应该根据自己的喜好保存文件或保存并关闭。

Sub Parsing(ByVal wbInit As Workbook, ByVal wb As Workbook)

    Dim sh As Worksheet

    For Each sh In wb.Worksheets
        sh.Rows(1).Delete
    Next sh

    'Delete one of the 2 lines below
    wb.Save         'to leave the file open or
    wb.Close True   'to save and close

End Sub

答案 2 :(得分:1)

此行wbExtra.Close False不保存就关闭工作簿!这就是为什么您重新打开文件后所做的更改就消失了。

还请注意,Dim wbInit, wbExtra As Workbook仅声明wbExtra As Workbook,但是wbInit As Variant需要在VBA中为每个变量指定类型:Dim wbInit As Workbook, wbExtra As Workbook

以下内容应该可以工作(不再需要Sub Parsing):

Sub ouverture_dossier()
    'every variable needs a type not only the last one!
    Dim wbInit As Workbook, wbExtra As Workbook
    Dim dossier As String, nomFichier As String

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False

    Set wbInit = Workbooks(wbInitStr)
    Call Initialisation

    Application.FileDialog(msoFileDialogFolderPicker).Show
    dossier = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1) & "\"
    nomFichier = Dir(dossier & "*.xls*")

    Do While nomFichier <> ""
        If Not IsWorkbookOpen(nomFichier) Then
            Workbooks.Open Filename:=dossier & nomFichier
        End If

        Set wbExtra = Workbooks(nomFichier)
        wbExtra.Activate

        wbExtra.Sheets(1).Rows(1).Delete 'thats all you need
        'Call Parsing(wbInit, wbExtra) 'you don't need that anymore

        wbExtra.Close SaveChanges:=True 'you need to save the changes
        nomFichier = Dir

    Loop

    wbInit.Activate
    Sheets(shBrouillon).Select

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

End Sub