如何解锁和lockingExcel单元格以运行macros

我有一个电子表格有两个button – 从数据库检索logging和另一个从Excel中上传更改数据库。 从数据库检索logging的macros如下所示。 现在检索logging后,我希望用户只编辑某些列(这里是从1月到Scenario的列),以便用户在更新这些单元格之后可以单击更新button以将更改保存到数据库中。 但是,我不希望他们触及其他列(EmpID通过状态)。我想要一个macros,locking这些列后,数据检索和解锁,同时检索单击检索buttonlogging。 这是因为我正在清除工作表,每当我点击检索loggingbutton。 我尝试了几种方法,它不工作。 我将不胜感激您的帮助。

Public Sub RetrieveDBToWorkSheet() Dim sQry As String Dim iRows As Integer Dim iCols As Integer Dim SQL As String On Error GoTo ErrHandler 'Clear worksheet Call ClearExistingRows(4) 'Create ADODB Recordset for retrieved data Call DBConnection.OpenDBConnection 'Create Recordset Dim rsMY_Resources As ADODB.Recordset Set rsMY_Resources = New ADODB.Recordset SQL = "SELECT EmpID, EName, CCNum, CCName, ProgramNum, ProgramName, ResTypeNum, ResName, Status, January, February, March, April, May, June, July, August, September, October, November, December, Total_Year, Year, Scenario from Actual_FTE2" 'Query the database rsMY_Resources.Open SQL, DBConnection.oConn, adOpenStatic, adLockReadOnly If rsMY_Resources.EOF = True Then MsgBox ("No record found in database") Exit Sub End If 'Fill excel active sheet, starting from row# 3 iRows = 3 For iCols = 0 To rsMY_Resources.Fields.Count - 1 ActiveSheet.Cells(iRows, iCols + 1).Value = rsMY_Resources.Fields(iCols).Name Next ActiveSheet.Range(ActiveSheet.Cells(iRows, 1), ActiveSheet.Cells(iRows, rsMY_Resources.Fields.Count)).Font.Bold = True iRows = iRows + 1 ActiveSheet.Range("A" + CStr(iRows)).CopyFromRecordset rsMY_Resources iRows = rsMY_Resources.RecordCount 'Clean up rsMY_Resources.Close: Set rsMY_Resources = Nothing Call DBConnection.CloseDBConnection MsgBox (CStr(iRows) + " records have been retrieved from the database!") Exit Sub ErrHandler: MsgBox (Error) End Sub Public Sub ClearExistingRows(lRowStart As Long) Dim lLastRow As Long Dim iLastCol As Integer If (Not (Cells.Find("*", Range("A1"), xlFormulas, , xlByRows, xlPrevious) Is Nothing)) Then lLastRow = Cells.Find("*", Range("A1"), xlFormulas, , xlByRows,xlPrevious).Row ' Find the last row with data If (lLastRow >= lRowStart) Then iLastCol = Cells.Find("*", Range("A1"), xlFormulas, , xlByColumns, xlPrevious).Column ' Find the last column with data Range(Cells(lRowStart, 1), Cells(lLastRow, iLastCol)).Select Selection.EntireRow.Delete End If End If End Sub 

谢谢,赫马

学习如何在VBA中执行某些操作的最好方法之一就是使用macroslogging器执行任务。 这样你就会知道完成任务所需的基本代码。

这也有助于理解所有单元格都以“locking”属性开始,但只有在使用“ 审阅”>“保护工作表”选项对“工作簿”进行保护时才有用。

因此,为了确保在数据更改后没有人能够更改书中的所有单元格,您需要使用以下方法保护工作簿:

 ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True 

各种选项可以改变或删除,取决于你想要做什么。

据我所知,你只需要locking某些列。 在这种情况下,你实际上必须解开你允许他们进入的单元格 – 所以你必须反思。

这行代码会将单元格C1:C1000的locking属性设置为False,以便当工作簿被保护时,用户仍然可以编辑单元格:

 Range("C1:C1000").Locked = False 

如果您有任何其他问题,请发帖。

请参阅Microsoft文档: https : //msdn.microsoft.com/en-us/VBA/excel-vba/articles/range-locked-property-excel

你有没有试过activesheet.protect?

在脚本开始时,您将不得不添加以下内容来“解除”工作表。

  activesheet.unprotect 

然后脚本运行。 在你的子结尾首先定义你想让你的用户能够改变的列:(例如Colum B)

  Columns("B:B").Select Selection.Locked = False 

之后,保护表格

  activesheet.protect 

我认为它应该工作。

在你的:

 MsgBox (CStr(iRows) + " records have been retrieved from the database!") 

放置这个代码:

 Dim rngCol As Range ' Create a Range object Set rngCol = ActiveSheet.Range("A:Z") ' Select all columns on sheet rngCol.Locked = False ' Unlock all columns Set rngCol = ActiveSheet.Range("A:I") ' Now Select columns EmpID - Status rngCol.Locked = True ' Lock only those columns ActiveSheet.Protect ' Protect will now only protect the Locked columns 

当你进入你需要重写所有内容的过程时:

 Public Sub RetrieveDBToWorkSheet() 

放置此代码以解锁整个工作表:

 ActiveSheet.Unprotect ' This will unprotect the whole sheet 

您必须先记住解锁表格上的所有列。 如果你不这样做,那么保护会locking你所有的列(即使你特意“locking”了你想要的范围)。 这是不直观的,令许多优秀的用户感到困惑。