gpt4 book ai didi

vba - 如何解锁和锁定 Excel 单元格以运行宏

转载 作者:行者123 更新时间:2023-12-03 02:29:58 27 4
gpt4 key购买 nike

我有一个电子表格,有两个按钮 - 从数据库检索记录,另一个按钮用于将更改从 Excel 上传到数据库。从数据库检索记录的宏如下。现在,在检索记录后,我希望用户仅编辑某些列(此处为从一月到场景的列),以便用户在更新这些单元格后可以单击更新按钮将更改保存到数据库。但是,我不希望它们接触其他列(EmpID 到 Status)。我想要一个宏,该宏可以在数据检索后锁定这些列,并在单击“检索”按钮检索记录时解锁。这是因为每当我单击检索记录按钮时,我都会清除工作表。我尝试了几种方法,但都不起作用。我将不胜感激你的帮助。

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 中执行某些操作的最佳方法之一就是在打开宏记录器的情况下执行任务。这样您就会知道完成任务所需的基本代码。

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

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

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

可以根据您想要完成的操作更改或删除各种选项。

据我了解,您只想锁定某些列。在这种情况下,您实际上必须解锁允许他们进入的单元格 - 因此您必须向后考虑。

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

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

如果您还有其他问题,请留言。

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

关于vba - 如何解锁和锁定 Excel 单元格以运行宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44833422/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com