Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除另一个Excel文件上的第一行_Excel_Vba - Fatal编程技术网

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

如何删除另一个Excel文件上的第一行,excel,vba,Excel,Vba,我想删除用对话框打开的第一行文件。每个文件只有一张纸。所以我想删除打开的每个文件的第一页上的每一行 我之所以要这样做,是因为我导出了db表(显然我试图不使用header导出),为了解析它们,我想删除第一行,即header 在每个打开的文件上,我调用我的函数Parsing(),其中我提供了两个参数:2Workbook(一个是我用来启动函数的Excel,第二个是在文件夹中找到的每个文件) 如果需要提供第一个打开文件的功能,请告诉我,但我认为不需要,因为它工作正常 在打开的每个文件上,我应用以下代码:

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

我之所以要这样做,是因为我导出了db表(显然我试图不使用header导出),为了解析它们,我想删除第一行,即header

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

如果需要提供第一个打开文件的功能,请告诉我,但我认为不需要,因为它工作正常

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

子解析(ByVal wbInit作为工作簿,ByVal wb作为工作簿)
将sh设置为工作表
对于wb.表中的每个sh
工作分解表(1).行(1).删除
如果wb.Name像“*bpe*”那么
MsgBox“bpe”
如果结束
如果wb.名称像“*电缆*”那么
MsgBox“电缆”
如果结束
如果wb.Name像“*pt*”那么
MsgBox“pt”
如果结束
下一个sh
端接头
Msgbox
es是用来测试我是否真的打开了文件,它也可以正常工作

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

以下是调用该过程的代码:

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
Sub-ouverture_档案()
Dim wbInit,wbExtra作为工作簿
模糊档案,名称为字符串
Application.DisplayAlerts=False
Application.ScreenUpdating=False
Set wbInit=工作簿(wbInitStr)
呼叫初始化
Application.FileDialog(msoFileDialogFolderPicker).Show
dossier=Application.FileDialog(msoFileDialogFilePicker)。选择editems(1)和“\”
nomFichier=Dir(档案和“*.xls*”)
当nomFichier“”时执行
如果工作簿未打开(nomFichier),则
工作簿。打开文件名:=档案和文件名
如果结束
Set wbExtra=工作簿(nomFichier)
wbExtra。激活
调用解析(wbInit、wbExtra)
wbExtra。关闭False
nomFichier=Dir
环
wbInit.Activate
工作表(shBrouillon)。选择
Application.DisplayAlerts=True
Application.ScreenUpdating=True
端接头
我想从中吸取教训,因此,如果可能的话,请向我解释我在这里做错了什么,或者我的方法是否缺乏洞察力。

这将奏效

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行

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

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

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

另请注意,
Dim wbInit,wbetra As Workbook
仅声明
wbetra As Workbook
wbInit As Variant
您需要为VBA中的每个变量指定一个类型:
Dim wbInit As Workbook,wbetra As Workbook

以下应该可以工作(
子解析
不再需要):

Sub-ouverture_档案()
'每个变量都需要一个类型,而不仅仅是最后一个!
将wbInit设置为工作簿,wbExtra设置为工作簿
Dim档案作为字符串,nomFichier作为字符串
Application.DisplayAlerts=False
Application.ScreenUpdating=False
Set wbInit=工作簿(wbInitStr)
呼叫初始化
Application.FileDialog(msoFileDialogFolderPicker).Show
dossier=Application.FileDialog(msoFileDialogFilePicker)。选择editems(1)和“\”
nomFichier=Dir(档案和“*.xls*”)
当nomFichier“”时执行
如果工作簿未打开(nomFichier),则
工作簿。打开文件名:=档案和文件名
如果结束
Set wbExtra=工作簿(nomFichier)
wbExtra。激活
wbetra.Sheets(1).行(1).删除“这是您所需要的全部”
'调用解析(wbInit,wbExtra)'您不再需要它了
wbExtra.Close SaveChanges:=True'您需要保存更改
nomFichier=Dir
环
wbInit.Activate
工作表(shBrouillon)。选择
Application.DisplayAlerts=True
Application.ScreenUpdating=True
端接头

实际上,此
wb.Sheets(1).Rows(1).Delete
仅删除第一张工作表中的第一行。而且它会重复执行,频率与现有图纸的数量相同(因为您的循环)。因此,如果工作簿中有5张工作表,则会删除第一张工作表中的5行删除后是否保存工作簿?我们看不到这一点,因为您没有显示其他程序。另一个投票支持保存这本书。我认为它被省略了。实际上,您不能删除Excel文件的第一行。您只需删除Excel文件中工作表的第一行即可。因此,您应该回答您的问题,并更精确地说明您的措辞,使您的问题更具体,并告知您要在工作簿的哪一页删除第一行。@LyessD您没有回答我的问题:“删除后是否保存了工作簿?”请包括调用您显示的过程的代码。@LyessD所以在这里
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