各位論壇的先進大家好,小弟從學習vba語法以來將近有半個月的時間了,目的是為了設計一套成績計算系統。多虧論壇上多位熱心人士的幫忙,得以解決許多問題。也因為如此,所以有些語法一知半解。有勞各位熱心的大大出手相助。
小弟最近遇到了一個問題,原本我已經寫好了語法,目的是保護sheet2和sheet3的部分資料,而且前幾天也已經執行成功,可是今天又執行時,卻又出現了錯誤訊息「物件不支援此屬性或方法」而此列反黃 .Selection.Locked = True 老實說,我也不知哪裡出錯,所以來這兒尋求協助,是不是自己有些盲點沒發現。
語法
Sub Worksheet_Activate()
With Worksheets("期中評量")
.Range("A1:v2").Select
.Range("a3", cells(3, 1).End(xlDown)).Select
.Selection.Locked = True
.Selection.FormulaHidden = True
.ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End With
End Sub
Sub Worksheet_Deactivate()
With Worksheets("期中評量")
.cells.Select
.Selection.Locked = False
.Selection.FormulaHidden = True
.ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End With
End Sub作者: kevin681024 時間: 2012-8-21 14:09
抱歉!有勞兩位又讓小弟上了一課。原來發現是自己的問題。問題在這裡,為了保護成績單的標題列,所以我寫了(當然是兩位修正的)下列語法:
Option Explicit
Sub Worksheet_Activate()
With Worksheets("期中成績")
.Activate
.Range("b1").Select
.Range("A3:j3").Select
.Range("a5", .cells(5, 1).End(xlDown)).Select
Selection.Locked = True
Selection.FormulaHidden = True
.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=6323
End With
End Sub
但是成績單的號碼列必須跟隨基本資料欄(就是填班級、人數就會自動出現所有座號)這時語法就會出現錯誤,因為無法更動。所以我又寫了
Sub Worksheet_Deactivate()
Worksheets("期中成績").Unprotect
End Sub
但是這樣的話,一離開這個工作表,訊息列就會問我解開的密碼,所以:1.該怎麼解決呢?2.或是有其他可以保護標題列的語法嗎?(又要麻煩了)作者: skyutm 時間: 2012-8-21 23:01
'與考人數'
Dim aa As Integer, bb As Integer, cc As Integer, dd As Integer, ee As Integer
aa = Worksheets("期中評量").Range("c3", Range("c3").End(xlDown)).SpecialCells(xlCellTypeConstants, xlNumbers).Count
bb = Worksheets("期中評量").Range("d3", Range("d3").End(xlDown)).SpecialCells(xlCellTypeConstants, xlNumbers).Count
cc = Worksheets("期中評量").Range("e3", Range("e3").End(xlDown)).SpecialCells(xlCellTypeConstants, xlNumbers).Count
dd = Worksheets("期中評量").Range("f3", Range("f3").End(xlDown)).SpecialCells(xlCellTypeConstants, xlNumbers).Count
ee = Worksheets("期中評量").Range("g3", Range("g3").End(xlDown)).SpecialCells(xlCellTypeConstants, xlNumbers).Count
Worksheets("期中統計").Range("d4").Value = aa
Worksheets("期中統計").Range("h4").Value = bb
Worksheets("期中統計").Range("l4").Value = cc
Worksheets("期中統計").Range("p4").Value = dd
Worksheets("期中統計").Range("t4").Value = ee作者: GBKEE 時間: 2012-8-26 06:12
抱歉!分享一下,我想出來的語法是這樣,結果試了也沒問題。
Sub Worksheet_Activate()
'個人成績單標題列↓'
Dim a, b, c, x, y
a = Sheets("基本設定").Range("j1").Value
b = Sheets("基本設定").Range("j2").Value
c = Sheets("基本設定").Range("j3").Value
d = Fix(c / 2)
For i = 0 To d
x = Sheets("期中評量").Range("a" & 3 + i * 2).Value
y = Sheets("期中評量").Range("b" & 3 + i * 2).Value
x1 = Sheets("期中評量").Range("a" & 4 + i * 2).Value
y1 = Sheets("期中評量").Range("b" & 4 + i * 2).Value
Sheets("期中成績單").Range("a" & 1 + 12 * i).Value = a & "年" & b & "班 期中評量 成績單" & "(" & x & ")" & y
Sheets("期中成績單").Range("o" & 1 + 12 * i).Value = a & "年" & b & "班 期中評量 成績單" & "(" & x1 & ")" & y1
Next i
'個人成績單標題列↑'
End Sub作者: luhpro 時間: 2012-9-8 09:29
回復 21#skyutm
善用 With 與 縮排(次一級區塊內的程式左方多幾個空格) 會讓程式更容易閱讀與維護:
Sub Worksheet_Activate()
'個人成績單標題列↓'
Dim a, b, c, x, y
With Sheets("基本設定")
a = .Range("j1").Value
b = .Range("j2").Value
c = .Range("j3").Value
End With
d = Fix(c / 2)
For i = 0 To d
With Sheets("期中評量")
x = .Range("a" & 3 + i * 2).Value
y = .Range("b" & 3 + i * 2).Value
x1 = .Range("a" & 4 + i * 2).Value
y1 = .Range("b" & 4 + i * 2).Value
End With
With Sheets("期中成績單")
.Range("a" & 1 + 12 * i).Value = a & "年" & b & "班 期中評量 成績單" & "(" & x & ")" & y