合并Excel工作薄中成績表的VBA代碼,非常適合教育一線的朋友
更新時間:2009年04月09日 12:25:58 作者:
每次學(xué)生考試,評分完畢之后,把每個科的成績收集起來,就得到了一個有若干工作表,每個表有學(xué)生學(xué)號、分?jǐn)?shù)等列的Excel工作薄。
這時候還需要把各個工作表合并到一起來形成一個匯總表。這時候比較麻煩也比較容易出錯,因為各個表的學(xué)號不一定都是一致的、對齊的。因為可能會有人缺考,有人會考號涂錯等等。特奉獻以下代碼,用于合并學(xué)生成績表或者其它類似的表都可以。本代碼特點在于不需要使用SQL或者Access等大頭軟件,只需要Excel就可以執(zhí)行,非常方便,速度也不慢。轉(zhuǎn)載請勿清除廣告。
沒有合適的局域網(wǎng)管理軟件嗎?你的網(wǎng)管工具夠靈活夠高效嗎?看看這個network management software。
' =============================================
' 合并總表時,不參加計算的表格數(shù)目
' 因為一般合并的總表放在最后一個工作表,要排除掉這個表。
Const ExcludeSheetCount = 1
' 主函數(shù),因為用到了ADO,必須作如下引用才能運行本代碼。
' 工具>引用, 引用ADO(Microsoft ActiveX Data Objects 2.X Library)
' 鏈接所有sheet到一個總表
' 要合并的表的第一行必須是字段名稱,不能是合并單元格
Sub SQL_ADO_EXCEL_JOIN_ALL()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim i, k, shCount As Integer
Dim SQL, SQL2 As String, cnnStr As String
Dim s1, s2, s3, tmp As String
Dim ws As Worksheet
Const IDIdx = 1
Const ScoreIdx = 3
shCount = ActiveWorkbook.Sheets.Count
' 獲取所有考號
' EXCEL 會自動去除重復(fù)數(shù)據(jù)
' SQL = "(select ID from [語文$]) union (select ID from [英語$]) union (select ID from [物理$]) order by ID"
SQL = ""
For i = 1 To shCount - ExcludeSheetCount
s1 = "(SELECT ID FROM [" & Sheets(i).Name & "$])"
If i = 1 Then
SQL = s1
Else
SQL = SQL & " UNION " & s1
End If
Next
'MsgBox SQL
Set ws = ActiveWorkbook.Sheets(shCount)
cnnStr = "provider = microsoft.jet.oledb.4.0;Extended Properties='Excel 8.0;HDR=yes;IMEX=1';data source=" & ThisWorkbook.FullName
cnn.CursorLocation = adUseClient
cnn.ConnectionString = cnnStr
cnn.Open
rs.Open SQL, cnn, adOpenKeyset, adLockOptimistic
ws.Activate
ws.Cells.Clear
For i = 1 To rs.Fields.Count
ws.Cells(1, i) = rs.Fields(i - 1).Name
Next
ws.Range("A2").CopyFromRecordset rs
For i = 1 To shCount - ExcludeSheetCount
Sheets(shCount).Cells(1, i + 1) = Sheets(i).Name
Next
'EXCEL 不支持 UPDATE
'SQL = "update [合并$] set 語文 = '1'"
' 相當(dāng)于內(nèi)聯(lián)接
'SQL = "select tt.ID,ta.score as 語文,tb.score as 英語 from [合并$] AS tt, [語文$] as ta, [英語$] as tb "
'SQL = SQL & "where (tt.ID = ta.ID) and (tt.ID = tb.ID)"
' 左聯(lián)接所有表格
' 通過測試的語句
'SQL = "select tt.ID,ta.score AS 語文,tb.score as 英語 from ([合并$] AS tt left join [語文$] as ta on tt.ID = ta.ID) "
'SQL = SQL & "left join [英語$] as tb on tt.ID = tb.ID"
SQL2 = "([" & Sheets(shCount).Name & "$] AS tt LEFT JOIN [" & Sheets(1).Name & "$] AS t1 ON tt.id=t1.id) "
SQL = "SELECT tt.ID,"
For i = 1 To shCount - ExcludeSheetCount
tmp = "t" & i
SQL = SQL & tmp & ".score AS " & Sheets(i).Name
If i < shCount - ExcludeSheetCount Then SQL = SQL & ", "
If i > 1 Then
SQL2 = "(" & SQL2 & " LEFT JOIN [" & Sheets(i).Name & "$] AS " & tmp & " ON tt.id=" & tmp & ".id)"
End If
Next
s1 = SQL & " FROM " & SQL2 & " ORDER BY tt.ID"
MsgBox s1
rs.Close
rs.Open s1, cnn, adOpenKeyset, adLockOptimistic
' 清除表格
ws.Activate
Cells.Select
Selection.Delete Shift:=xlUp
For i = 1 To rs.Fields.Count
ws.Cells(1, i) = rs.Fields(i - 1).Name
Next
ws.Range("A2").CopyFromRecordset rs
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
Call AddHeader
Call FindBlankCells
Call TableBorderSet
ws.Columns(1).AutoFit
ws.Cells(2, 1).Select
MsgBox "Finished."
End Sub
' 在表格第一行插入行,然后合并單元格,加上說明文字
Sub AddHeader()
Dim ws As Worksheet
Dim s1, s2 As String
shCount = ActiveWorkbook.Sheets.Count
Set ws = Sheets(shCount)
Column = ws.UsedRange.Columns.Count
ws.Rows(1).Insert
s1 = Chr(Asc("A") + Column - 1)
s2 = "A1:" & s1 & "1"
ws.Range(s2).Merge
ws.Rows(1).RowHeight = 100
s1 = "說明" & Chr(13) & Chr(10) & _
"本總表為計算生成,把幾個單科的客觀題成績合并在一起,避免手工處理時因考號不對齊而導(dǎo)致錯位。" & Chr(13) & Chr(10) & _
"注意:如果某單科成績表中存在相同考號,則總表中該考號的該科成績是不準(zhǔn)確的。" & Chr(13) & Chr(10) & _
"填涂錯誤的考號,一般出現(xiàn)在表里頂端或底端"
ws.Cells(1, 1) = s1
ActiveSheet.Rows(1).RowHeight = 80
' 凍結(jié)窗格
ActiveSheet.Rows(3).Select
ActiveWindow.FreezePanes = True
ActiveWindow.SmallScroll Down:=0
End Sub
' 設(shè)置表格邊框
Sub TableBorderSet()
ActiveSheet.UsedRange.Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End Sub
' 標(biāo)記無分?jǐn)?shù)的單元格,方便找出答題卡沒有分?jǐn)?shù)的學(xué)生
Sub FindBlankCells()
Dim i, j, row, col As Integer
'ActiveSheet.Cells(2, 1).Interior.ColorIndex = 15
row = ActiveSheet.UsedRange.Rows.Count
col = ActiveSheet.UsedRange.Columns.Count
For i = 2 To row
For j = 2 To col
If IsEmpty(ActiveSheet.Cells(i, j).Value) Then
ActiveSheet.Cells(i, j).Interior.ColorIndex = 15
End If
Next
Next
End Sub
沒有合適的局域網(wǎng)管理軟件嗎?你的網(wǎng)管工具夠靈活夠高效嗎?看看這個network management software。
' =============================================
' 合并總表時,不參加計算的表格數(shù)目
' 因為一般合并的總表放在最后一個工作表,要排除掉這個表。
Const ExcludeSheetCount = 1
' 主函數(shù),因為用到了ADO,必須作如下引用才能運行本代碼。
' 工具>引用, 引用ADO(Microsoft ActiveX Data Objects 2.X Library)
' 鏈接所有sheet到一個總表
' 要合并的表的第一行必須是字段名稱,不能是合并單元格
Sub SQL_ADO_EXCEL_JOIN_ALL()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim i, k, shCount As Integer
Dim SQL, SQL2 As String, cnnStr As String
Dim s1, s2, s3, tmp As String
Dim ws As Worksheet
Const IDIdx = 1
Const ScoreIdx = 3
shCount = ActiveWorkbook.Sheets.Count
' 獲取所有考號
' EXCEL 會自動去除重復(fù)數(shù)據(jù)
' SQL = "(select ID from [語文$]) union (select ID from [英語$]) union (select ID from [物理$]) order by ID"
SQL = ""
For i = 1 To shCount - ExcludeSheetCount
s1 = "(SELECT ID FROM [" & Sheets(i).Name & "$])"
If i = 1 Then
SQL = s1
Else
SQL = SQL & " UNION " & s1
End If
Next
'MsgBox SQL
Set ws = ActiveWorkbook.Sheets(shCount)
cnnStr = "provider = microsoft.jet.oledb.4.0;Extended Properties='Excel 8.0;HDR=yes;IMEX=1';data source=" & ThisWorkbook.FullName
cnn.CursorLocation = adUseClient
cnn.ConnectionString = cnnStr
cnn.Open
rs.Open SQL, cnn, adOpenKeyset, adLockOptimistic
ws.Activate
ws.Cells.Clear
For i = 1 To rs.Fields.Count
ws.Cells(1, i) = rs.Fields(i - 1).Name
Next
ws.Range("A2").CopyFromRecordset rs
For i = 1 To shCount - ExcludeSheetCount
Sheets(shCount).Cells(1, i + 1) = Sheets(i).Name
Next
'EXCEL 不支持 UPDATE
'SQL = "update [合并$] set 語文 = '1'"
' 相當(dāng)于內(nèi)聯(lián)接
'SQL = "select tt.ID,ta.score as 語文,tb.score as 英語 from [合并$] AS tt, [語文$] as ta, [英語$] as tb "
'SQL = SQL & "where (tt.ID = ta.ID) and (tt.ID = tb.ID)"
' 左聯(lián)接所有表格
' 通過測試的語句
'SQL = "select tt.ID,ta.score AS 語文,tb.score as 英語 from ([合并$] AS tt left join [語文$] as ta on tt.ID = ta.ID) "
'SQL = SQL & "left join [英語$] as tb on tt.ID = tb.ID"
SQL2 = "([" & Sheets(shCount).Name & "$] AS tt LEFT JOIN [" & Sheets(1).Name & "$] AS t1 ON tt.id=t1.id) "
SQL = "SELECT tt.ID,"
For i = 1 To shCount - ExcludeSheetCount
tmp = "t" & i
SQL = SQL & tmp & ".score AS " & Sheets(i).Name
If i < shCount - ExcludeSheetCount Then SQL = SQL & ", "
If i > 1 Then
SQL2 = "(" & SQL2 & " LEFT JOIN [" & Sheets(i).Name & "$] AS " & tmp & " ON tt.id=" & tmp & ".id)"
End If
Next
s1 = SQL & " FROM " & SQL2 & " ORDER BY tt.ID"
MsgBox s1
rs.Close
rs.Open s1, cnn, adOpenKeyset, adLockOptimistic
' 清除表格
ws.Activate
Cells.Select
Selection.Delete Shift:=xlUp
For i = 1 To rs.Fields.Count
ws.Cells(1, i) = rs.Fields(i - 1).Name
Next
ws.Range("A2").CopyFromRecordset rs
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
Call AddHeader
Call FindBlankCells
Call TableBorderSet
ws.Columns(1).AutoFit
ws.Cells(2, 1).Select
MsgBox "Finished."
End Sub
' 在表格第一行插入行,然后合并單元格,加上說明文字
Sub AddHeader()
Dim ws As Worksheet
Dim s1, s2 As String
shCount = ActiveWorkbook.Sheets.Count
Set ws = Sheets(shCount)
Column = ws.UsedRange.Columns.Count
ws.Rows(1).Insert
s1 = Chr(Asc("A") + Column - 1)
s2 = "A1:" & s1 & "1"
ws.Range(s2).Merge
ws.Rows(1).RowHeight = 100
s1 = "說明" & Chr(13) & Chr(10) & _
"本總表為計算生成,把幾個單科的客觀題成績合并在一起,避免手工處理時因考號不對齊而導(dǎo)致錯位。" & Chr(13) & Chr(10) & _
"注意:如果某單科成績表中存在相同考號,則總表中該考號的該科成績是不準(zhǔn)確的。" & Chr(13) & Chr(10) & _
"填涂錯誤的考號,一般出現(xiàn)在表里頂端或底端"
ws.Cells(1, 1) = s1
ActiveSheet.Rows(1).RowHeight = 80
' 凍結(jié)窗格
ActiveSheet.Rows(3).Select
ActiveWindow.FreezePanes = True
ActiveWindow.SmallScroll Down:=0
End Sub
' 設(shè)置表格邊框
Sub TableBorderSet()
ActiveSheet.UsedRange.Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End Sub
' 標(biāo)記無分?jǐn)?shù)的單元格,方便找出答題卡沒有分?jǐn)?shù)的學(xué)生
Sub FindBlankCells()
Dim i, j, row, col As Integer
'ActiveSheet.Cells(2, 1).Interior.ColorIndex = 15
row = ActiveSheet.UsedRange.Rows.Count
col = ActiveSheet.UsedRange.Columns.Count
For i = 2 To row
For j = 2 To col
If IsEmpty(ActiveSheet.Cells(i, j).Value) Then
ActiveSheet.Cells(i, j).Interior.ColorIndex = 15
End If
Next
Next
End Sub
您可能感興趣的文章:
- VBA中操作Excel常用方法總結(jié)
- Excel VBA連接并操作Oracle
- excel vba 高亮顯示當(dāng)前行代碼
- excel vba 限制工作表的滾動區(qū)域代碼
- 用vba實現(xiàn)將記錄集輸出到Excel模板
- Python + selenium + requests實現(xiàn)12306全自動搶票及驗證碼破解加自動點擊功能
- python requests包的request()函數(shù)中的參數(shù)-params和data的區(qū)別介紹
- python:解析requests返回的response(json格式)說明
- 基于python requests selenium爬取excel vba過程解析
相關(guān)文章
Django中使用Celery執(zhí)行定時任務(wù)問題
這篇文章主要介紹了Django中使用Celery執(zhí)行定時任務(wù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11使用Pandas實現(xiàn)清洗客戶編碼異常數(shù)據(jù)
在不同行業(yè)中,我們經(jīng)常會遇到一個麻煩的問題:數(shù)據(jù)清洗,尤其是當(dāng)我們需要處理客戶編碼異常數(shù)據(jù)時,下面小編就來和大家分享一下常用的解決辦法吧2023-07-07Python大數(shù)據(jù)用Numpy Array的原因解讀
一個Numpy數(shù)組由許多值組成,所有值的類型是相同的,Numpy 是Python科學(xué)計算的一個核心模塊,本文重點給大家介紹Python大數(shù)據(jù)Numpy Array的相關(guān)知識,感興趣的朋友一起看看吧2022-02-02