首先糯钙,這些操作也許不是最佳的辦法粪狼,但都是經(jīng)過實操能夠?qū)崿F(xiàn)的。本科一個學(xué)院院長說的好超营,老外搞研究不一定會尋求最好的辦法鸳玩,只要這個辦法能夠?qū)崿F(xiàn)那就夠了,就可以繼續(xù)往下走演闭,我們畢竟不是專門研究方法學(xué)的不跟,也不可以尋求流程優(yōu)化,更多時候只要能解決問題就足夠了米碰,不需要走捷徑窝革,至少不用刻意追求最短距離。
我這里的文字多來自實際的科研生活需求吕座,這里比如我們研究泛癌中的差異基因虐译,以轉(zhuǎn)錄組為例吴趴,想探究一下不同癌種共有的差異基因或特有的癌基因漆诽,以作進(jìn)一步的機(jī)制挖掘或biomarker開發(fā)。那么兰英,當(dāng)我們得到一堆基因之后,可能是多個excel文件楞捂,這些excel文件具有相同的表頭薄坏,因此需要合并它們?yōu)橐粋€文件
。再比如寨闹,同一單位中多個員工匯報工作時交上來的表格胶坠,領(lǐng)導(dǎo)想進(jìn)行簡單的統(tǒng)計分析,如看一下最大值鼻忠、最小值涵但、中位數(shù)、眾數(shù)等等帖蔓,也會用到這種場景。
1.把多個csv或xls合并成單個表頭相同的多行文件
首先瞳脓,如果你收集到的是csv格式的文件塑娇,是最好的
,xls格式也可以劫侧,把它們放到一個文件夾埋酬,然后新建一個文本文件,編輯內(nèi)容為“Copy *.csv combine.csv”
烧栋,保存文件名為"合并.bat"
(即批處理文件)写妥,如果是xls文件則改寫為“Copy *.xls combine.xls”
(實踐證明文件名如果設(shè)置為中文則不識別,所以用了“combine”)审姓,雙擊bat文件即可快速合并珍特。
那么,如果收集到的不是csv和xls格式魔吐,而是xlsx扎筒,那也沒關(guān)系,可以通過格式轉(zhuǎn)換為csv酬姆。我一開始想的是批量轉(zhuǎn)換文件名嗜桌,結(jié)果發(fā)現(xiàn),轉(zhuǎn)了之后沒有用辞色,說明不能通過單純修改后綴名的方法來解決骨宠。
2.關(guān)于把xlsx轉(zhuǎn)換為csv格式,這里介紹一種方法——
同樣把所有文件放到一個新建文件夾中(保險起見最好是英文路徑),同時在文件夾中新建一個excel文件层亿,打開該文件桦卒,按ALT+F11鍵或右擊sheet1工作表標(biāo)簽調(diào)出vb界面,“插入”》“模塊”棕所,粘貼以下代碼:
Sub SaveToCSVs()
Dim fDir As String
Dim wB As Workbook
Dim wS As Worksheet
Dim fPath As String
Dim sPath As String
fPath = "C:\Users\ms-off1\Desktop\temp\"
sPath = "C:\Users\ms-off1\Desktop\temp\"
fDir = Dir(fPath)
Do While (fDir <> "")
If Right(fDir, 4) = ".xls" Or Right(fDir, 5) = ".xlsx" Then
On Error Resume Next
Set wB = Workbooks.Open(fPath & fDir)
'MsgBox (wB.Name)
For Each wS In wB.Sheets
wS.SaveAs sPath & wB.Name & ".csv", xlCSV
Next wS
wB.Close False
Set wB = Nothing
End If
fDir = Dir
On Error GoTo 0
Loop
End Sub
其中闸盔,fPath 定義了存放Excel文件的路徑,sPath定義了csv文件的輸出位置琳省,根據(jù)個人情況進(jìn)行修改迎吵,不要忘記路徑最后的左斜線。上面的代碼也可以實現(xiàn)從xls到csv格式的轉(zhuǎn)換针贬。
到這里再重復(fù)上面的操作即可完成多個文件合并击费,故事就講完了。不過既然折騰桦他,那就多折騰一波:
3.怎么反過來把csv批量轉(zhuǎn)換成xlsx呢蔫巩?
同樣的操作,輸入下面代碼:
Sub CAVToXLSX()
Dim fDir As String
Dim wB As Workbook
Dim wS As Worksheet
Dim fPath As String
Dim sPath As String
fPath = "C:\Users\Micro\Desktop\source\"
sPath = "C:\Users\Micro\Desktop\target\"
fDir = Dir(fPath)
Do While (fDir <> "")
If Right(fDir, 4) = ".csv" Or Right(fDir, 5) = ".csv" Then
On Error Resume Next
Set wB = Workbooks.Open(fPath & fDir)
'MsgBox (wB.Name)
For Each wS In wB.Sheets
wS.SaveAs sPath & wB.Name & ".xlsx" _
, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Next wS
wB.Close False
Set wB = Nothing
End If
fDir = Dir
On Error GoTo 0
Loop
End Sub
同樣要注意修改文件路徑快压。
關(guān)于轉(zhuǎn)換xlsx到csv 文件和轉(zhuǎn)換csv到xlsx文件圆仔,對應(yīng)的也有人提供了python代碼,現(xiàn)在我還不會蔫劣,姑且不用坪郭。
4.下面的小技巧是關(guān)于多個excel文件的合并,這種需求不是很多脉幢,可能有時候領(lǐng)導(dǎo)想看一批數(shù)據(jù)歪沃,又不想一個一個打開的時候,就用到啦嫌松。
這種情況下沪曙,你拿到很多個excel文件,也可能是csv文件萎羔,需要快速合成為一個文件液走,每個csv變成合成后文件中的一個sheet,sheet名為原來的文件名外驱。同樣可以利用VB編寫的宏來實現(xiàn)育灸,前面的操作都一樣(把所有文件放到一個新建文件夾,在里面新建excel文件昵宇,打開excel文件磅崭,調(diào)出vb窗口并新建模塊)代碼如下:
'功能:把多個excel工作簿的第一個sheet工作表合并到一個excel工作簿的多個sheet工作表,新工作表的名稱等于原工作簿的名稱
Sub Books2Sheets()
'定義對話框變量
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
'新建一個工作簿
Dim newwb As Workbook
Set newwb = Workbooks.Add
With fd
If .Show = -1 Then
'定義單個文件變量
Dim vrtSelectedItem As Variant
'定義循環(huán)變量
Dim i As Integer
i = 1
'開始文件檢索
For Each vrtSelectedItem In .SelectedItems
'打開被合并工作簿
Dim tempwb As Workbook
Set tempwb = Workbooks.Open(vrtSelectedItem)
'復(fù)制工作表
tempwb.Worksheets(1).Copy Before:=newwb.Worksheets(i)
'把新工作簿的工作表名字改成被復(fù)制工作簿文件名瓦哎,這兒應(yīng)用于xls文件砸喻,即Excel97-2003的文件柔逼,如果是Excel2007,需要改成xlsx
newwb.Worksheets(i).Name = VBA.Replace(tempwb.Name, ".xls", "")
'關(guān)閉被合并工作簿
tempwb.Close SaveChanges:=False
i = i + 1
Next vrtSelectedItem
End If
End With
Set fd = Nothing
End Sub
這時候點擊“運(yùn)行”按鈕割岛,或者按F5運(yùn)行的時候回彈出窗口讓你選擇文件愉适,你應(yīng)選擇要合并的多個文件,而不是新建的excel文件癣漆,就可以了维咸。你有幾個文件,就會閃幾下惠爽,最后全部合并完成(如果有十來個還好癌蓖,如果上百個,最好還是每10個或20個合并成一個吧婚肆,不然就算合并了一個個的點sheet也會很費(fèi)勁)
5.既然多個文件可以合并成多sheet的單個文件租副,那么反過來,如果一個excel文件有多個sheet较性,也可以拆分成多個單獨的文件用僧,每個文件只有一個sheet,文件名為sheet名赞咙,
用以下代碼(----拆分后格式為xlsx):
Sub SplitWorkbook()
Dim workbookPath As String
workbookPath = Application.ActiveWorkbook.Path
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each wSheet In ThisWorkbook.Sheets
wSheet.Copy
Application.ActiveWorkbook.SaveAs Filename:=workbookPath & "\" & wSheet.Name & ".xlsx"
Application.ActiveWorkbook.Close False
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
或者
Private Sub 分拆工作表()
Dim sht As Worksheet
Dim MyBook As Workbook
Set MyBook = ActiveWorkbook
For Each sht In MyBook.Sheets
sht.Copy
ActiveWorkbook.SaveAs Filename:=MyBook.Path & "\" & sht.Name, FileFormat:=xlOpenXMLWorkbook '將工作簿另存為xlsx格式
ActiveWorkbook.Close
Next
MsgBox "文件已經(jīng)被分拆完畢!"
End Sub
以上參考:
https://jingyan.baidu.com/article/3a2f7c2ea4809866afd611ed.html
https://jingyan.baidu.com/article/ca2d939d767a16eb6c31ce85.html
https://www.51wikihow.com/excel/how-to-split-workbooks-into-separate-files-in-excel.html
https://www.zhihu.com/question/39234324
https://blog.csdn.net/Gipsy_Danger/article/details/80142396
https://www.sohu.com/a/276904119_367376
6.此外责循,一開始提到的批量修改文件名,
這個給你可能更常用攀操,方法也很簡單沼死,用excel完成:
在C盤新建一個temp文件夾(以后都在該文件夾下完成,養(yǎng)成好習(xí)慣)崔赌,在里邊新建一個名為“rename”的excel文件,內(nèi)容格式為:
再新建一個名為“ren”的bat文件耸别,里面內(nèi)容格式為(注意沒了表頭):
然后把要修改的文件扔到這個文件夾中健芭,雙擊
bat文件
就可以了。