在使用VBA时,如何防止一张图纸上的更改影响第二张图纸中引用它们的单元格?

在使用VBA时,如何防止一张图纸上的更改影响第二张图纸中引用它们的单元格?,vba,excel,Vba,Excel,我有两张床单。第一个包含学生的评估分数。我叫它markbook。第二张表格对分数进行计算,并给出分数。我称之为报道 有很多类>30,所以有很多工作簿,以类代码SCI08A、SCI08B等命名 学生经常从一个班转到另一个班 我有一个宏,它可以将学生的详细信息和成绩从一个班级的记分簿复制到另一个班级的记分簿,由用户在表单中选择 然后,宏从“发件人”工作表中删除复制的行,尝试在末尾插入另一行以替换删除的行,并将“收件人”标记簿中的行按alpha顺序排序 用户在组合框中输入要移动的学生后,将执行以下代码

我有两张床单。第一个包含学生的评估分数。我叫它markbook。第二张表格对分数进行计算,并给出分数。我称之为报道

有很多类>30,所以有很多工作簿,以类代码SCI08A、SCI08B等命名

学生经常从一个班转到另一个班

我有一个宏,它可以将学生的详细信息和成绩从一个班级的记分簿复制到另一个班级的记分簿,由用户在表单中选择

然后,宏从“发件人”工作表中删除复制的行,尝试在末尾插入另一行以替换删除的行,并将“收件人”标记簿中的行按alpha顺序排序

用户在组合框中输入要移动的学生后,将执行以下代码:

Private Sub CboStudent_Change()
'Selects the rows to copy once the student has been selected

'Checks the to field is populated
If CboClassTo.Text = "" Then
    MsgBox "Please select a markbook to move the student to", vbExclamation + vbOKOnly, "No markbook selected"
    Exit Sub
End If


'Declare the variables
Dim wbTo As Workbook
Dim wbFr As Workbook
Dim ws As Worksheet
Dim EQID As Range
Dim SrcRow As Integer
Dim DestRow As Integer
Dim SrcRowRep As Integer


'Hide the screen
ScreenUpdating = True

'Open the to workbook
    Workbooks.Open Filename:= _
        ActiveWorkbook.Path & "\" & Me.CboClassTo.Text & ".xlsx" _
        , UpdateLinks:=0
    Set wbTo = ActiveWorkbook
    wbTo.Sheets("Markbook").Unprotect "Science2014"
    wbTo.Sheets("Reporting").Unprotect "Science2014"
    DestRow = Sheets("Markbook").Range("A5").End(xlDown).Offset(1, 0).Row

'Open the from workbook
    Workbooks.Open Filename:= _
        ActiveWorkbook.Path & "\" & CboClassFrom.Text & ".xlsx" _
        , UpdateLinks:=0
    Set wbFr = ActiveWorkbook
    wbFr.Sheets("Markbook").Unprotect "Science2014"
    wbFr.Sheets("Reporting").Unprotect "Science2014"

'Find the row to copy
SrcRow = CboStudent.ListIndex + 5
SrcRowRep = SrcRow - 3

'Copy the selected students data
    Rows(SrcRow & ":" & SrcRow).Select
    Selection.Copy
    wbTo.Activate
    Range("A5").Select
    Selection.End(xlDown).Select
    ActiveSheet.Paste


'Delete the row in the from Markbook sheet
wbFr.Sheets("Markbook").Activate
Rows(SrcRow & ":" & SrcRow).Delete

'Protect reporting sheet in from sheet
wbFr.Sheets("Reporting").Protect "Science2014"

'Switch back to Markbook to add new line
wbFr.Sheets("Markbook").Activate


'Add a new line to replace the deleted one
Range(Range("A5").End(xlDown).Offset(1, 0).Row & ":" & Range("A5").End(xlDown).Offset(1, 0).Row).Select
    Application.CutCopyMode = False
    Selection.Copy
    Rows(Range("A5").End(xlDown).Offset(1, 0).Row & ":" & Range("A5").End(xlDown).Offset(1, 0).Row).Select
    Selection.Insert Shift:=xlDown


'Sort the destination sheet
wbTo.Activate
ActiveWorkbook.Worksheets("Markbook").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Markbook").Sort.SortFields.Add Key:=Range("C5:C" & DestRow - 1 _
        ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Markbook").Sort
        .SetRange Rows("5:" & DestRow - 1)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With



'Save, Protect and close
Application.CutCopyMode = False
wbTo.Sheets("Markbook").Protect "Science2014"
wbTo.Save
wbTo.Close
wbFr.Sheets("Markbook").Protect "Science2014"
wbFr.Save
wbFr.Close

ScreenUpdating = False

Unload Me

Set wbTo = Nothing
Set wbFr = Nothing
Set ws = Nothing
Set EQID = Nothing



End Sub
此过程会在“收件人”和“发件人”工作表中发送报告工作表。报告表包含对markbook表的引用

例如,报告中的学生姓名只是对markbook工作表中包含姓名的单元格的引用

包含对已删除行的引用的单元格返回ref!错误及其内容不再引用已删除的行,而是=Markbook!裁判

是否有一种方法可以保护工作表,以便无论引用的单元格发生了什么情况,都不会对公式进行更改

还是其他解决办法


先谢谢你

如果您只是清除内容而不是删除,会发生什么?我不清楚你希望得到什么结果。是否仍希望删除的学生数据显示在第一个报告表中?更一般地说,这种类型的设计将继续难以维持;我觉得它很脆弱。你最好使用一个数据库,或者一个大的工作表,在那里你可以在学生转学时更改他们的班号。为什么你要尝试在EXCEL VBA中构建一个关系数据库引擎?有许多现成的简单数据库产品,如MySQL、MS_ACCESS和SQL Server Express,它们已经做到了这一点,比您所希望的要强大得多。把你的数据放在数据库中,然后简单地在EXCEL工作簿中报告。教师需要能够从学校的网络上复制自己的课堂文件,这些文件不能在家中访问,然后放在笔记本电脑上带回家。他们需要能够在异地将自己的数据输入自己的文件中,然后返回学校,将自己的文件与更新数据的新文件一起复制回网络。我不知道有一个数据库解决方案是如此模块化。它不能基于网络,因为教育的隐私偏执,并且在微软产品之外,它必须是免费的。另外,老师不喜欢新的,管理员通常不大胆。不要这样做。试着说服他们雇佣专业人员来建立VPN和数据库解决方案。如果隐私是一个让webapp变得不合理的问题,那么将数据放在笔记本电脑中离开站点也是如此。ClearContents有帮助。我已经放弃了保护第二页上的公式不受第一页上更改的影响。我现在只是在移动后从VBA中重新编写它们,但我现在在排序第一页上的行时遇到了问题。我在列表的顶部有一个空行。是否可以将包含空格的一组行按升序排序,以便空格位于底部?