У меня есть серия защищенных рабочих листов, которые используются для сбора данных об оценке учеников.Они заблокированы, чтобы пользователи не могли удалять формулы или вызывать другие проблемы, поэтому мне нужно иметь возможность добавлять новые записи в электронную таблицу / базу данных, используя форму пользователя.
Я скомпилировал следующий код, используя советы из других вопросов, имои (растущие) знания VBA, однако мои знания все еще находятся в зачаточном состоянии!
Когда я пытаюсь запустить код, я получаю ошибку «Требуется объект» в строке .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).Select
, как указано.Я подумал, что определил и указал объект как Sh
, используя строку With Sh
- это не так?
Я включил комментарии в код, чтобы попытаться объяснить, чего я пытаюсь достичь,Кто-нибудь может пролить свет на то, что я делаю здесь неправильно, пожалуйста?
Private Sub cmbAdd_Click()
Dim Sh As Variant
Dim l As Long
Dim LastRow As Long
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
'ActiveSheet.Unprotect Password:="L1lyL1ly"
' IF THERE ARE MORE THAN 103 RECORDS, ADD A NEW ROW AND COPY FORMAT AND FORMULAE
For Each Sh In Array("Pupil Data", "RWM", "Art", "Computing", "Design Technology", "Geography", "History_", "MFL", "Music", "PE", "RE", "Science", "Bookbands", "KS1 - TRP")
' Use the current worksheet
With Sh
' !!!!!!!!!!!! THE ERROR OCCURS ON THE NEXT LINE !!!!!!!!!!!!!!!!
.Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).Select ' Find the last used row in the table
If .Cells(.Rows.Count) < 103 Then GoTo Add_Record ' If the row number is less than 103 go to the Add_Record section otherwise add a new row and copy all formats and formulae
.Rows(Selection.Row).Insert Shift:=xlDown
With .Cells(.Rows.Count, "A").End(xlUp)
.EntireRow.Copy
With .Offset(1, 0).EntireRow
.PasteSpecial xlPasteFormats
.PasteSpecial xlPasteFormulas
On Error Resume Next
.SpecialCells(xlCellTypeConstants).ClearContents
On Error GoTo 0
End With
End With
End With
Next Sh ' Cycle through to the next worksheet in the array and repeat the 'add line' procedure
Add_Record: ' COPY NEW CHILD FROM FORM TO SPREADSHEET
Dim LR As Long
LR = Sheets("Pupil Data").Range("A" & Rows.Count).End(xlUp).Row
Set c = Range("A" & LR + 1)
With Me
c.Value = .TextBox14.Value
c.Offset(0, 1).Value = .TextBox1.Value
c.Offset(0, 2).Value = .TextBox2.Value
c.Offset(0, 3).Value = .TextBox3.Value
c.Offset(0, 4).Value = .TextBox4.Value
c.Offset(0, 5).Value = .TextBox24.Value
c.Offset(0, 7).Value = .TextBox25.Value
c.Offset(0, 8).Value = .TextBox26.Value
c.Offset(0, 9).Value = .TextBox5.Value
c.Offset(0, 11).Value = .TextBox27.Value
c.Offset(0, 12).Value = .TextBox28.Value
c.Offset(0, 13).Value = .TextBox29.Value
c.Offset(0, 14).Value = .TextBox30.Value
c.Offset(0, 15).Value = .TextBox34.Value
c.Offset(0, 16).Value = .TextBox31.Value
c.Offset(0, 17).Value = .TextBox32.Value
c.Offset(0, 18).Value = .TextBox33.Value
c.Offset(0, 21).Value = .TextBox35.Value
Call ClearControls
End With
' FILL EMPTY CHARACTERISTICS CELLS
Dim rCell As Range, _
rRng As Range
For Each rRng In ActiveSheet.[A4].Resize(ActiveSheet.UsedRange.Rows.Count - 2)
If IsEmpty(rRng) Then GoTo NextRow
For Each rCell In rRng.Offset(0, 7).Resize(1, 17)
If IsEmpty(rCell) Then rCell.Value = "N"
Next rCell
NextRow:
Next rRng
' SORT DATA TO INCLUDE NEW CHILD
Call ResortData
Application.ScreenUpdating = True
'ActiveSheet.Protect "L1lyL1ly", _ 'Remove the ' from the start of the line when password protected
'AllowFiltering:=True, _
'AllowSorting:=True, _
'AllowFormattingColumns:=True, _
'AllowFormattingRows:=True
End Sub