我想删除用对话框打开的文件的第一行。每个文件只有一张。所以我想删除打开的每个文件的第一张纸上的每一行。
我要这样做的原因是因为我导出了数据库表(我试图显然不使用标头导出),并且为了解析它们,我想删除第一行即标头。
在打开的每个文件上,我调用函数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
我想从中学到东西,所以,如有可能,请向我解释我在这里做错了什么,或者我的方法缺乏见识。
答案 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
请注意,excel应用程序的数字顺序不会改变。我的意思是:当您打开应用程序(除非被隐藏)时,第一行将始终被枚举为[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